Showing posts with label Domino. Show all posts
Showing posts with label Domino. Show all posts

Monday, March 22, 2010

FYI : Understanding the IBM Lotus Notes 8.5.x client directory structure

 Worth a repost for those who have not seen it.

http://www-10.lotus.com/ldd/dominowiki.nsf/dx/Understanding_the_IBM_Lotus_Notes_8.5.x_client_directory_structure

This article explains the changes that were introduced in the IBM® Lotus® Notes® 8.5 File System installation and describes them with respect to the installation, setup/launch/run, and uninstall phases in the client's life cycle. Also included are answers to some FAQs on the client file system.

 Thanks to Stuart for sending through this info.

Friday, November 13, 2009

Lotus Notes is shaking that 'legacy' tag

It looks like Lotus Notes is shaking that 'legacy' tag.


New applications are typically installed in web-based configurations thanks to "a massive bias towards" online applications and services. For example, a major roll-out of web-based email and collaboration built on IBM's Lotus iNotes is underway, while back-end administrative systems and even Bankwest's teller system are installed as server-side applications with web-based front ends.
"Over the years, there has been a very conscious effort to avoid legacy systems," Clasquin explains.

Read the full article.

Zdnet CIO Profile : Bank West

Thursday, May 14, 2009

My quick tips for UI design and another example

Here are some quick tips that I keep in mind for user interface design, bearing in mind that I'm not a graphic designer (so don't be too harsh on me!). I also found another user interface sample in the project archives.

Style

Here are my six style rules (they are not so much rules as guidelines really) that I use when creating or making over a web or Lotus Notes user interface.

1. Rule of thirds

Most of my websites and notes apps are divided up into thirds, three columns or variants thereof. It's a well know composition technique that has been around a while.

http://desktoppub.about.com/cs/pagelayout/qt/rule_of_thirds.htm

2. Complementary Colours

There are a set of colours that work best together, so when I'm deciding on which colours I usually choose from a pallette of complementary colours. If you're not up on you primary colours and matching blends then do what I do and use the following websites to get a pallette to work with.

http://www.easyrgb.com/index.php?X=HARM
http://www.colourlovers.com/

3. Restrict the numbers of colours

That's right. just because there are 12 colours that work well together, doesn't mean that you should use them all. Between 3 - 5 colours are a good combination that tends to be less distracting. That doesn't include a violator.

4. Consistent Fonts

Keep the fonts consistent. That is, try to keep the different types of fonts to maybe one or two types and ensure that they are both a serif or both san-serif. Ty not to mix the types. There are instances where mixing and matching can work, but typically that seems to be websites of traditional printed materials like newspapers that have a long history of serif fonts.

5. Alignment

Nothing stands out more that something that isn't lined up. Alignment that is inconsistent looks sloppy, unordered and distracting to the user. I believe that most user scan the screen and alignment helps to scan the information quickly.

http://www.design-lib.com/alignment-in-graphic-design-gd.php

6. White space

Pay attention to the space around your UI elements, do they looked like a can of sardines or could you park a bus between them. Playing around with your whitespace proportions can make all the difference, try it until the spacing feels right - then stop.

Whitespace is often used to create a balanced, harmonious layout

http://www.alistapart.com/articles/whitespace
http://interfacematters.com/2009/03/cheap-ui-trick-add-whitespace-with.html

Function

Here are my five functional guidelines.

1. Hide the irrelevant and clutter

If the user isn't suppose to click on that button, then hide it. If that information on the screen is not important at this stage of the workflow, then hide that too. Have you ever sold a house and removed all the clutter, cleaned the surfaces and made it look like a show home ? Do the same to your UI.

2. Consistent behavior

I don't like to surprise the users, if they click on one export button and it asks for a filename and fills in a default, the any other export buttons should do the same. In essence when they perform an action they should have the same experience.


3. Simplify the choices

Don't give the users 5 different ways to do something, that's four extra ways that they have to remember and recall. Sure, provide some level of personalisation in the way the user can interact, but the fewer the underlying choices the better.

4. Remove Mild Annoyances

Things that are midly annoying in development and user testing, will be hell for users that have to use the application daily and for long periods of time - so spend some time fixing up those minor annoyances.

5. Proactive help

Set defaults. For example, if you are writing an export routine, set a default filename, set the default fields and options. Show context sensitive examples to give the user somewhere to start. It might mean a bit more coding, but just think of the amount of time that a user would waste repeating the same thing, over and over.

Sample from the archive

As promised, here is a user interface make over from the archives, that included some (but not all) of my guidelines.

Form. Note rule of thirds, colours, alignment and whitespace.

Thursday, May 07, 2009

UI Pattern : Linking Data

Here is a UI sample from my latest web application, for those of you who are interested in such things.

The Problem.

To date, in the audits that I've built the users have been required to enter de-identified patient data in two cycles. The data from one cycle to the next has no relationship. That is, the GP (Users) could audit and enter the same or different patients data between the two cycles. It made the interface very simple. The user clicks on a button to create a new form and we simply count down the number of required records for each cycle. The user can't change or see the data once it's been submitted - a very simple user story and simple interface to match.

For the current audit, the scope changed slightly. As part of this new audit the users would be required to audit the same patient in cycle 2 that was audited in cycle1. This is so that we could provide a care plan over the period of the audit.

This new requirement raised a few questions that I needed to resolve;

1. How can the user identify the third patient they submitted in cycle 1.
2. How could the user enter data and ensure that it was linked to the correct patient.
3. How could I ensure that the duplicate data (like gender and patient code is retained)

Fundamentally, I couldn't rely on the user entering the correct data in a form. I needed to lead the user through this association in the simplest possible way.

I started out thinking of a pick list on the form so that when the user selects a value, which could be a combination of data, it populates the fields.

I wasn't happy with that approach, it just felt too clumsy and not at all simple and elegant. I went through various iterations (on paper) before deciding on the final solution.

The Solution.

Cycle 1.
The user sees the traditional (in our apps) 'Submit Case Record Online' button and as they enter the data, the system counts down the remaining case records as before. I added a summary table, so that the user can see their patient code and some additional information. This was to help them remember who that patient was and put in place the mechanism that I would use for cycle2.

Cycle 2.

I added a link, 'Submit Case Record Online', and cycle 2 creation date right next to Cycle 1 records in the summary table. When the user comes to enter data for cycle 2, they can easily see the patient information and where to click to submit the cycle 2 data for that particular patient.

I was trying to not make the user think.

I removed the blue button (above the PDF link) so that there wouldn't be any confusion. As an additional touch I made sure that the link to data that was already submitted was replaced with a completed 'tick' icon.

The link contains a code that is used in the web query open to link the cycle 2 record with the cycle 1 record, including getting the common data.


Summary.

It's a simple interface that provides a really intuitive way to link the cycle 1 data to the cycle 2 data.

Wednesday, April 08, 2009

Quote of the Day : The Lotus Notes platform -- it's very sophisticated

"The Lotus Notes platform -- it's very sophisticated," Doherty said. "That can scale pretty good, but it does involve a lot of clustering and a lot of sets of clusters. So you can continue to scale, but does get a little bit complicated. But the same could be said about Exchange and your back-end SQL clusters."

More
via Ed

Friday, March 27, 2009

Domino Unit Framework Q&A - Part 1

Here are some questions about using 'Domino Unit Framework' that have ended up in my inbox recently. So that everyone who uses it (all two of you) get the benefit I've posted them here and cross linked to the OpenNTF project. Excuse the poor English in the questions, they are coming from Karnataka in Banglore and English isn't the first language.

Question 1.

"So now my query is i need to get the document context of this..then only i
can test or compare or what ever it is..Can i run the tests of domino unit
frame work independently with out tieing to the Application data base."

Answer 1.

Yes, you can run the unit tests independent of the Domino Unit Framework database.

You will need to copy the Domino Unit Framework Script libraries into your application and build a place where you want to execute the tests (Agents, Action Buttons - Your choice). The results of the tests (pass/failures) are then sent to the domino unit framework database that you specify. You can send the documents to any database but you'll need to see the results.

Set OutputStream = New NotesDatabaseOutputStream(session, "", "DUFResults.nsf")

When you are migrating to production/uat, remove the script libraries and agents.

Question 2.

"Is there a way to test them independently with out tieing to application database is my Question or As per ur inputs is this only the best way to test.(copying)"

Answer 2.

Nope....

It's a bit like trying to compile a java program and not having the jar file on the path....the database is the project, therefore - like jUnit you need to allow the objects that you are testing to be in scope.

Question 3.

"I don't find any assertion for comparing two arrays of type Variant..that is Variant array or list in Domino Unit Framework.Is there any solution for that or do we need to manually write some class for that in the script library."
I was trying to test two variant arrays,its saying failed(As no case is available as such) even though both the variant arrays contains same values"

Answer 3.

Equality of Arrays, especially arrays of variants is particularly tricky - mostly because the rules of equality can vary, and there is a large combination of possible rules that may or may not be relevant in your particular instance. Is order important for equality ? or perhaps number of elements ?

Therefore, asserting equality between arrays (and arrays of variants) is not (and perhaps never will be) included in Domino Unit Framework.

My suggestions is to either write your own custom assertions as you have access to the source code, or unit test at the array element like so;

Call Test101.AssertEqual(array_a(0),array)b(0))

Friday, February 13, 2009

Web UI Patterns

From the authors of Designing Web Interfaces via Ajaxian, via their blog. 390 screens have been added to the Designing Web Interfaces Photostream.

You should also checkout the 15 Common Component Patterns.

Lots of inspiration, eye candy and general UI tips for the Domino developers out there.

Friday, November 28, 2008

Dojo Domino Applications : Performance Tips

Are you curious about how to get better performance from your dojo domino apps, here are the results of me taking a little peek.

In my last dojo app, I only used a few controls and as such performance was 'good enough'. However, it was niggling me that I should look into the dojo custom build system. I'm currently building a new audit and I need to use additional controls. It was enough of a reason for me to take a peek.

The two things that I wanted to find out were;
  • How easy is the dojo custom build system ?
  • How much difference will this make to the performance ?
I also wanted to explore some of the server side settings that would help overall performance and document the whole lot in one place.

The Dojo Build System - Creating your own custom build.

As Tim has already blogged about, using Dojo in its vanilla state means that you will have a whole bunch of seperate HTTP requests - which affects performance. In addition, the files haven't been optimized for downloading quickly. The dojo build system optimise the files by interning, removing whitespace, removing some comments, shortens variable names and rationalising the dojo layers.

I was quite surprised just how easy the build system was to set up and use. Here is what to do.

1. Download the source code files - I used the dojo-release-1.2.2-src.zip

2. You then need to create a profile. This tells the build system what bits of dojo you use. Its pretty much the dojo.requires entries. This is what my scius-profile.js looks like and you need to put this in the util\buildscripts directory.

dependencies = {
layers: [
{
name: "scius-dojo.js",

dependencies: [

"dojo.parser",

"dijit.Dialog",

"dijit.form.Button",

"dijit.form.DateTextBox",

"dijit.form.NumberTextBox",
"dijit.form.CheckBox",
"dijit.ProgressBar",

"dijit.layout.ContentPane",

"dijit.layout.StackContainer"

]
},
],


prefixes: [ [ "dijit", "../dijit" ], [ "dojox", "../dojox" ] ] }


3. You then need to run the build script, you can do this from the command line - or from a batch file in the buildscript directory. My scius-build.bat looks like this

build.bat
profile=scius

action=release

profileFile=scius-profile.js

releaseName=scius-dojo-122

optimize=shrinksafe

layerOptimize=shrinksafe

copyTests=false

localeList=en,en-us,en-au


I've chosen to use the dojo version in my release, so that I can keep track of which dojo version it contains (you can also include your own version attributes). I've also decided to use a custom list of locales rather than the default, the audit is only available to Australians, so I wanted to cover most language settings that might be used.

After about 85 seconds, the build system is finished and you then have your own custom build waiting for you in the release directory.

How to use the custom build in your page ?

Now that you have your own compacted build you'll need to use it in your web app. In your pages that use dojo, you will need to update the dojo references to the new build and also include a reference to your custom build js.

I update the head tags to include /dojo/scius-dojo.js as well as the reference to the /dojo/dojo.js. My new script links look like this;

<script type="text/javascript" src="https://website/scius-dojo-122/dojo/dojo.js" djconfig="isDebug: false, parseOnLoad: true"></script>
<script type="text/javascript" src="https://website/scius-dojo-122/dojo/scius-dojo.js"></script>


When the pages loaded, the number of http requests is reduced from 80 to 59 requests and even though the number of Kb increased, this changed the initial load time from 12.98 seconds to 4.21 seconds and the cached time from 6.98 to 2.185.

Where should I store the dojo files ?

You may have noticed that the path to the dojo files did not include a database. That's right, I've placed the files directly under the servers data directory. On my linux server that is /local/notesdata/domino/html/scius-dojo-122. Putting commonly used web files under the html directory is a well known performance technique. However, sometimes it's not always possible or desirable. For example, I'm quite happy to put my compacted versions of the standard dojo implementation there as I don't have a lot of applications or dojo variations to manage. I also have easy access. If you want out-and-out performance, that's the way to go.

Can you reduce the number of requests further ?

Maybe not for the original request but for further requests, yes you can. You need to set the expires header. If you follow the teachings of Yahoo, YSlow will give you a report on the files that don't have the expires headers set. Chris Linfoot and Chris Brandlehner have both blogged about setting the expires header for domino applications in more detail.

So exactly how do you do that ? It's a server config thing. You can specify rules for a website where domino will set the expires date. I set mine to cache any of my database theme files, all the scius dojo files and one rogue js file in the design. Just remember, don't set this as a global setting - it's a bad idea.



So now, subsequent page loads are very snappy. Down from 2.1 to under 1 second. You can see for the subsequent load only the html is needed. Everything else has been cached. 515kb to 39k and 59 requests down to 1 request.

Of course, YSlow is still give me rating of F. I still need to move CSS at the top, GZip my files, use a CDN and reduce the initial number of HTTP requests. However, now that the page loads have been reduced, I'm not going to sweat it.

;-)

Of course, the last bit is reducing the time taken to download the HTML. If your application generates this dynamically through agents, views or forms, and it's this part that takes a long time, then you might need to consider performance improvements in the Notes application too.

Summary.

Was the custom build system easy to use ?

Yes. It didn't take too long to figure out my profile. Running a batch file and copying a directory doesn't take much effort either. Heck, you could probably automate that whole thing with ANT, including copying the custom build to your server by FTP - if you really wanted to.

How much difference did this make to performance ?

Using a custom build reduced both the initial and cached load time by half, setting the expires date reduced the cached loaded page by half again.

It terms of effort versus gain, it's well worth using the dojo custom build, maybe not for development. Maybe as a last step before promoting your application into your test and production environments.

Additional Notes about the Set up:

The environment I used was my development 8.0 server, running in a bridged VM with 512mb ram. The browser is on the host machine. I've noted in the past that this is slower than the response time I get on my production servers. However, it's a good control environment.

Tuesday, October 21, 2008

Taking the View to PDF example to the next step.

As promised, here are some enhancements to make the PDF of a view a little nicer on the eyes.

The example agent enclosed improves on the previous version by;

  • handling a view with one category or a flat view
  • handling a view that has hidden, icon and total detail columns
  • adding a header image (from SuperNTF)
  • adding a footer with page numbers
I thought about updating the Pdf Document Library to allow a bit better control of cell padding and border colours of tables. In the end I decided against it. I really wanted to use what I had already created to prove that even with limited functionality you can still produce something that looks good enough.

Remember, if you have complicated reports or want fine grained control then write directly to iText. I also wanted to demonstrate that the PDF generation side is the easy bit. This means that you can spend more time writing the domino parts and tweeking for your formats than writing the PDF stuff.

The code is attached here and extracts below.

// get the date time for the report

DateTime dt = session.createDateTime("Today");

dt.setNow();


// the generic data object

PdfData data = new PdfData();


// where to put the file

PdfDocumentConfig config = new PdfDocumentConfig("Text",

"ViewByTitle.pdf", "c:\\pdfs");


/*

* Set up some of the styles that

* we will use in the pdf document.

*/


// the style for the database and view title

Style styleViewTitle = new Style("viewTitle", Style.TYPEFACE_HELVETICA,

18);

styleViewTitle.setDecoration(Style.DECORATION_BOLD);

styleViewTitle.setAlign(Style.ALIGN_CENTER);

styleViewTitle.setBackgroundColour(232, 232, 232);

styleViewTitle.setColor(0, 94, 187);


// the style for the date stamp

Style styleDate = new Style("date", Style.TYPEFACE_HELVETICA, 10);

styleDate.setAlign(Style.ALIGN_RIGHT);

styleDate.setBackgroundColour(Color.RED);


// the style for the view column titles

Style styleColumnTitle = new Style("columnsTitle",

Style.TYPEFACE_HELVETICA, 12);

styleColumnTitle.setDecoration(Style.DECORATION_BOLD);

styleColumnTitle.setBackgroundColour(232, 232, 232);

styleColumnTitle.setColor(0, 94, 187);


// the style for the column categories

Style styleColumnCat = new Style("columnsCat", Style.TYPEFACE_HELVETICA,

12);

styleColumnCat.setDecoration(Style.DECORATION_BOLD);

styleColumnCat.setBackgroundColour(247, 247, 247);

styleColumnCat.setColor(255, 153, 0);


// the default style for the view data

Style styleViewDefault = new Style("default", Style.TYPEFACE_HELVETICA,

10);


/*

* set header image - used the image from the superNTF nsf

*/

HeaderImage headerImage = new HeaderImage();

headerImage.addImage("c:\\pdfs\\BrandBanner.gif");

headerImage.setImageScale(HeaderImage.IMAGE_NO_SCALE, false);


// create a header to write the date into

HeaderTwoColumns header = new HeaderTwoColumns(50, 50);

header.setLeftColumn(new CellElement("", styleDate));

header.setRightColumn(new CellElement(dt.getDateOnly(), styleDate));

header.setStyle(styleDate);

header.setHeight(100);


// create a footer

FooterTwoColumns footer = new FooterTwoColumns(50, 50);

footer.setLeftColumn(new CellElement(

"http://palmerweb.blogspot.com - http://www.scius.com.au"));

footer.setRightColumn(new CellElement("", styleDate));

footer.setStyle(styleViewDefault);

footer.setPageNum(new PageNumbersElement(styleDate));

footer.includePageNumbers(true,

FooterTwoColumns.PAGE_NUMBERS_RIGHT);


// getting the notes handles

AgentContext ctx = session.getAgentContext();

Database db = ctx.getCurrentDatabase();


// this is the view

View viewMembers = db.getView("vw-docsbytitle");

// read the columns to get the report headings

Vector cols = viewMembers.getColumns();


// filter out the columns that we are not interested in

// such as icons, hidden, total details and categories

Vector colsToRead = new Vector();

for (int x = 0; x < cols.size(); x++) {

ViewColumn col = (ViewColumn) cols.get(x);

if (col.isIcon() == false && col.isCategory() == false

&& col.isHidden() == false

&& col.isHideDetail() == false) {

colsToRead.add(col);

}

}


// create a table based on the number of columns

TableElement tb = new TableElement(colsToRead.size());


/*

* create the heading (repeating) rows for the table.

*/

// database and view title

RowElement rw = new RowElement();

CellElement title = new CellElement(db.getTitle() + " - "

+ viewMembers.getName() + "\n\n", styleViewTitle);

title.setCellspan((colsToRead.size()));

rw.addCell(title);

rw.setTableHeading(true);

tb.AddRow(rw);

// column headings

rw = new RowElement();

for (int x = 0; x < colsToRead.size(); x++) {

ViewColumn col = (ViewColumn) colsToRead.get(x);

rw

.addCell(new CellElement(col.getTitle() + "\n\n",

styleColumnTitle));

}

rw.setTableHeading(true);

tb.AddRow(rw);

/*

* populate the table with the view data

*/

ViewNavigator viewNav = viewMembers.createViewNav();

ViewEntry rowData = viewNav.getFirst();


while (!(rowData == null)) {


rw = new RowElement();

Vector viewCol = rowData.getColumnValues();


// check to see if this is a category

if (rowData.isCategory()) {


CellElement catCell = new CellElement("\n"

+ viewCol.get(1).toString() + "\n\n", styleColumnCat);

catCell.setCellspan(colsToRead.size());

rw.addCell(catCell);


} else if (rowData.isDocument()) {

for (int x = 0; x < colsToRead.size(); x++) {

ViewColumn col = (ViewColumn) colsToRead.get(x);

int pos = col.getPosition() - 1;

rw.addCell(new CellElement(viewCol.get(pos).toString(),

styleViewDefault));


}

}


tb.AddRow(rw);

rowData = viewNav.getNext(rowData);

}


// add the table to the data object

data.add(tb);


// overide the default layout

LayoutElement layout = new LayoutElement(LayoutElement.PAGESIZE_A4,

LayoutElement.ORIENTATION_LANDSCAPE, 10, 10, 10, 10, 40, 50);


// add the image to the layout

layout.setHeaderImage(headerImage);

layout.setFooter(footer);

layout.setHeader(header);


// configure with the config, data and layout

PdfDocument pdf = new PdfDocument(config, data, layout);


// go

pdf.createDocument();


You should be able to take the agent code and just change the view name and you'll have a nicer looking PDF of your views - providing you like the colours and images. In the course of building this examples I made a few assumptions about the number of categories, and location of hidden columns. You might need to tweek the agent code if your views have more than one category or have totals and hidden columns in different locations. Its not just a drop in and works for every scenario.

What's next ?

I guess a notes document to PDF would be a nice example, so that's what will be in the pipeline. However, impending work commitments mean that it's highly likely that it won't be in the near future.

Monday, October 20, 2008

Notes View to PDF in 60 seconds

Watch the movie to see how to create a pdf of a view in 60 seconds.


I've produced a movie to demonstrate how easy it is to write an agent that creates a pdf of a view using my new library. I chose SuperNTF as it was the first database that had a flat view and a selection of documents. I copied and pasted enough entries to give me two pages so that you can see repeating headers. It's not quite as entertaining as 'Gone in 60 seconds' but does show you how quickly you can implement this in your own databases.


Below is the example code from the movie that simply dumps the content of a designated flat view to a table in a pdf. I've updated the library to Beta 7 to contain a minor enhancement to allow you to specify rows that are designated as headers. These header rows (yes you can specify more than one) are repeated on each page as the content forces a page break. Again, most of the heavy lifting is done by iText.


The Code

// the generic data object

PdfData data = new PdfData();

// where to put the file

PdfDocumentConfig config = new PdfDocumentConfig("Text",

"agent-test.pdf", "c:\\temp");


// getting the notes handles

AgentContext ctx = session.getAgentContext();

Database db = ctx.getCurrentDatabase();


// this is the view

View viewMembers = db.getView(" - insert your view alias here - ");

// get the column names for a header

Vector cols = viewMembers.getColumnNames();

// create a table based on the number of columns

TableElement tb = new TableElement(cols.size());

// start populating with the column names

RowElement rw = new RowElement();

for (int x = 0; x < cols.size(); x++) {

rw.addCell(new CellElement(cols.get(x).toString()));

}

// mark this as a table header to be repeated

rw.setTableHeading(true);

tb.AddRow(rw);

// start populating the table with the view data

ViewNavigator viewNav = viewMembers.createViewNav();

ViewEntry rowData = viewNav.getFirst();


while (!(rowData == null)) {

rw = new RowElement();

Vector viewCol = rowData.getColumnValues();


for (int y = 0; y < viewCol.size(); y++) {

rw.addCell(new CellElement(viewCol.get(y).toString()));

}

tb.AddRow(rw);

rowData = viewNav.getNext(rowData);

}

// add the table to the data object

data.add(tb);

// overide the default layout

LayoutElement layout =

new LayoutElement(LayoutElement.PAGESIZE_A4,

LayoutElement.ORIENTATION_LANDSCAPE,

10, 10, 10, 10, 10, 10);

// configure with the config, data and layout

PdfDocument pdf = new PdfDocument(config, data, layout);

// go

pdf.createDocument();


} catch (Exception e) {

e.printStackTrace();

} finally {

}


I've seen the move so how can I use this ?

1. Download Beta 7, and extract the updated jar file to a directory c:\lib

2. Download The JavaAgentPdf code

3. Create a new Java agent in your database, add the iText-2.0.8 jar and the new scius-pdfdoc.beta7.jar

3. Replace the JavaAgent code with the downloaded version and update the view name, pdf filename and pdf directory.


Enhancing the example further.

To keep this example short and under 30 lines, I have skipped of some of the things that you should add in for a production implementation, such as dealing with exceptions and checking that the domino objects are not null. However, for a proof-of-concept - it might be adequate. You would also need to write a few more lines to account for a categorised views, hidden columns and possibly the final enhancement would be to make the report look nice with some styles.


Stay tuned because the next post might have an example that produces a pdf that is a bit nicer on the eyes.


Update : The link to the zip file has changed. I found a bug with Beta7 and ParagraphElements.