2 This file is part of the kolab resource - the implementation of the
3 Kolab storage format. See www.kolab.org for documentation on this.
5 Copyright (c) 2004 Bo Thorsen <bo@sonofthor.dk>
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Library General Public
9 License as published by the Free Software Foundation; either
10 version 2 of the License, or (at your option) any later version.
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Library General Public License for more details.
17 You should have received a copy of the GNU Library General Public License
18 along with this library; see the file COPYING.LIB. If not, write to
19 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, USA.
22 In addition, as a special exception, the copyright holders give
23 permission to link the code of this program with any edition of
24 the Qt library by Trolltech AS, Norway (or with modified versions
25 of Qt that use the same license as Qt), and distribute linked
26 combinations including the two. You must obey the GNU General
27 Public License in all respects for all of the code used other than
28 Qt. If you modify this file, you may extend this exception to
29 your version of the file, but you are not obligated to do so. If
30 you do not wish to do so, delete this exception statement from
36 #include <kcal/todo.h>
39 using namespace Kolab
;
42 KCal::Todo
* Task::xmlToTask( const QString
& xml
, const QString
& tz
)
46 KCal::Todo
* todo
= new KCal::Todo();
51 QString
Task::taskToXML( KCal::Todo
* todo
, const QString
& tz
)
53 Task
task( tz
, todo
);
54 return task
.saveXML();
57 Task::Task( const QString
& tz
, KCal::Todo
* task
)
58 : Incidence( tz
, task
),
59 mPriority( 5 ), mPercentCompleted( 0 ),
60 mStatus( KCal::Incidence::StatusNone
),
61 mHasStartDate( false ), mHasDueDate( false ),
62 mHasCompletedDate( false )
72 void Task::setPriority( int priority
)
77 int Task::priority() const
82 void Task::setPercentCompleted( int percent
)
84 mPercentCompleted
= percent
;
87 int Task::percentCompleted() const
89 return mPercentCompleted
;
92 void Task::setStatus( KCal::Incidence::Status status
)
97 KCal::Incidence::Status
Task::status() const
102 void Task::setParent( const QString
& parentUid
)
107 QString
Task::parent() const
112 void Task::setDueDate( const KDateTime
& date
)
118 KDateTime
Task::dueDate() const
123 void Task::setHasStartDate( bool v
)
128 bool Task::hasStartDate() const
130 return mHasStartDate
;
133 bool Task::hasDueDate() const
138 void Task::setCompletedDate( const KDateTime
& date
)
140 mCompletedDate
= date
;
141 mHasCompletedDate
= true;
144 KDateTime
Task::completedDate() const
146 return mCompletedDate
;
149 bool Task::hasCompletedDate() const
151 return mHasCompletedDate
;
154 bool Task::loadAttribute( QDomElement
& element
)
156 QString tagName
= element
.tagName();
158 if ( tagName
== "priority" ) {
160 int priority
= element
.text().toInt( &ok
);
161 if ( !ok
|| priority
< 0 || priority
> 5 )
163 setPriority( priority
);
164 } else if ( tagName
== "completed" ) {
166 int percent
= element
.text().toInt( &ok
);
167 if ( !ok
|| percent
< 0 || percent
> 100 )
169 setPercentCompleted( percent
);
170 } else if ( tagName
== "status" ) {
171 if ( element
.text() == "in-progress" )
172 setStatus( KCal::Incidence::StatusInProcess
);
173 else if ( element
.text() == "completed" )
174 setStatus( KCal::Incidence::StatusCompleted
);
175 else if ( element
.text() == "waiting-on-someone-else" )
176 setStatus( KCal::Incidence::StatusNeedsAction
);
177 else if ( element
.text() == "deferred" )
178 // Guessing a status here
179 setStatus( KCal::Incidence::StatusCanceled
);
182 setStatus( KCal::Incidence::StatusNone
);
183 } else if ( tagName
== "due-date" )
184 setDueDate( stringToDateTime( element
.text() ) );
185 else if ( tagName
== "parent" )
186 setParent( element
.text() );
187 else if ( tagName
== "x-completed-date" )
188 setCompletedDate( stringToDateTime( element
.text() ) );
189 else if ( tagName
== "start-date" ) {
190 setHasStartDate( true );
191 setStartDate( element
.text() );
193 return Incidence::loadAttribute( element
);
199 bool Task::saveAttributes( QDomElement
& element
) const
201 // Save the base class elements
202 Incidence::saveAttributes( element
);
204 writeString( element
, "priority", QString::number( priority() ) );
205 writeString( element
, "completed", QString::number( percentCompleted() ) );
208 case KCal::Incidence::StatusInProcess
:
209 writeString( element
, "status", "in-progress" );
211 case KCal::Incidence::StatusCompleted
:
212 writeString( element
, "status", "completed" );
214 case KCal::Incidence::StatusNeedsAction
:
215 writeString( element
, "status", "waiting-on-someone-else" );
217 case KCal::Incidence::StatusCanceled
:
218 writeString( element
, "status", "deferred" );
220 case KCal::Incidence::StatusNone
:
221 writeString( element
, "status", "not-started" );
223 case KCal::Incidence::StatusTentative
:
224 case KCal::Incidence::StatusConfirmed
:
225 case KCal::Incidence::StatusDraft
:
226 case KCal::Incidence::StatusFinal
:
227 case KCal::Incidence::StatusX
:
228 // All of these are saved as StatusNone.
229 writeString( element
, "status", "not-started" );
234 writeString( element
, "due-date", dateTimeToString( dueDate() ) );
236 if ( !parent().isNull() )
237 writeString( element
, "parent", parent() );
239 if ( hasCompletedDate() && percentCompleted() == 100)
240 writeString( element
, "x-completed-date", dateTimeToString( completedDate() ) );
246 bool Task::loadXML( const QDomDocument
& document
)
248 QDomElement top
= document
.documentElement();
250 if ( top
.tagName() != "task" ) {
251 qWarning( "XML error: Top tag was %s instead of the expected task",
252 top
.tagName().toAscii().data() );
255 setHasStartDate( false ); // todo's don't necessarily have one
257 for ( QDomNode n
= top
.firstChild(); !n
.isNull(); n
= n
.nextSibling() ) {
260 if ( n
.isElement() ) {
261 QDomElement e
= n
.toElement();
262 if ( !loadAttribute( e
) )
263 // TODO: Unhandled tag - save for later storage
264 kDebug() <<"Warning: Unhandled tag" << e
.tagName();
266 kDebug() <<"Node is not a comment or an element???";
272 QString
Task::saveXML() const
274 QDomDocument document
= domTree();
275 QDomElement element
= document
.createElement( "task" );
276 element
.setAttribute( "version", "1.0" );
277 saveAttributes( element
);
278 if ( !hasStartDate() && startDate().isValid() ) {
279 // events and journals always have a start date, but tasks don't.
280 // Remove the entry done by the inherited save above, because we
282 QDomNodeList l
= element
.elementsByTagName( "start-date" );
283 Q_ASSERT( l
.count() == 1 );
284 element
.removeChild( l
.item( 0 ) );
286 document
.appendChild( element
);
287 return document
.toString();
290 void Task::setFields( const KCal::Todo
* task
)
292 Incidence::setFields( task
);
294 setPriority( task
->priority() );
295 setPercentCompleted( task
->percentComplete() );
296 setStatus( task
->status() );
297 setHasStartDate( task
->hasStartDate() );
299 if ( task
->hasDueDate() )
300 setDueDate( localToUTC( task
->dtDue() ) );
303 if ( task
->relatedTo() )
304 setParent( task
->relatedTo()->uid() );
305 else if ( !task
->relatedToUid().isEmpty() )
306 setParent( task
->relatedToUid( ) );
308 setParent( QString() );
310 if ( task
->hasCompletedDate() && task
->percentComplete() == 100 )
311 setCompletedDate( localToUTC( task
->completed() ) );
313 mHasCompletedDate
= false;
316 void Task::saveTo( KCal::Todo
* task
)
318 Incidence::saveTo( task
);
320 task
->setPriority( priority() );
321 task
->setPercentComplete( percentCompleted() );
322 task
->setStatus( status() );
323 task
->setHasStartDate( hasStartDate() );
324 task
->setHasDueDate( hasDueDate() );
326 task
->setDtDue( utcToLocal( dueDate() ) );
328 if ( !parent().isEmpty() )
329 task
->setRelatedToUid( parent() );
331 if ( hasCompletedDate() && task
->percentComplete() == 100 )
332 task
->setCompleted( utcToLocal( mCompletedDate
) );