author | zecke <zecke> | 2002-10-07 11:39:30 (UTC) |
---|---|---|
committer | zecke <zecke> | 2002-10-07 11:39:30 (UTC) |
commit | f11d4bda64b58abfebf77485d5d77143a10dc8c9 (patch) (unidiff) | |
tree | a4e80550c4abe867303553de608316941dd943f1 /core/pim/todo/tableview.cpp | |
parent | c2cd5470fa3ec69394fa65ad16ab29a6cadab56f (diff) | |
download | opie-f11d4bda64b58abfebf77485d5d77143a10dc8c9.zip opie-f11d4bda64b58abfebf77485d5d77143a10dc8c9.tar.gz opie-f11d4bda64b58abfebf77485d5d77143a10dc8c9.tar.bz2 |
Re add files
for todo
-rw-r--r-- | core/pim/todo/tableview.cpp | 362 |
1 files changed, 362 insertions, 0 deletions
diff --git a/core/pim/todo/tableview.cpp b/core/pim/todo/tableview.cpp new file mode 100644 index 0000000..39f0d72 --- a/dev/null +++ b/core/pim/todo/tableview.cpp | |||
@@ -0,0 +1,362 @@ | |||
1 | /* | ||
2 | =. This file is part of the OPIE Project | ||
3 | .=l. Copyright (c) 2002 <> | ||
4 | .>+-= | ||
5 | _;:, .> :=|. This program is free software; you can | ||
6 | .> <`_, > . <= redistribute it and/or modify it under | ||
7 | :`=1 )Y*s>-.-- : the terms of the GNU General Public | ||
8 | .="- .-=="i, .._ License as published by the Free Software | ||
9 | - . .-<_> .<> Foundation; either version 2 of the License, | ||
10 | ._= =} : or (at your option) any later version. | ||
11 | .%`+i> _;_. | ||
12 | .i_,=:_. -<s. This program is distributed in the hope that | ||
13 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | ||
14 | : .. .:, . . . without even the implied warranty of | ||
15 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | ||
16 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | ||
17 | ..}^=.= = ; Library General Public License for more | ||
18 | ++= -. .` .: details. | ||
19 | : = ...= . :.=- | ||
20 | -. .:....=;==+<; You should have received a copy of the GNU | ||
21 | -_. . . )=. = Library General Public License along with | ||
22 | -- :-=` this library; see the file COPYING.LIB. | ||
23 | If not, write to the Free Software Foundation, | ||
24 | Inc., 59 Temple Place - Suite 330, | ||
25 | Boston, MA 02111-1307, USA. | ||
26 | |||
27 | */ | ||
28 | |||
29 | #include <qtimer.h> | ||
30 | #include <qpoint.h> | ||
31 | #include <qpopupmenu.h> | ||
32 | |||
33 | #include "mainwindow.h" | ||
34 | //#include "tableitems.h" | ||
35 | #include "tableview.h" | ||
36 | |||
37 | using namespace Todo; | ||
38 | |||
39 | |||
40 | TableView::TableView( MainWindow* window, QWidget* wid ) | ||
41 | : QTable( wid ), TodoView( window ) { | ||
42 | setUpdatesEnabled( false ); | ||
43 | viewport()->setUpdatesEnabled( false ); | ||
44 | m_enablePaint = false; | ||
45 | setNumRows(0); | ||
46 | setNumCols(4); | ||
47 | |||
48 | setSorting( TRUE ); | ||
49 | setSelectionMode( NoSelection ); | ||
50 | setColumnStretchable( 2, TRUE ); | ||
51 | setColumnWidth(0, 20 ); | ||
52 | setColumnWidth(1, 35 ); | ||
53 | |||
54 | setLeftMargin( 0 ); | ||
55 | verticalHeader()->hide(); | ||
56 | |||
57 | horizontalHeader()->setLabel(0, tr("C.") ); | ||
58 | horizontalHeader()->setLabel(1, tr("Prior.") ); | ||
59 | horizontalHeader()->setLabel(2, tr("Description" ) ); | ||
60 | |||
61 | setColumnStretchable(3, FALSE ); | ||
62 | setColumnWidth(3, 20 ); | ||
63 | horizontalHeader()->setLabel(3, tr("Deadline") ); | ||
64 | |||
65 | if ( todoWindow()->showDeadline() ) | ||
66 | showColumn( 3); | ||
67 | else | ||
68 | hideColumn(3 ); | ||
69 | |||
70 | connect((QTable*)this, SIGNAL( clicked( int, int, int, const QPoint& ) ), | ||
71 | this, SLOT( slotClicked(int, int, int, const QPoint& ) ) ); | ||
72 | connect((QTable*)this, SIGNAL( pressed( int, int, int, const QPoint& ) ), | ||
73 | this, SLOT( slotPressed(int, int, int, const QPoint& ) ) ); | ||
74 | connect((QTable*)this, SIGNAL(valueChanged(int, int) ), | ||
75 | this, SLOT( slotValueChanged(int, int) ) ); | ||
76 | connect((QTable*)this, SIGNAL(currentChanged(int, int) ), | ||
77 | this, SLOT( slotCurrentChanged(int, int) ) ); | ||
78 | |||
79 | m_menuTimer = new QTimer( this ); | ||
80 | connect( m_menuTimer, SIGNAL(timeout()), | ||
81 | this, SLOT(slotShowMenu()) ); | ||
82 | |||
83 | m_enablePaint = true; | ||
84 | setUpdatesEnabled( true ); | ||
85 | viewport()->setUpdatesEnabled( true ); | ||
86 | viewport()->update(); | ||
87 | } | ||
88 | /* a new day has started | ||
89 | * update the day | ||
90 | */ | ||
91 | void TableView::newDay() { | ||
92 | clear(); | ||
93 | setTodos( begin(),end() ); | ||
94 | } | ||
95 | TableView::~TableView() { | ||
96 | |||
97 | } | ||
98 | void TableView::slotShowMenu() { | ||
99 | QPopupMenu *menu = todoWindow()->contextMenu( current() ); | ||
100 | menu->exec(QCursor::pos() ); | ||
101 | delete menu; | ||
102 | } | ||
103 | OTodo TableView::find(int uid ) { | ||
104 | OTodo ev = TodoView::event( uid ); | ||
105 | return ev; | ||
106 | } | ||
107 | void TableView::updateFromTable( const OTodo& ev, CheckItem* item ) { | ||
108 | TodoView::update( ev.uid(), ev ); | ||
109 | |||
110 | /* update the other columns */ | ||
111 | /* if completed or not we need to update | ||
112 | * the table | ||
113 | * | ||
114 | * We've two cases | ||
115 | * either item or !item | ||
116 | * this makes cases more easy | ||
117 | */ | ||
118 | if ( !item ) { | ||
119 | item = m_cache[ev.uid()]; | ||
120 | } | ||
121 | DueTextItem *due = dueItem( item->row() ); | ||
122 | due->setCompleted( ev.isCompleted() ); | ||
123 | } | ||
124 | QString TableView::type() const { | ||
125 | return QString::fromLatin1( tr("Table View") ); | ||
126 | } | ||
127 | int TableView::current() { | ||
128 | int cur = 0; | ||
129 | CheckItem* i = checkItem( currentRow() ); | ||
130 | if (i ) | ||
131 | cur = i->uid(); | ||
132 | |||
133 | return cur; | ||
134 | } | ||
135 | QString TableView::currentRepresentation() { | ||
136 | return text( currentRow(), 2); | ||
137 | } | ||
138 | /* show overdue */ | ||
139 | void TableView::showOverDue( bool ) { | ||
140 | clear(); | ||
141 | setTodos( begin(), end() ); | ||
142 | } | ||
143 | |||
144 | void TableView::setTodos( OTodoAccess::List::Iterator it, | ||
145 | OTodoAccess::List::Iterator end ) { | ||
146 | qWarning("setTodos"); | ||
147 | QTime time; | ||
148 | time.start(); | ||
149 | m_enablePaint = false; | ||
150 | setUpdatesEnabled( false ); | ||
151 | viewport()->setUpdatesEnabled( false ); | ||
152 | clear(); | ||
153 | QString currentCat = todoWindow()->currentCategory(); | ||
154 | bool showCompleted = todoWindow()->currentCatId(); | ||
155 | bool showOverDue = todoWindow()->showOverDue(); | ||
156 | qWarning( "Current Category:" + todoWindow()->currentCategory() ); | ||
157 | int id = todoWindow()->currentCatId(); | ||
158 | QTime t; | ||
159 | t.start(); | ||
160 | setNumRows( it.count() ); | ||
161 | uint i = 0; | ||
162 | for (; it != end; ++it ) { | ||
163 | OTodo todo = (*it); | ||
164 | /* test if the categories match */ | ||
165 | if ( !currentCat.isEmpty() && | ||
166 | !todo.categories().contains( id ) ) { | ||
167 | continue; | ||
168 | } | ||
169 | /* the item is completed but we shouldn't show it */ | ||
170 | if ( !showCompleted && todo.isCompleted() ) { | ||
171 | continue; | ||
172 | } | ||
173 | /* the item is not overdue but we should only show overdue */ | ||
174 | if ( showOverDue && !todo.isOverdue() ) { | ||
175 | continue; | ||
176 | } | ||
177 | /* now it's fine to add it */ | ||
178 | insertTodo( todo, i ); | ||
179 | i++; | ||
180 | } | ||
181 | setNumRows( i ); | ||
182 | int elc = time.elapsed(); | ||
183 | qWarning("Adding took %d", elc/1000 ); | ||
184 | setUpdatesEnabled( true ); | ||
185 | viewport()->setUpdatesEnabled( true ); | ||
186 | viewport()->update(); | ||
187 | m_enablePaint = true; | ||
188 | int el = time.elapsed(); | ||
189 | qWarning("adding took %d", el/1000 ); | ||
190 | } | ||
191 | void TableView::setTodo( int uid, const OTodo& ev ) { | ||
192 | QMap<int, CheckItem*>::Iterator it = m_cache.find( uid ); | ||
193 | |||
194 | if ( it != m_cache.end() ) { | ||
195 | int row = it.data()->row(); | ||
196 | |||
197 | /* update checked */ | ||
198 | CheckItem* check = checkItem(row ); | ||
199 | if (check) | ||
200 | check->setChecked( ev.isCompleted() ); | ||
201 | |||
202 | /* update the text */ | ||
203 | QString sum = ev.summary(); | ||
204 | setText(row, 2, sum.isEmpty() ? | ||
205 | ev.description().left(40).simplifyWhiteSpace() : | ||
206 | sum ); | ||
207 | |||
208 | /* update priority */ | ||
209 | setText(row, 1, QString::number( ev.priority() ) ); | ||
210 | |||
211 | /* update DueDate */ | ||
212 | DueTextItem *due = dueItem( row ); | ||
213 | due->setToDoEvent( ev ); | ||
214 | } | ||
215 | } | ||
216 | void TableView::addEvent( const OTodo& ev) { | ||
217 | int row= numRows(); | ||
218 | setNumRows( row + 1 ); | ||
219 | insertTodo( ev, row ); | ||
220 | } | ||
221 | /* | ||
222 | * find the event | ||
223 | * and then replace the complete row | ||
224 | */ | ||
225 | void TableView::replaceEvent( const OTodo& ev) { | ||
226 | setTodo( ev.uid(), ev ); | ||
227 | } | ||
228 | /* | ||
229 | * re aligning table can be slow too | ||
230 | * FIXME: look what performs better | ||
231 | * either this or the old align table | ||
232 | */ | ||
233 | void TableView::removeEvent( int ) { | ||
234 | clear(); | ||
235 | setTodos( begin(), end() ); | ||
236 | } | ||
237 | void TableView::setShowCompleted( bool b) { | ||
238 | qWarning("Show Completed %d" + b ); | ||
239 | setTodos( begin(), end() ); | ||
240 | } | ||
241 | void TableView::setShowDeadline( bool b) { | ||
242 | qWarning("Show DeadLine %d" + b ); | ||
243 | if (b) | ||
244 | showColumn(3 ); | ||
245 | else | ||
246 | hideColumn(3 ); | ||
247 | } | ||
248 | void TableView::setShowCategory( const QString& ) { | ||
249 | qWarning("setShowCategory"); | ||
250 | setTodos( begin(), end() ); | ||
251 | } | ||
252 | void TableView::clear() { | ||
253 | m_cache.clear(); | ||
254 | int rows = numRows(); | ||
255 | for (int r = 0; r < rows; r++ ) { | ||
256 | for (int c = 0; c < numCols(); c++ ) { | ||
257 | if ( cellWidget(r, c) ) | ||
258 | clearCellWidget(r, c ); | ||
259 | clearCell(r, c); | ||
260 | } | ||
261 | } | ||
262 | setNumRows( 0); | ||
263 | } | ||
264 | QArray<int> TableView::completed() { | ||
265 | int row = numRows(); | ||
266 | QArray<int> ids( row ); | ||
267 | |||
268 | int j=0; | ||
269 | for (int i = 0; i < row; i++ ) { | ||
270 | CheckItem* item = checkItem(i ); | ||
271 | if (item->isChecked() ) { | ||
272 | ids[j] = item->uid(); | ||
273 | j++; | ||
274 | } | ||
275 | } | ||
276 | ids.resize( j ); | ||
277 | return ids; | ||
278 | } | ||
279 | void TableView::slotClicked(int row, int col, int, | ||
280 | const QPoint& point) { | ||
281 | if ( !cellGeometry(row, col ).contains(point ) ) | ||
282 | return; | ||
283 | |||
284 | |||
285 | switch( col ) { | ||
286 | case 0: { | ||
287 | CheckItem* item = checkItem( row ); | ||
288 | /* | ||
289 | * let's see if we centered clicked | ||
290 | */ | ||
291 | if ( item ) { | ||
292 | int x = point.x() -columnPos( col ); | ||
293 | int y = point.y() -rowPos( row ); | ||
294 | int w = columnWidth( col ); | ||
295 | int h = rowHeight( row ); | ||
296 | if ( x >= ( w - OCheckItem::BoxSize ) / 2 && | ||
297 | x <= ( w - OCheckItem::BoxSize ) / 2 + OCheckItem::BoxSize && | ||
298 | y >= ( h - OCheckItem::BoxSize ) / 2 && | ||
299 | y <= ( h - OCheckItem::BoxSize ) / 2 + OCheckItem::BoxSize ) | ||
300 | item->toggle(); | ||
301 | } | ||
302 | } | ||
303 | break; | ||
304 | |||
305 | case 1: | ||
306 | break; | ||
307 | |||
308 | case 2: { | ||
309 | m_menuTimer->stop(); | ||
310 | showTodo( checkItem(row)->uid() ); | ||
311 | break; | ||
312 | } | ||
313 | case 3: { | ||
314 | m_menuTimer->stop(); | ||
315 | TodoView::edit( checkItem(row)->uid() ); | ||
316 | break; | ||
317 | } | ||
318 | } | ||
319 | |||
320 | |||
321 | } | ||
322 | void TableView::slotPressed(int row, int col, int, | ||
323 | const QPoint& point) { | ||
324 | |||
325 | /* TextColumn column */ | ||
326 | if ( col == 2 && cellGeometry( row, col ).contains( point ) ) | ||
327 | m_menuTimer->start( 750, TRUE ); | ||
328 | } | ||
329 | void TableView::slotValueChanged( int, int ) { | ||
330 | qWarning("Value Changed"); | ||
331 | } | ||
332 | void TableView::slotCurrentChanged(int, int ) { | ||
333 | m_menuTimer->stop(); | ||
334 | } | ||
335 | /* | ||
336 | * hardcode to column 0 | ||
337 | */ | ||
338 | CheckItem* TableView::checkItem( int row ) { | ||
339 | CheckItem *i = static_cast<CheckItem*>( item( row, 0 ) ); | ||
340 | return i; | ||
341 | } | ||
342 | DueTextItem* TableView::dueItem( int row ) { | ||
343 | DueTextItem* i = static_cast<DueTextItem*> ( item(row, 3 ) ); | ||
344 | return i; | ||
345 | } | ||
346 | QWidget* TableView::widget() { | ||
347 | return this; | ||
348 | } | ||
349 | /* | ||
350 | * We need to overwrite sortColumn | ||
351 | * because we want to sort whole row | ||
352 | * based | ||
353 | */ | ||
354 | void TableView::sortColumn( int row, bool asc, bool ) { | ||
355 | QTable::sortColumn( row, asc, TRUE ); | ||
356 | |||
357 | } | ||
358 | void TableView::viewportPaintEvent( QPaintEvent* e) { | ||
359 | qWarning("Paint event" ); | ||
360 | if (m_enablePaint ) | ||
361 | QTable::viewportPaintEvent( e ); | ||
362 | } | ||