Wtx ~ Wt Extension Library
WtxLib
LookupItemDelegate.h
1 
2 #ifndef __WTX_DBO_LOOKUPITEMDELEGATE_H___
3 #define __WTX_DBO_LOOKUPITEMDELEGATE_H___
4 
5 #include <Wt/WItemDelegate.h>
6 #include <Wt/WText.h>
7 #include <Wt/Dbo/Transaction.h>
8 #include <Wt/WString.h>
9 #include <Wt/WModelIndex.h>
10 #include <Wt/WAbstractItemModel.h>
11 
12 namespace Wtx {
13  namespace Dbo {
14 
15 class Session;
16 
24 template <class C> class LookupItemDelegate
25 : public Wt::WItemDelegate
26 {
27  public:
28 
29  enum Options
30  {
31  NoOptions,
32  NoCfy
33  };
34 
35  Options m_options = NoOptions;
36 
37  LookupItemDelegate( Options options, Wtx::Dbo::Session * s )
38  : m_session(s)
39  {
40  m_options = options;
41  }
42 
43  virtual std::unique_ptr<Wt::WWidget> update( Wt::WWidget * widget, const Wt::WModelIndex & index, Wt::WFlags< Wt::ViewItemRenderFlag > flags )
44  {
45  auto w = Wt::WItemDelegate::update( widget, index, flags );
46 
47  Wt::WText * text = static_cast<Wt::WText *>(w.get());
48 
49  if( text )
50  {
51  int id = Wt::asNumber( index.model()-> data( index.row(), index.column() ) );
52 
53  if( id > 0 )
54  {
55  Wt::Dbo::Transaction t(*session());
56 
57  std::string filter =
58  Wt::WString("SELECT COUNT(1) FROM \"{1}\" WHERE id = {2}")
59  .arg( std::string(C::TableDef().tableName()) )
60  .arg( id )
61  .toUTF8()
62  ;
63 
64  int totalRows =
65  session()->
66  template query<int>( filter );
67 
68  if( totalRows > 0 )
69  {
70  auto item = session()-> template load<C>(id);
71 
72  auto textValue =
73  Wt::WString("{1}").arg( item-> keyField().value() );
74 
75  if( m_options != NoCfy )
76  if( item-> cfyField().value() != "" )
77  textValue +=
78  Wt::WString("~{1}").arg( item-> cfyField().value() );
79 
80  text-> setText( textValue );
81  }
82  else // if( totalRows not > 0 )
83  {
84  text-> setText( Wt::WString("not found: {1}").arg(id) );
85  }
86 
87  }
88  else // if( id not > 0 )
89  {
90  text-> setText( "~ ~ ~" );
91  }
92 
93  } // endif( text )
94 
95  return std::move(w);
96  }
97 
98  static Wt::WItemDelegate * create( Wtx::Dbo::Session * s )
99  {
100  return new LookupItemDelegate<C>( NoOptions, s );
101  }
102 
103  static Wt::WItemDelegate * create_nocfy( Wtx::Dbo::Session * s )
104  {
105  return new LookupItemDelegate<C>( NoCfy, s );
106  }
107 
108  Wtx::Dbo::Session * session() { return m_session; }
109 
110  Wtx::Dbo::Session * m_session;
111 
112 }; // endtemplate <class C> class LookupItemDelegate
113 
114  } // endnamespace Dbo
115 } //endnamespace Wtx
116 
117 #endif // #ifndef __WTX_DBO_LOOKUPITEMDELEGATE_H___
118 
Lookup Item Delegate.
witty extension library
Definition: Activity.h:51