1 #line 2 "src/Gui/TableView.cpp"
3 #include <Wt/WMessageBox.h>
4 #include <Wt/WStandardItem.h>
5 #include <Wt/WStandardItemModel.h>
7 #include "../Glb/gcwglobal.h"
8 #include "../GnuCashew.h"
19 static auto keyToCode( Wt::Key _key )-> std::string
21 std::map< Wt::Key, std::string > keyMap =
23 { Wt::Key::Unknown ,
"Unknown" },
24 { Wt::Key::Enter ,
"Enter" },
25 { Wt::Key::Tab ,
"Tab" },
26 { Wt::Key::Backspace ,
"Backspace" },
27 { Wt::Key::Shift ,
"Shift" },
28 { Wt::Key::Control ,
"Control" },
29 { Wt::Key::Alt ,
"Alt" },
30 { Wt::Key::PageUp ,
"Page up" },
31 { Wt::Key::PageDown ,
"Page down" },
32 { Wt::Key::End ,
"End" },
33 { Wt::Key::Home ,
"Home" },
34 { Wt::Key::Left ,
"Left" },
35 { Wt::Key::Up ,
"Up" },
36 { Wt::Key::Right ,
"Right" },
37 { Wt::Key::Down ,
"Down" },
38 { Wt::Key::Insert ,
"Insert" },
39 { Wt::Key::Delete ,
"Delete" },
40 { Wt::Key::Escape ,
"Escape" },
41 { Wt::Key::F1 ,
"F1" },
42 { Wt::Key::F2 ,
"F2" },
43 { Wt::Key::F3 ,
"F3" },
44 { Wt::Key::F4 ,
"F4" },
45 { Wt::Key::F5 ,
"F5" },
46 { Wt::Key::F6 ,
"F6" },
47 { Wt::Key::F7 ,
"F7" },
48 { Wt::Key::F8 ,
"F8" },
49 { Wt::Key::F9 ,
"F9" },
50 { Wt::Key::F10 ,
"F10" },
51 { Wt::Key::F11 ,
"F11" },
52 { Wt::Key::F12 ,
"F12" },
53 { Wt::Key::Space ,
"Space" },
54 { Wt::Key::A ,
"'A'" },
55 { Wt::Key::B ,
"'B'" },
56 { Wt::Key::C ,
"'C'" },
57 { Wt::Key::D ,
"'D'" },
58 { Wt::Key::E ,
"'E'" },
59 { Wt::Key::F ,
"'F'" },
60 { Wt::Key::G ,
"'G'" },
61 { Wt::Key::H ,
"'H'" },
62 { Wt::Key::I ,
"'I'" },
63 { Wt::Key::J ,
"'J'" },
64 { Wt::Key::K ,
"'K'" },
65 { Wt::Key::L ,
"'L'" },
66 { Wt::Key::M ,
"'M'" },
67 { Wt::Key::N ,
"'N'" },
68 { Wt::Key::O ,
"'O'" },
69 { Wt::Key::P ,
"'P'" },
70 { Wt::Key::Q ,
"'Q'" },
71 { Wt::Key::R ,
"'R'" },
72 { Wt::Key::S ,
"'S'" },
73 { Wt::Key::T ,
"'T'" },
74 { Wt::Key::U ,
"'U'" },
75 { Wt::Key::V ,
"'V'" },
76 { Wt::Key::W ,
"'W'" },
77 { Wt::Key::X ,
"'X'" },
78 { Wt::Key::Y ,
"'Y'" },
79 { Wt::Key::Z ,
"'Z'" },
80 { Wt::Key::Key_1 ,
"'1'" },
81 { Wt::Key::Key_2 ,
"'2'" },
82 { Wt::Key::Key_3 ,
"'3'" },
83 { Wt::Key::Key_4 ,
"'4'" },
84 { Wt::Key::Key_5 ,
"'5'" },
85 { Wt::Key::Key_6 ,
"'6'" },
86 { Wt::Key::Key_7 ,
"'7'" },
87 { Wt::Key::Key_8 ,
"'8'" },
88 { Wt::Key::Key_9 ,
"'9'" },
89 { Wt::Key::Key_0 ,
"'0'" }
103 addStyleClass(
"Gcw-TableView" );
116 "event.cancelBubble = true; event.returnValue = false; return false;"
123 setLayoutSizeAware(
true );
127 .connect( [=]( Wt::WModelIndex _index, Wt::WMouseEvent _event )
129 std::cout << __FILE__ <<
":" << __LINE__ <<
" clicked row: " << _index.row() <<
" col: " << _index.column() << std::endl;
133 .connect( [=]( Wt::WModelIndex _index, Wt::WMouseEvent _event )
135 std::cout << __FILE__ <<
":" << __LINE__ <<
" doubleClicked row: " << _index.row() <<
" col: " << _index.column() << std::endl;
140 .connect( [=]( Wt::WModelIndex _index, Wt::WMouseEvent _event )
142 std::cout << __FILE__ <<
":" << __LINE__ <<
" mouseWentDown row: " << _index.row() <<
" col: " << _index.column() << std::endl;
146 .connect( [=]( Wt::WModelIndex _index, Wt::WMouseEvent _event )
148 std::cout << __FILE__ <<
":" << __LINE__ <<
" mouseWentUp row: " << _index.row() <<
" col: " << _index.column() << std::endl;
152 .connect( [=]( Wt::WModelIndex _index, Wt::WTouchEvent _event )
154 std::cout << __FILE__ <<
":" << __LINE__ <<
" touchStart row: " << _index.row() <<
" col: " << _index.column() << std::endl;
178 std::cout << __FILE__ <<
":" << __LINE__ <<
" selectionChanged: " << std::endl;
184 std::cout << __FILE__ <<
":" << __LINE__ <<
" pageChanged: " << std::endl;
188 .connect( [=](
int, Wt::WLength)
190 std::cout << __FILE__ <<
":" << __LINE__ <<
" pageChanged: " << std::endl;
195 .connect( [=](
int, Wt::WMouseEvent)
197 std::cout << __FILE__ <<
":" << __LINE__ <<
" headerClicked: " << std::endl;
201 headerDoubleClicked ()
202 .connect( [=](
int, Wt::WMouseEvent )
204 std::cout << __FILE__ <<
":" << __LINE__ <<
" headerDoubleClicked: " << std::endl;
208 headerMouseWentDown ()
209 .connect( [=](
int, Wt::WMouseEvent )
211 std::cout << __FILE__ <<
":" << __LINE__ <<
" headerMouseWentDown: " << std::endl;
216 .connect( [=](
int, Wt::WMouseEvent )
218 std::cout << __FILE__ <<
":" << __LINE__ <<
" headerMouseWentUp: " << std::endl;
223 .connect( [=]( Wt::WScrollEvent _event )
225 std::cout << __FILE__ <<
":" << __LINE__ <<
" scrolled"
226 <<
" x:" << _event.scrollX()
227 <<
" y:" << _event.scrollY()
228 <<
" w:" << _event.viewportWidth()
229 <<
" h:" << _event.viewportHeight()
236 .connect( [=]( Wt::WKeyEvent _event )
238 std::cout << __FILE__ <<
":" << __LINE__ <<
" keyWentDown: " << _event.charCode() <<
" key:" << keyToCode( _event.key() ) << std::endl;
243 .connect( [=]( Wt::WKeyEvent _event )
245 std::cout << __FILE__ <<
":" << __LINE__ <<
" keyPressed: " << _event.charCode() <<
" key:" << keyToCode( _event.key() ) << std::endl;
249 .connect( [=]( Wt::WKeyEvent _event )
251 std::cout << __FILE__ <<
":" << __LINE__ <<
" keyWentUp charCode:" << _event.charCode() <<
" key:" << keyToCode( _event.key() ) << std::endl;
268 for(
auto col : widths_ )
269 if( col.second.unit() == Wt::LengthUnit::Percentage )
272 auto percent_sum=0.0;
273 for(
auto col : widths_)
275 if( col.second.unit() != Wt::LengthUnit::Percentage )
276 fixed += col.second.toPixels();
278 percent_sum += col.second.value();
284 const auto epsilon = 0.5;
285 if( 100.0 - percent_sum > epsilon )
287 <<
"Warning: Relative column widths do not take up 100% of the available width"
294 nfixed = model()->columnCount() - nrel;
297 bool show_scroll = visible_rows_ > 0 && model()->rowCount() > visible_rows_;
299 auto remainder = width - ( fixed + ( kTableCellPadding * model()->columnCount() ) + ( show_scroll ? kScrollBarWidth : 0.0 ) );
301 for(
auto col : widths_)
302 if( col.second.unit() == Wt::LengthUnit::Percentage )
308 col.second.value()/100.0*remainder,
309 Wt::LengthUnit::Pixel
316 Wt::WTableView::layoutSizeChanged( width, height );
324 widths_.emplace( column, width );
326 Wt::WTableView::setColumnWidth( column, width );
352 GCW::Gui::TableView::
353 handleClick(
const Wt::WModelIndex & _index,
const Wt::WMouseEvent & _event )
356 std::cout << __FILE__ <<
":" << __LINE__
357 <<
" handleClick:<start>"
358 <<
" row:" << _index.row()
359 <<
" col:" << _index.column()
365 if( selectedIndexes().size() > 0 )
367 auto selectedIndex = *selectedIndexes().begin();
370 std::cout << __FILE__ <<
":" << __LINE__
371 <<
" selected:" << selectedIndexes().size()
372 <<
" row:" << selectedIndex.row()
373 <<
" col:" << selectedIndex.column()
388 if( selectedIndex.row () != _index.row ()
389 && selectedIndex.column () != _index.column ()
402 auto m =
dynamic_cast< Wt::WStandardItemModel*
>( model().get() );
404 auto row = _index.row();
405 for(
int column = 0; column< m-> columnCount(); column++ )
407 std::cout << __FILE__ <<
":" << __LINE__
412 auto index = m-> index( row, column );
413 auto item = m-> itemFromIndex( index );
415 item-> setFlags( Wt::ItemFlag::Editable );
430 if( selectedIndexes().size() )
432 auto oldIndex = *selectedIndexes().begin();
434 std::cout << __FILE__ <<
":" << __LINE__ <<
" handleCLick()"
435 <<
" old:" << oldIndex.row()
436 <<
" new:" << _index.row()
439 if( _index.row() != oldIndex.row() )
442 closeEditors(
true );
452 Wt::WTableView::handleClick( _index, _event );
455 std::cout << __FILE__ <<
":" << __LINE__ <<
" handleClick:<end>" << std::endl;
463 GCW::Gui::TableView::
464 handleDoubleClick(
const Wt::WModelIndex & _index,
const Wt::WMouseEvent & _event )
467 std::cout << __FILE__ <<
":" << __LINE__
468 <<
" handleDoubleClick:<start>"
469 <<
" row:" << _index.row()
470 <<
" col:" << _index.column()
475 Wt::WTableView::handleDoubleClick( _index, _event );
478 std::cout << __FILE__ <<
":" << __LINE__ <<
" handleDoubleClick:<end>" << std::endl;
487 handleMouseDown(
const Wt::WModelIndex & _index,
const Wt::WMouseEvent & _event )
496 <<
" row:" << _index.row()
497 <<
" col:" << _index.column()
503 if( m_lastIndexClick.isValid() )
504 if( m_lastIndexClick. row () != _index. row ()
505 || m_lastIndexClick. column () != _index. column ()
514 auto balanceIndex = model()-> index( _index.row(), 7 );
516 std::cout << __FILE__ <<
":" << __LINE__ <<
" " <<balanceIndex.data( Wt::ItemDataRole::User ).type().name() << std::endl;
518 auto balanceValue = Wt::cpp17::any_cast< GCW_NUMERIC >( balanceIndex.data( Wt::ItemDataRole::User ) );
519 std::cout << __FILE__ <<
":" << __LINE__ <<
" " << balanceValue << std::endl;
522 Wt::WTableView::handleMouseDown( _index, _event );
532 m_lastIndexClick = _index;
539 GCW::Gui::TableView::
540 handleMouseUp(
const Wt::WModelIndex & _index,
const Wt::WMouseEvent & _event )
543 std::cout << __FILE__ <<
":" << __LINE__
544 <<
" handleMouseUp:<start>"
545 <<
" row:" << _index.row()
546 <<
" col:" << _index.column()
551 Wt::WTableView::handleMouseUp( _index, _event );
554 std::cout << __FILE__ <<
":" << __LINE__ <<
" handleMouseUp:<end>" << std::endl;
static const int kTableBodyRowHeight
static const int kTableHeaderRowHeight
static const int kScrollBarWidth
auto layoutSizeChanged(int width, int height) -> void override
auto handleMouseDown(const Wt::WModelIndex &_index, const Wt::WMouseEvent &_event) -> void
Handle Click Event.
static const int kTableCellPadding
auto setColumnWidth(int column, const Wt::WLength &width) -> void override
static const int kDefaultDateTimeWidth