32 addStyleClass(
"AccountRegister" );
38 auto lw = setLayout( std::make_unique< Wt::WVBoxLayout >() );
43 m_toolBar = lw-> addWidget( std::make_unique< ToolBar >() );
48 m_tableView = lw-> addWidget( std::make_unique< GCW::Gui::TableView >(), 1 );
54 m_statusBar = lw-> addWidget( std::make_unique< StatusBar >() );
59 tableView()-> setSortingEnabled (
false );
61 tableView()-> setSelectionBehavior ( Wt::SelectionBehavior::Rows );
62 tableView()-> setSelectionMode ( Wt::SelectionMode::Single );
64 tableView()-> setEditTriggers ( Wt::EditTrigger::SingleClicked );
66 tableView()-> setEditOptions ( Wt::EditOption::MultipleEditors | Wt::EditOption::LeaveEditorsOpen );
73 tableView()-> setAttributeValue (
"oncontextmenu",
"event.cancelBubble=true;event.returnValue=false;return false;" );
74 tableView()-> mouseWentUp().connect(
this, &Widget::on_showPopup_triggered );
79 Editor::applyDelegates( tableView() );
81 tableView()-> headerClicked().connect( [=](
int col,
Wt::WMouseEvent event )
84 if( tableView()-> selectedIndexes().size() == 0 )
85 tableView()-> select( baseModel()-> index( 893, 0 ) );
87 tableView()-> clearSelection();
90 std::cout << __FILE__ <<
":" << __LINE__ <<
" headerClicked:" << col << std::endl;
114 selectionChanged().connect( [=]()
116 std::cout << __FILE__ <<
":" << __LINE__
117 <<
" selectionChanged"
122#ifdef KEYPRESSED_ONLY_FIRES_WHEN_EDITORS_ARE_NOT_OPEN_NOT_USEFUL_HERE
126 std::cout << __FILE__ <<
":" << __LINE__ <<
" " << _event.
charCode() << std::endl;
130 tableView()-> clicked().connect(
this, &Widget::on_tableView_clicked );
132 m_baseModel = std::make_shared< BaseModel >();
133 m_sortFilterModel = std::make_shared< Wt::WSortFilterProxyModel >();
257 if( askThisSession && askForever )
262 auto msgBox = addChild( std::make_unique< Wt::WDialog >(
TR(
"gcw.AccountRegister.delete.title") ) );
263 auto templt = msgBox-> contents()-> addNew< Wt::WTemplate >(
TR(
"gcw.AccountRegister.delete.contents") );
264 msgBox-> setClosable(
true );
265 msgBox-> setMovable (
true );
268 auto rememberAlways = templt-> bindNew< Wt::WCheckBox >(
"rememberAlways" ,
TR(
"gcw.AccountRegister.delete.rem1" ) );
269 auto rememberSession = templt-> bindNew< Wt::WCheckBox >(
"rememberSession",
TR(
"gcw.AccountRegister.delete.rem2" ) );
270 auto pbCancel = templt-> bindNew< Wt::WPushButton >(
"cancel" ,
TR(
"gcw.AccountRegister.delete.cancel") );
271 auto pbDelete = templt-> bindNew< Wt::WPushButton >(
"delete" ,
TR(
"gcw.AccountRegister.delete.delete") );
273 rememberAlways -> setToolTip(
TR(
"gcw.AccountRegister.delete.rem1.toolTip" ) );
274 rememberSession -> setToolTip(
TR(
"gcw.AccountRegister.delete.rem2.toolTip" ) );
275 pbCancel -> setToolTip(
TR(
"gcw.AccountRegister.delete.cancel.toolTip" ) );
276 pbDelete -> setToolTip(
TR(
"gcw.AccountRegister.delete.delete.toolTip" ) );
278 auto splitGuid = baseModel()-> getSplitGuid( m_rightClickIndex.row() );
280 transMan.loadSplit( splitGuid );
282 templt-> bindString(
"payFrom" , transMan.getFromAccount () );
283 templt-> bindString(
"payTo" , transMan.getToAccount () );
284 templt-> bindString(
"date" , transMan.getDateAsString () );
285 templt-> bindString(
"desc" , transMan.getDescription () );
286 templt-> bindString(
"amount" , transMan.getValueAsString() );
295 clicked().connect( [rememberSession,rememberAlways]()
297 rememberSession-> setDisabled( rememberAlways-> checkState() == Wt::CheckState::Checked );
306 finished().connect( [
this,rememberSession,msgBox](
Wt::DialogCode _code )
308 if( _code == Wt::DialogCode::Accepted )
312 deleteRow( m_rightClickIndex.row() );
315 removeChild( msgBox );
325 deleteRow( m_rightClickIndex.row() );
337 auto msgBox = addChild( std::make_unique< Wt::WDialog >(
TR(
"gcw.AccountRegister.details.title") ) );
339 auto detailWidget = msgBox-> contents()-> addNew< GCW::Gui::TransactionDetailWidget >();
340 msgBox-> setClosable(
true );
341 msgBox-> rejectWhenEscapePressed();
342 msgBox-> setMovable (
true );
345 auto splitGuid = baseModel()-> getSplitGuid( m_rightClickIndex.row() );
346 detailWidget-> setSplitGuid( splitGuid );
351 msgBox-> contents()-> addNew< Wt::WPushButton >(
TR(
"gcw.ok") )->
352 clicked().connect( [
this,msgBox,detailWidget]()
354 detailWidget-> saveData();
355 msgBox-> done( Wt::DialogCode::Accepted );
365 removeChild( msgBox );
499 if( _event.button() != Wt::MouseButton::Right )
505 m_rightClickIndex = _index;
517 while( m_popupMenu.count() )
518 m_popupMenu.removeItem( m_popupMenu.itemAt(0) );
521 m_popupMenu.addItem(
TR(
"gcw.AccountRegister.Popup.SortBy" ), std::make_unique< Wt::WText >() )-> setDisabled(
true );
522 m_popupMenu.addItem(
TR(
"gcw.AccountRegister.Popup.FilterBy" ), std::make_unique< Wt::WText >() )-> setDisabled(
true );
523 m_popupMenu.addItem(
TR(
"gcw.AccountRegister.Popup.RenamePage" ), std::make_unique< Wt::WText >() )-> setDisabled(
true );
524 m_popupMenu.addSeparator();
525 m_popupMenu.addItem(
TR(
"gcw.AccountRegister.Popup.Duplicate" ), std::make_unique< Wt::WText >() )-> setDisabled(
true );
535 if( !(baseModel()-> isDeletable( _index )) )
536 item-> setDisabled(
true );
545 m_popupMenu.addItem(
TR(
"gcw.AccountRegister.Popup.RemoveSplits" ), std::make_unique< Wt::WText >() )-> setDisabled(
true );
546 m_popupMenu.addSeparator();
547 m_popupMenu.addItem(
TR(
"gcw.AccountRegister.Popup.Enter" ), std::make_unique< Wt::WText >() )-> setDisabled(
true );
548 m_popupMenu.addItem(
TR(
"gcw.AccountRegister.Popup.Cancel" ), std::make_unique< Wt::WText >() )-> setDisabled(
true );
549 m_popupMenu.addSeparator();
550 m_popupMenu.addItem(
TR(
"gcw.AccountRegister.Popup.ManageDocument" ), std::make_unique< Wt::WText >() )-> setDisabled(
true );
551 m_popupMenu.addItem(
TR(
"gcw.AccountRegister.Popup.OpenDocument" ), std::make_unique< Wt::WText >() )-> setDisabled(
true );
554 m_popupMenu.addSeparator();
565 TR(
"gcw.AccountRegister.Popup.Jump" ),
570 if( !(baseModel()-> isJumpable( _index )) )
571 item-> setDisabled(
true );
589 m_popupMenu.addSeparator();
590 m_popupMenu.addItem(
TR(
"gcw.AccountRegister.Popup.BlankTransaction" ), std::make_unique< Wt::WText >() )-> setDisabled(
true );
591 m_popupMenu.addItem(
TR(
"gcw.AccountRegister.Popup.GoDate" ), std::make_unique< Wt::WText >() )-> setDisabled(
true );
592 m_popupMenu.addItem(
TR(
"gcw.AccountRegister.Popup.SplitTransaction" ), std::make_unique< Wt::WText >() )-> setDisabled(
true );
593 m_popupMenu.addItem(
TR(
"gcw.AccountRegister.Popup.EditExchangeRate" ), std::make_unique< Wt::WText >() )-> setDisabled(
true );
594 m_popupMenu.addItem(
TR(
"gcw.AccountRegister.Popup.Schedule" ), std::make_unique< Wt::WText >() )-> setDisabled(
true );
595 m_popupMenu.addItem(
TR(
"gcw.AccountRegister.Popup.Jump" ), std::make_unique< Wt::WText >() )-> setDisabled(
true );
596 m_popupMenu.addSeparator();
597 m_popupMenu.addItem(
TR(
"gcw.AccountRegister.Popup.AssignPayment" ), std::make_unique< Wt::WText >() )-> setDisabled(
true );
601 if( !tableView()-> isSelected( _index ) )
603 tableView()-> select( _index, Wt::SelectionFlag::ClearAndSelect );
607 if( m_popupMenu.isHidden() )
609 m_popupMenu.popup( _event );
668 tableView()-> setHeaderAlignment(
asInt(
Col::DATE ), Wt::AlignmentFlag::Right );
669 tableView()-> setColumnAlignment(
asInt(
Col::DATE ), Wt::AlignmentFlag::Right );
673 tableView()-> setHeaderAlignment(
asInt(
Col::ACTION ), Wt::AlignmentFlag::Center );
674 tableView()-> setColumnAlignment(
asInt(
Col::ACTION ), Wt::AlignmentFlag::Center );
693 tableView()-> setHeaderAlignment(
asInt(
Col::DEBIT ), Wt::AlignmentFlag::Right );
694 tableView()-> setColumnAlignment(
asInt(
Col::DEBIT ), Wt::AlignmentFlag::Right );
698 tableView()-> setHeaderAlignment(
asInt(
Col::CREDIT ), Wt::AlignmentFlag::Right );
699 tableView()-> setColumnAlignment(
asInt(
Col::CREDIT ), Wt::AlignmentFlag::Right );
703 tableView()-> setHeaderAlignment(
asInt(
Col::BALANCE ), Wt::AlignmentFlag::Right );
704 tableView()-> setColumnAlignment(
asInt(
Col::BALANCE ), Wt::AlignmentFlag::Right );
706 statusBar()-> setPresent ( baseModel()-> present () );
707 statusBar()-> setProjected ( baseModel()-> projected () );
708 statusBar()-> setReconciled ( baseModel()-> reconciled () );
709 statusBar()-> setFuture ( baseModel()-> future () );
710 statusBar()-> setCleared ( baseModel()-> cleared () );
711 statusBar()-> setRowCount ( baseModel()-> splitCount () );
731 if( m_selectIndex.isValid() )
732 if( m_selectIndex.row() == _index.row() )
735 m_selectIndex = _index;
738 std::cout << __FILE__ <<
":" << __LINE__
739 <<
" " << __FUNCTION__ <<
"(" << _index.row() <<
")"
740 <<
" isR/O:" << baseModel()-> isReadOnly( _index.row() )
741 <<
" i(" << _index.row() <<
"," << _index.column() <<
")"
742 <<
" si(" << m_selectIndex.row() <<
"," << m_selectIndex.column() <<
")"
744 wApp-> processEvents();
747 tableView()-> closeEditors(
true );
748 tableView()-> scrollTo( _index );
749 tableView()-> select( _index, Wt::SelectionFlag::ClearAndSelect );
751 if( !baseModel()-> isReadOnly( _index.row() ) )