This is a read-only archive. Find the latest Linux articles, documentation, and answers at the new Linux.com!

Linux.com

Feature: Office Software

A simple task manager for OpenOffice.org

By Dmitri Popov on October 12, 2007 (9:00:00 AM)

Share    Print    Comments   

If you spend most of your time in OpenOffice.org, you might want to be able to manage to-do lists and tasks without leaving the comfort of the office suite. Since Writer doesn't have such a feature, you can create your own no-frills task tool and at the same time sharpen your OOoBasic skills.

In a previous article, we covered how to build a handy basket tool. You can use the same techniques when creating a simple task manager. The one we'll build offers only three basic commands: add a task, view all tasks, and purge tasks.

This tool is part of Google's Writer's Tools extension, released under GPL. If you don't feel like building a tasks manager from scratch, grab the extension and start experimenting.

All the tasks are stored in a Base database table with three fields: ID (type INTEGER), Task (type VARCHAR), and Date (type DATE). The ID field acts as a unique identifier for each task, the Task field stores the task's description, and the Date field is for the task's due date.

Before you start working on the task utility, you have to create a Base database (name it, for example, TasksDB) with a "tasks" table that has the described fields in it. You must also register the created database with OpenOffice.org. To do this, launch OpenOffice.org and choose Tools -> Options. Select OpenOffice.org Base -> Databases and press the New button. Select the TasksDB database and give the new connection the name "TasksDB."

Now you are ready to start coding the New Task macro that allows you to add tasks. First, you have to create a new dialog (name it AddTaskDialog) containing two text fields: TextField1, where you enter the task description, and TextField2, for the due date. You should also add two buttons, which you will use to submit the entered data and to cancel the action.

The first thing the New Task macro has to do is to connect to the TasksDB database:

DBContext=createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource=DBContext.getByName("WriterDB")
ConnectToDB=DataSource.GetConnection ("","")

When the connection is established, the macro initiates and displays the Add New task dialog:

exitOK=com.sun.star.ui.dialogs.ExecutableDialogResults.OK
DialogLibraries.LoadLibrary("Tasks")
Library=DialogLibraries.GetByName("Tasks")
TheDialog=Library.GetByName("AddTaskDialog")
Dialog=CreateUnoDialog(TheDialog)

It then acquires the data entered in TextField1 and TextField2:

If Dialog.Execute=exitOK Then
DialogField1=Dialog.getControl("TextField1")
Task=DialogField1.Text
DialogField2=Dialog.GetControl("TextField2")
DueDate=DialogField2.Text

When the macro has the required data, it inserts it into the appropriate fields in the tasks table in the TasksDB database using the INSERT INTO SQL command:

SQLQuery="INSERT INTO ""tasks"" " + "(""Task"", ""Date"") VALUES "_
+ "('" + Task + "','" + DueDate + "')"

The final macro should look something like this:

Sub NewTask()
Dim Dialog As Object, Library As Object, TheDialog As Object
ThisDoc=ThisComponent
SelectedSnippet=ThisDoc.getCurrentController().getSelection().getByIndex(0).getString()
DBContext=createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource=DBContext.getByName("TasksDB")
ConnectToDB=DataSource.GetConnection ("","")
exitOK=com.sun.star.ui.dialogs.ExecutableDialogResults.OK
DialogLibraries.LoadLibrary("Tasks")
Library=DialogLibraries.GetByName("Tasks")
TheDialog=Library.GetByName("AddTaskDialog")
Dialog=CreateUnoDialog(TheDialog)
DialogField1=Dialog.getControl("TextField1").setText(SelectedSnippet)
If Dialog.Execute=exitOK Then
DialogField1=Dialog.getControl("TextField1")
Task=DialogField1.Text
DialogField2=Dialog.GetControl("TextField2")
DueDate=DialogField2.Text
SQLQuery="INSERT INTO ""tasks"" " + "(""Task"", ""Date"") VALUES "_
+ "('" + Task + "','" + DueDate + "')"
SQLStatement=ConnectToDB.createStatement
Result=SQLStatement.executeQuery (SQLQuery)
ConnectToDB.close
ConnectToDB.dispose()
MsgBox ("The task has been added.", , "All done!")
Dialog.Dispose
End If
End Sub

The astute reader may notice three extra lines in the macro:

ThisDoc=ThisComponent
SelectedSnippet=ThisDoc.getCurrentController().getSelection().getByIndex(0).getString()

and

DialogField1=Dialog.getControl("TextField1").setText(SelectedSnippet)

They add a small but convenient feature: when you select a text fragment in your current document, the macro automatically inserts it into the TextField1 field of the Add Task dialog. This allows you to quickly create a new task from a text selection.

The Show Tasks macro also uses an SQL query to fetch tasks from the database. However, the query works in a slightly different way. It uses the SELECT command to pull the task data from the tasks table using the following query:

SQLQuery= "SELECT ""Task"", ""Date"" FROM ""tasks"""

This returns a list of tasks in the order they were entered. If you would like to sort them by the due dates, you might want to use the ORDER BY command in the query:

SQLQuery= "SELECT ""Task"", ""Date"" FROM ""tasks"" ORDER BY ""Date"" ASC"

The constructed query is then executed using the same code as the New Task macro:

SQLStatement=ConnectToDB.createStatement
RowSetObj=SQLStatement.executeQuery (SQLQuery)

But to display the tasks, the macro uses the While...Wend loop that reads data in the Task and Date fields record by record:

While RowSetObj.Next
TaskList=TaskList & " " & RowSetObj.getString(1) & ": " & RowSetObj.getString(2) & Chr(13)
Wend

It then uses a simple message box to display a list of tasks:

MsgBox (TaskList, , "Task list")

Finally, you need a macro that deletes tasks from the database. The Purge Tasks macro is similar to the New Task macro in almost every respect. The only difference is the SQL query, which uses the DELETE command to remove all the tasks from the table:

SQLQuery="DELETE FROM ""tasks"""

That's all there is to it. Your no-frills task manager is ready to go, and you can use it to manage your tasks. Of course, since this is a rather bare-bones tool, there is a lot of room for improvement here. For example, you might want to configure OpenOffice.org to display your tasks every time you launch the application. To do this, choose Tools -> Macros -> Organize Macros -> OpenOffice.org Basic. Press the Assign button, and switch to the Events tab. Select the Start Application event, press the macro button, and select the ShowTasks macro. Press OK, choose OpenOffice.org from Save in drop-down list, and press OK again. From now on, you will see the task list every time you launch OpenOffice.org. Other improvements may include the ability to purge tasks for a specific date, selectively delete tasks, better way to display the task list, and so on.

Dmitri Popov is a freelance writer whose articles have appeared in Russian, British, US, German, and Danish computer magazines.

Share    Print    Comments   

Comments

on A simple task manager for OpenOffice.org

Note: Comments are owned by the poster. We are not responsible for their content.

Dedicated calendar system versus "simple task manager for OpenOffice.org?"

Posted by: Anonymous [ip: 169.233.26.125] on October 12, 2007 02:30 PM
Moderators / admins, please delete the last comment which clearly added little value to the discussion.
Why would anyone use this system in the face of dedicated programs such as KOrganizer?

#

A simple task manager for OpenOffice.org

Posted by: Anonymous [ip: 87.254.95.153] on October 12, 2007 11:31 PM
How about indenting your code so that it is slightly readable?

#

A simple task manager for OpenOffice.org

Posted by: Anonymous [ip: 219.95.7.158] on October 15, 2007 08:23 PM
I am also most of my time in GNU/Emacs + LaTeX for my documents writing, and I found org-mode is very USEFUL and simple to use too. Tasks/projects can be arranged in normal ASCII text and can be read/modify with any text editor.

#

A simple task manager for OpenOffice.org

Posted by: toronto on November 12, 2007 01:53 AM
Thanks for the tip. Found the article while searching.

#

This story has been archived. Comments can no longer be posted.



 
Tableless layout Validate XHTML 1.0 Strict Validate CSS Powered by Xaraya