<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-36816678</id><updated>2011-10-25T22:42:07.297+11:00</updated><category term='Dojo'/><category term='Composite Applications'/><category term='SDLC'/><category term='SnTT'/><category term='CSS'/><category term='PDF'/><category term='Portal'/><category term='UX'/><category term='UI'/><category term='LS09'/><category term='Java'/><category term='Fun'/><category term='Apple'/><category term='Lotus Knows'/><category term='Lotus'/><category term='OSS'/><category term='Blogging'/><category term='Websphere'/><category term='scams'/><category term='Notes 8'/><category term='ALM'/><category term='Agile'/><category term='Component Designer'/><category term='Scrum'/><category term='HTML'/><category term='Domino'/><category term='Tools'/><category term='Ubuntu'/><category term='Methodologies'/><category term='iPad'/><category term='Unit Testing'/><title type='text'>palmerweb.blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>72</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-36816678.post-1514928573240878319</id><published>2010-08-23T21:39:00.001+10:00</published><updated>2010-08-23T21:40:09.603+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>A couple of Agile links</title><content type='html'>Here are another couple of good Agile resources. First of all, a great find from &lt;a href="http://www.bruceelgort.com/blogs/be.nsf/plinks/BELT-88FVV2#comments"&gt;Bruce&lt;/a&gt;, comes a slick 10 minute intro to Scrum.&lt;br /&gt;&lt;br /&gt;&lt;object height="449" width="278"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Q5k7a9YEoUI&amp;color1=0xb1b1b1&amp;color2=0xd0d0d0&amp;hl=en_US&amp;feature=player_embedded&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Q5k7a9YEoUI&amp;color1=0xb1b1b1&amp;color2=0xd0d0d0&amp;hl=en_US&amp;feature=player_embedded&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="449" height="278"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Next, there is a report on the &lt;a href="http://www.sei.cmu.edu/reports/10tn002.pdf"&gt;Consideration for using Agile in DoD Aquisition&lt;/a&gt; via the &lt;a href="http://herdingcats.typepad.com/my_weblog/2010/08/agile-and-dod-software-development.html"&gt;Herding Cats&lt;/a&gt; blog.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;This report is the result of this assessment, and is meant to debunk the prevalent myth that Agile and De-partment of Defense (DoD) practices are incompatible. Our focus is on the software development arena, basing our information on actual acquisition experience and a sampling of the relevant literature availa-ble. We will not discuss specific Agile methods beyond describing Agile and providing a list of the most common Agile methods. We do, however, provide some helpful hints on considerations that need to be addressed when deciding to use Agile in the DoD environment.&lt;/blockquote&gt;&lt;br /&gt;The report is a great read of how the DoD looked into Agile. As you can imagine this is a very pragmatic write up and refers to Agile as a 'Lead Bullet' rather than a 'Silver Bullet'. As with most things, processes included,&amp;nbsp; there is no one size fits all - the skill is working out what and when to use each approach.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-1514928573240878319?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/1514928573240878319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2010/08/couple-of-agile-links.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/1514928573240878319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/1514928573240878319'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2010/08/couple-of-agile-links.html' title='A couple of Agile links'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-4004685888980673085</id><published>2010-07-12T20:59:00.002+10:00</published><updated>2010-07-12T21:47:58.869+10:00</updated><title type='text'>Why I work for Apple and the flaw in the appstore</title><content type='html'>That is right. I work for &lt;a href="http://www.apple.com/"&gt;Apple&lt;/a&gt;*. Of course I don't actually get a salary.&amp;nbsp;In fact I don't have employee number&amp;nbsp;and you won't find me in the payroll system. However,&amp;nbsp;I do sell Apple products. I don't mean to but it just happens. In fact I would guess that the majority of iPad and iPhone owners - also sell Apple products and don't mean to.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;There are probably many different reasons, maybe showing off a new toy or showing people useful apps. How often have you asked someone, how are you finding your iPad and the next minute you are in the middle of a sales pitch of how &lt;a href="http://bit.ly/dsudtG"&gt;awesome&lt;/a&gt; the devices is. Perhaps someone has inquired about a particular app and you give them the entire rundown or not only that app - but all your apps. I've noticed a fair few blogger have been writing reviews of the iPad - again selling the iPad to people that read your blog. &lt;br /&gt;&lt;br /&gt;The apps store is integral to making the iPhone (or iPad) successful. It helps that the app store is integrated into the device. In one easy click I can review and purchase new apps, something to make my life that little bit better. Having the app store easy and accessible, means there is one less barrier to me finding, downloading and buying new apps which make my iPhone (and iPad if I had one!) a more treasured part of my life.&lt;br /&gt;&lt;br /&gt;But the app store is limited and has a flaw - ME.&amp;nbsp; I'm the app stores single point of failure.&lt;br /&gt;&lt;br /&gt;I still need&amp;nbsp;the desire to&amp;nbsp;want to search for new apps. I still need to press that button to see what is new or to search for 'an app for that'. That need could be from a review in a magazine, tv ads, online, being shown an app by a friend or a desire to scratch an itch (metaphorically speaking as I haven't found an app for scratching ...yet!). The store on it's own does nothing. Without something or someone generating the desire to visit the appstore it's just another icon on my phone. &lt;br /&gt;&lt;br /&gt;Apple are clever and have removed as many of the barriers and made the process of searching, reviewing and purchasing has easy as possible. The 'path to purchase' is very consumer focused and painless.&lt;br /&gt;&lt;br /&gt;This is something that &lt;a href="http://www.ericmackonline.com/"&gt;Eric Mack&lt;/a&gt; and &lt;a href="http://www.bruceelgort.com/"&gt;Bruce Elgort&lt;/a&gt; have understood, from what I have read on their blogs and heard on podcasts. They have invested time to make it easy for their customers to review and purchase their apps. Their apps are making Notes and Domino a more treasured solution for their customers - which as we have seen for the iPad and iPhone turns a great solution into an &lt;a href="http://bit.ly/dsudtG"&gt;awesome&lt;/a&gt; solution and one where users are generating the desire in others to search, find and purchase the same solutions.&lt;br /&gt;&lt;br /&gt;So whilst I applaud the efforts of&amp;nbsp; all involved for getting a great &lt;a href="http://www.notesappstore.com/appstore.nsf/Home"&gt;appstore&lt;/a&gt; and a great &lt;a href="https://greenhouse.lotus.com/catalog"&gt;catalog&lt;/a&gt; available for those customers, who are searching for Lotus Notes and Domino solutions. I fear that unless said catalog (or store) is in plain sight, or unless users are motivated to search for a solution then their effort may be wasted. &lt;br /&gt;&lt;br /&gt;In my opinion an appstore (or catalog) on its own, without reviews, tv ads and advocates is nothing more than yet another website.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: xx-small;"&gt;&lt;i&gt;&lt;span style="font-size: x-small;"&gt;* I don't actual work for Apple. In fact I have never worked for Apple and any resemblance to any apple employee is purely coincidental. I do, on occasion, eat apples as they are a healthy and nutritious snack.&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-4004685888980673085?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/4004685888980673085/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2010/07/why-i-work-for-apple-and-flaw-in.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/4004685888980673085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/4004685888980673085'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2010/07/why-i-work-for-apple-and-flaw-in.html' title='Why I work for Apple and the flaw in the appstore'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-7307386746812221277</id><published>2010-07-05T20:00:00.002+10:00</published><updated>2010-07-05T20:02:26.913+10:00</updated><title type='text'>Lotus knows how to respond better to the needs of students</title><content type='html'>Here is a recent IBM case study about a Lotus Notes and Domino solution that Cirrus Australia implemented for a client. It's not unusual or remarkable as Cirrus Australia are continually developing and implementing solutions in Lotus Notes and Domino.&lt;br /&gt;&lt;br /&gt;It is just business as usual. Much the same way as many IBM business partners around the world continue to sell, build and implement solutions every day in Lotus Notes and Domino. It may not be as attention grabbing or as headline worthy as perhaps other types of projects, technology and solutions. Nevertheless, customers are continuing to choose Lotus Notes and Domino based solutions, ticking along, without the fuss and drama - much like a well maintained Domino server.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www-01.ibm.com/software/success/cssdb.nsf/CS/CCLE-82535X?OpenDocument&amp;amp;Site=default&amp;amp;cty=en_us"&gt;Edmund Rice Education Australia transforms student record management across a multi-site learning network&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Moving to a Lotus Notes environment with integrated custom applications enabled easier and quicker access to the information. Lotus Notes provided us with immediate benefits of efficient information management and automatic alerts on important student information &lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;The Flexible Learning Centre Network Lotus Notes project has been so successful that Edmund Rice Education Australia is now also considering rolling out a similar system to another education program.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-7307386746812221277?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/7307386746812221277/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2010/07/lotus-knows-how-to-respond-better-to.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/7307386746812221277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/7307386746812221277'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2010/07/lotus-knows-how-to-respond-better-to.html' title='Lotus knows how to respond better to the needs of students'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-7586100820822432723</id><published>2010-06-09T21:50:00.008+10:00</published><updated>2010-06-09T22:05:39.943+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lotus Knows'/><category scheme='http://www.blogger.com/atom/ns#' term='Lotus'/><title type='text'>Why you should know Lotus</title><content type='html'>The "&lt;a href="http://www.lotusknows.com.au/"&gt;Lotus knows&lt;/a&gt;" marketing campaign has started this week in Australia, which is a great initiative. Lotus Knows has been running in other geographies and has hit our antipodean shores. IBM does not promote specific brands and as such the Lotus team has battled hard to get some funding for this type of&amp;nbsp; activity. It is somewhat ironic as the Lotus brand is the most consumer or business user centric brand in the large IBM portfolio.&lt;br /&gt;&lt;br /&gt;Today Lotus is synonymous with Notes (and Domino). Which is a pity as this is just one product in the entire brand. This isn't a new phenomenon. I remember a time when Lotus was synonymous with Lotus 123. When someone said Lotus they actually meant Lotus 123. Not Lotus Freelance, Lotus Word Pro or Lotus Organizer, which at the time were also part of the Lotus brand.&lt;br /&gt;&lt;br /&gt;The same is true today. There are more products in the Lotus brand than simply Lotus Notes. Some really leading edge and innovative products, that aren't even based on the Notes architecture. The Lotus Knows campaign showcases the product in scenarios such as;&lt;br /&gt;&lt;br /&gt;Lotus Knows...how to have a meeting in the cloud&lt;br /&gt;Lotus Knows...you should bring an umbrella to the meeting&lt;br /&gt;&lt;br /&gt;The theme continues with other scenarios. &lt;br /&gt;&lt;br /&gt;You should start seeing the ads around the streets, in magazines and newspapers and&amp;nbsp; you can check out the videos, which are interesting AND amusing at the website &lt;a href="http://www.lotusknows.com.au/"&gt;www.lotusknows.com.au&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;So why should you &lt;i&gt;know&lt;/i&gt; more about the Lotus brand ?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;As I've said, the Lotus brand contains some very innovative and leading edge solutions to the way business consumers are wanting to use technology to be more productive, efficient and agile. It is these users that are driving their IT departments to keep up with what they use outside of work. Lotus has solutions for these consumers and done in a way to keep your IT and security folks happy. Solution such as;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Social Computing&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;When you think of Social Computing, think of Facebook® for the enterprise. Social Computing products and services offer companies an easy and cost-effective way to uncover unknown and latent expertise, react to changing workforce dynamics and adapt to changing markets.&amp;nbsp;&lt;/blockquote&gt;&amp;nbsp;&lt;b&gt;Collaboration in the Cloud&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Access via the cloud to the latest and greatest in messaging, social networking and web conferencing facilities is one of the fastest growing segments in the marketplace today. All you need is internet access and IBM can provide you with a package of solutions in a cost per person per month basis to achieve your organisations collaborative, web conferencing and social networking objectives. &lt;/blockquote&gt;&amp;nbsp;&lt;b&gt;Telephony &amp;amp; Conferencing&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Foster innovation and business agility by making it easer for people to find, reach and collaborate with one another through a unified communications experience from their familiar devices, applications, and processes. Capabilities include instant messaging to PCs and mobile devices, conducting web and video conferencing as well as “click to call” features and capabilites.&amp;nbsp;&lt;/blockquote&gt;&lt;br /&gt;&lt;b&gt;Web Portals &amp;amp; Dashboards &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Strengthen relationships by giving your customers and partners a new online voice and include them in your business processes. Web portals help customers, employees and partners to work more effectively together. They put people, information and tools in one place that’s consistent, personal and convenient.&lt;/blockquote&gt;&lt;br /&gt;&lt;b&gt;Mashups&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Mashups allow you to combine (to “mash-up”) disparate sources of information – mashing them to create purpose specific knowledge in real time. This can help organisations boost creativity, innovation, and responsiveness by unlocking and transforming existing data into new applications that address business challenges. &lt;/blockquote&gt;&lt;br /&gt;&lt;h3&gt;&lt;/h3&gt;&lt;b&gt;Email, Calendar and Instant Messaging&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Flexibility and the ability to make business decisions quickly are key to determining the right advanced messaging solution to meet your company’s unique business needs. IBM provides flexible and scalable messaging solutions that empower people with a single point of access to people, business applications, and resources across and beyond the enterprise. &lt;/blockquote&gt;So if you hear your colleagues, friends or more importantly your competitors talking about any of the following names, then they are talking about Lotus products and they &lt;i&gt;know&lt;/i&gt;, what &lt;a href="http://www.lotusknows.com.au/"&gt;Lotus Knows&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Connections&lt;br /&gt;Quickr&lt;br /&gt;Sametime&lt;br /&gt;Notes&lt;br /&gt;Traveler &lt;br /&gt;iNotes &lt;br /&gt;Domino&lt;br /&gt;Forms&lt;br /&gt;Forms Turbo &lt;br /&gt;Protector&lt;br /&gt;Symphony&lt;br /&gt;Portal&lt;br /&gt;Mashups&lt;br /&gt;Live Engage&lt;br /&gt;Live Connections&lt;br /&gt;Live Meetings&lt;br /&gt;Live Events&lt;br /&gt;Live iNotes&lt;br /&gt;Live Notes&lt;br /&gt;&lt;br /&gt;If &lt;i&gt;you &lt;/i&gt;would like to &lt;i&gt;know&lt;/i&gt; what everyone else is talking about then checkout the &lt;a href="http://www.lotusknows.com.au/"&gt;website&lt;/a&gt; or get in contact with me or one of my colleagues at &lt;a href="http://www.cirrusaustralia.com.au/"&gt;www.cirrusaustralia.com.au&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.cirrusaustralia.com.au/"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-7586100820822432723?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/7586100820822432723/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2010/06/why-you-should-know-lotus.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/7586100820822432723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/7586100820822432723'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2010/06/why-you-should-know-lotus.html' title='Why you should know Lotus'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-48162271850726503</id><published>2010-04-06T10:06:00.000+10:00</published><updated>2010-04-06T21:12:46.271+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPad'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><title type='text'>iPad a game changer or eye candy ?</title><content type='html'>I was on the fence about the iPad. In fact I was leaning towards the opinion of&amp;nbsp; 'it's a gadget for those with disposable income' then I saw this and changed my mind.&lt;br /&gt;&lt;br /&gt;&lt;a class="title" href="http://alexxhenry.com/blog/ipad/" rel="bookmark" style="text-decoration: none;" title="Permanent Link: Digital Magazine Motion Cover and Feature for the iPad"&gt;Digital Magazine Motion Cover and Feature for the iPad&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;Watch both video's and see how the nature of publishing could change. The nature in which we consume information and be entertained is about to enter a new era. It could be as life changing as when the first television was introduced to the living room. Time will tell, for sure, but you can envisage the potential. Already my iPhone has changed my own browsing behavior around the home, and I can see that &lt;a href="http://planetlotus.org/68bc1c"&gt;others&lt;/a&gt; are keen for the iPad to be the next step in the evolution.&lt;br /&gt;&lt;br /&gt;The tactile nature of the interface is far more intuitive with your fingers, than a mouse and keyboard for consuming. Like eating pizza with a knife and fork, it's way more natural using your hands. That said, creating content and entertainment will be a tougher call.&lt;br /&gt;&lt;br /&gt;There is already a lot of&amp;nbsp; hype and &lt;a href="http://www.zdnet.com.au/aussie-ipad-mules-their-story-339302245.htm"&gt;some&lt;/a&gt; will go to extraordinary lengths to be the first to have the first of a new wave of devices.&lt;br /&gt;&lt;br /&gt;Of course not everyone will agree, some will use the iPad to entertain others in &lt;a href="http://media.smh.com.au/technology/tech-talk/ipad-stress-testing-goes-viral-1291253.html"&gt;new&lt;/a&gt; and &lt;a href="http://media.smh.com.au/technology/tech-talk/ipad-smashed-with-baseball-bat-1290395.html"&gt;unique&lt;/a&gt; ways.&lt;br /&gt;&lt;br /&gt;Personally, I'm not a bleeding edge person so I'll wait and watch the transformation and see what the next version will be like.&lt;br /&gt;&lt;br /&gt;It sure is pretty though!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-48162271850726503?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/48162271850726503/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2010/04/ipad-game-changer-or-eye-candy.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/48162271850726503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/48162271850726503'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2010/04/ipad-game-changer-or-eye-candy.html' title='iPad a game changer or eye candy ?'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-5730200587093223164</id><published>2010-03-22T10:50:00.002+11:00</published><updated>2010-03-22T10:52:30.639+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lotus'/><category scheme='http://www.blogger.com/atom/ns#' term='Notes 8'/><category scheme='http://www.blogger.com/atom/ns#' term='Domino'/><title type='text'>FYI : Understanding the IBM Lotus Notes 8.5.x client directory structure</title><content type='html'>&lt;h1 style="font-weight: normal;"&gt;&lt;span style="font-size: small;"&gt;&lt;span id="view:_id1:_id72:subject"&gt;&amp;nbsp;Worth a repost for those who have not seen it.&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h1 style="font-weight: normal;"&gt;&lt;a href="http://www-10.lotus.com/ldd/dominowiki.nsf/dx/Understanding_the_IBM_Lotus_Notes_8.5.x_client_directory_structure"&gt;&lt;span style="font-size: small;"&gt;&lt;span id="view:_id1:_id72:subject"&gt;http://www-10.lotus.com/ldd/dominowiki.nsf/dx/Understanding_the_IBM_Lotus_Notes_8.5.x_client_directory_structure&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;h1 style="font-weight: normal;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span id="view:_id1:_id72:computedField6"&gt;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.&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;&lt;/blockquote&gt;&amp;nbsp;&lt;span style="font-size: small;"&gt;&lt;span id="view:_id1:_id72:subject"&gt;Thanks to &lt;a href="http://au.linkedin.com/in/stuarthickson"&gt;Stuart&lt;/a&gt; for sending through this info.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-5730200587093223164?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/5730200587093223164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2010/03/fyi-understanding-ibm-lotus-notes-85x.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/5730200587093223164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/5730200587093223164'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2010/03/fyi-understanding-ibm-lotus-notes-85x.html' title='FYI : Understanding the IBM Lotus Notes 8.5.x client directory structure'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-1909249349365432413</id><published>2010-02-25T22:25:00.003+11:00</published><updated>2010-02-25T23:22:58.564+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSS'/><title type='text'>My take on Dec's open source post.</title><content type='html'>I was going to post a comment to Declan's &lt;a href="http://www.qtzar.com/blogs/qtzar.nsf/d6plinks/DSLH-82YK6L"&gt;post &lt;/a&gt;about the yellow bubble open source developers and reflect on my experience. However, seeing as how my post for 2010 are below par, here is my first post for 2010!&lt;br /&gt;&lt;br /&gt;Brians' &lt;a href="http://www.qtzar.com/blogs/qtzar.nsf/#comment-3A4FE614DEDA2D1A852576D50001EF67"&gt;comment&lt;/a&gt; struck very close to home in relation to my experience. It was only when I either worked for a company in a non technology sector or when I worked (almost) for myself, that I could freely contribute code, applications and snippets that I thought might be useful.&lt;br /&gt;&lt;br /&gt;I'm glad that I did, as I feel as though I've returned something back to a community that had helped me along the way. I even tried, rather woefully I might add, to contribute to &lt;a href="http://www.bleedyellow.com/blogs/dotdomino/?lang=en_au"&gt;Peters&lt;/a&gt; .Scrum project, until it became very obvious that free time and energy are at a premium at this stage of my life, when other commitments like family, kids and a new job demand more. I see similar pressures effecting a number of the &lt;a href="http://www.codestore.net/"&gt;key&lt;/a&gt; &lt;a href="http://benpoole.com/"&gt;members&lt;/a&gt; of the yellow open source bubble.&lt;br /&gt;&lt;br /&gt;I guess that the sole focus of cutting code has given way to other pursuits and the new blood is not following in the footsteps troden by &lt;a href="http://www.nsftools.com/"&gt;those&lt;/a&gt; before them.&lt;br /&gt;&lt;br /&gt;Why is that ?&lt;br /&gt;&lt;br /&gt;Well, for a start, there are more technologies to choose from to invest your free time. iPhone, Flex, Air, Silverlight, LAMP to name a few. One argument for proprietary software is that the developers are paid to build the software, where as open source developers will choose technology to invest their time in based on what is interesting and what is likely to be profitable, either financially, or in standing within a peer group that they wish to belong too. The argument goes, that majority of open source developers will follow the trend of what is popular and when the next shiny trend comes along, their contributions will follow, leaving behind older projects to go stale with little to no progress.&lt;br /&gt;&lt;br /&gt;I guess that this isn't a yellow bubble only thing, but effects open source in general where the code continuation is pretty much down to the good will and enthusiasm of a few.&lt;br /&gt;&lt;br /&gt;Of course having your contributions, &lt;a href="http://www.openntf.org/Projects/pmt.nsf/ProjectLookup/xTalk%20Discussion%20Forums"&gt;reused without credit&lt;/a&gt; does little to motivate. The expectation from far flung locales that you will provide free and unlimited support to help their business simple because you have donated your time, intelect and energy in the hope of helping those who are keen to help themselves, rather than those that wish to be spoon fed - does little to encourage continued goodwill.&lt;br /&gt;&lt;br /&gt;With all that in mind, would I contribute to open source again ?&lt;br /&gt;&lt;br /&gt;Yes.&lt;br /&gt;&lt;br /&gt;When will that be ?&lt;br /&gt;&lt;br /&gt;Dunno.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-1909249349365432413?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/1909249349365432413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2010/02/my-take-on-decs-open-source-posts.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/1909249349365432413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/1909249349365432413'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2010/02/my-take-on-decs-open-source-posts.html' title='My take on Dec&apos;s open source post.'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-7685214067961242831</id><published>2009-12-17T10:32:00.002+11:00</published><updated>2009-12-17T10:33:59.278+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lotus'/><title type='text'>IBM Lotus back with with a vengeance...</title><content type='html'>&lt;blockquote&gt;In case you haven’t noticed, IBM Lotus not only didn’t go away, it’s here with a vengeance. &lt;b&gt;LotusLive&lt;/b&gt;.com claims 18 million users, the &lt;b&gt;8.5 release of Notes/Domino&lt;/b&gt; is a winner in storage savings, &lt;b&gt;Lotus Connections&lt;/b&gt; beats other social software platforms on many dimensions, and &lt;b&gt;Sametime’s&lt;/b&gt; pushing the envelope on real-time collaboration at a global scale.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;a href="http://blogs.zdnet.com/forrester/?p=346"&gt;Zdnet.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-7685214067961242831?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/7685214067961242831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2009/12/ibm-lotus-back-with-with-vengeance.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/7685214067961242831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/7685214067961242831'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2009/12/ibm-lotus-back-with-with-vengeance.html' title='IBM Lotus back with with a vengeance...'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-5575217808552050481</id><published>2009-12-09T10:06:00.006+11:00</published><updated>2009-12-09T10:10:25.653+11:00</updated><title type='text'>Cirrus Australia #6 in CRN Fast Top 50</title><content type='html'>Cirrus Australia has just been awarded sixth place in CRN’s inaugural Fast50, a competition which ranks Australia’s top fifty IT resellers in terms of net sales revenue growth from financial years 2007-2008 to 2008-2009. The award capped off&amp;nbsp; Cirrus Australias best year on record – a year in which revenue grew by 156%, our Sydney office was significantly expanded and we achieved IBM Premier Business Partner status.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_zz66mErCWS8/Sx7ZNNALvbI/AAAAAAAAAJg/Sgu87Y4-YEU/s1600-h/0.D8.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_zz66mErCWS8/Sx7ZNNALvbI/AAAAAAAAAJg/Sgu87Y4-YEU/s320/0.D8.gif" /&gt;&lt;/a&gt;I've been meaning to blog about the culture that is at the heart if Cirrus Australia, but I've been so busy enjoying my job that I've neglected the blog a little. However, Darren articulates it better.&lt;br /&gt;&lt;br /&gt;Darren also attributes Cirrus Australia’s success to the focus on quality of life for staff, customers and stakeholders that is fostered in the company.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;“The whole idea of using quality of life to measure outcomes has been absolutely fantastic. This is our mission statement and rather than merely paying lip service to it, it really forms the base culture of the organisation. I have a company full of incredibly bright people who are motivated to improve the quality of life for their customers. The team specialises in IBM software implementation and providing a solution that works for their customers is what drives them. When this culture pervades the organisation, you end up with staff on top of their game. What we have is a very motivated and technically proficient offering,&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;You can read more about the Cirrus Australia approach here.&lt;br /&gt;&lt;a href="http://www.cirrusaustralia.com.au/wps/wcm/connect/cirrus/site/about/latestnewsitems#fast50"&gt;http://www.cirrusaustralia.com.au/wps/wcm/connect/cirrus/site/about/latestnewsitems#fast50&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;and the Fast50 article on CRN&lt;br /&gt;&lt;a href="http://www.crn.com.au/News/161995,fast50-top-10-unveiled.aspx"&gt;http://www.crn.com.au/News/161995,fast50-top-10-unveiled.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-5575217808552050481?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/5575217808552050481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2009/12/cirrus-australia-6-in-crn-fast-top-50.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/5575217808552050481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/5575217808552050481'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2009/12/cirrus-australia-6-in-crn-fast-top-50.html' title='Cirrus Australia #6 in CRN Fast Top 50'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_zz66mErCWS8/Sx7ZNNALvbI/AAAAAAAAAJg/Sgu87Y4-YEU/s72-c/0.D8.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-8299768927925948257</id><published>2009-11-13T16:24:00.001+11:00</published><updated>2009-11-13T16:25:04.182+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lotus'/><category scheme='http://www.blogger.com/atom/ns#' term='Domino'/><title type='text'>Lotus Notes is shaking that 'legacy' tag</title><content type='html'>It looks like Lotus Notes is shaking that 'legacy' tag.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;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.&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;"Over the years, there has been a very conscious effort to avoid legacy systems," Clasquin explains.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Read the full article.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.zdnet.com.au/insight/business/soa/CIO-profile-Tony-Clasquin-of-Bankwest/0,139023749,339299490,00.htm"&gt;Zdnet CIO Profile : Bank West&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-8299768927925948257?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/8299768927925948257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2009/11/lotus-notes-is-shaking-that-legacy-tag.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/8299768927925948257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/8299768927925948257'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2009/11/lotus-notes-is-shaking-that-legacy-tag.html' title='Lotus Notes is shaking that &apos;legacy&apos; tag'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-3918436782361115933</id><published>2009-10-07T22:05:00.004+11:00</published><updated>2009-10-07T22:09:00.696+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lotus'/><title type='text'>Interesting Announcements in the IBM Lotus World</title><content type='html'>There has been a flurry of announcements on &lt;a href="http://www.edbrill.com/ebrill/edbrill.nsf"&gt;Ed Brills&lt;/a&gt; blog recently. They are all around changes in the Lotus world for the impending release of Lotus Notes and Domino 8.5.1.&lt;br /&gt;&lt;br /&gt;Here is a short summary&lt;br /&gt;&lt;ul&gt;&lt;li&gt;8.5.1 will be available Monday 12th October&lt;/li&gt;&lt;li&gt;Domino Designer Client will now be FREE&lt;/li&gt;&lt;li&gt;Client Access Licence (CAL) has been simplified basically an Enterprise CAL and a Messaging CAL&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;blockquote&gt;We also wanted to address the changing nature of client access. For too long, we have asked you as customers to decide whether a particular user is a "Notes user" or a "browser user" or a "mobile user". &amp;nbsp;We thought it might just make more sense, given the trend towards ubiquitous access, if an end-user became a "Domino user", with the choice of tools and interfaces as needed.&lt;br /&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;An additional feature is the inclusion of the &lt;a href="http://www.ibm.com/software/lotus/products/mobileconnect/"&gt;&lt;span style="text-decoration: underline;"&gt;Lotus Mobile Connect&lt;/span&gt;&lt;/a&gt; client license in the Lotus Domino Enterprise Client Access License.&lt;/li&gt;&lt;/ul&gt;And it looks like there is more in 8.5.1...&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;That concludes my three-part introduction to Notes/Domino 8.5.1 -- and I haven't even talked about the technology yet, from the iPhone support in Traveler to the new Eclipse Lotuscript Editor to the Notes UI improvements to the further enhancements in DAOS.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Stay tuned..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-3918436782361115933?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/3918436782361115933/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2009/10/interesting-announcements-in-ibm-lotus.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/3918436782361115933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/3918436782361115933'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2009/10/interesting-announcements-in-ibm-lotus.html' title='Interesting Announcements in the IBM Lotus World'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-168782055569059482</id><published>2009-09-07T20:30:00.000+10:00</published><updated>2009-09-07T20:30:01.255+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blogging'/><title type='text'>Yes, I'm still here.</title><content type='html'>I've change employers - what! you didn't notice. I'm not surprised. The more observant of you might have noticed the small update to the disclaimer and update to my linkedin profile. Since joining &lt;a href="http://www.cirrusaustralia.com.au/"&gt;Cirrus Australia&lt;/a&gt; I've not had much time to spend on keeping up with all things yellow and planetlotus. The last two months have been a blur, a very busy and very good blur. I've had plenty of commentary and ideas that I want to post about, it's just that finding the time is a challenge right now (so don't pull my link just yet Yancy).&lt;br /&gt;&lt;br /&gt;You can read more about Cirrus Australia, Australia's newest IBM premier business partner, on our recently updated website.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cirrusaustralia.com.au/"&gt;www.cirrusaustralia.com.au&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-168782055569059482?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/168782055569059482/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2009/09/yes-im-still-here.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/168782055569059482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/168782055569059482'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2009/09/yes-im-still-here.html' title='Yes, I&apos;m still here.'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-3869472386997479572</id><published>2009-06-12T09:00:00.000+10:00</published><updated>2009-06-12T18:05:41.889+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Notes 8'/><category scheme='http://www.blogger.com/atom/ns#' term='UX'/><category scheme='http://www.blogger.com/atom/ns#' term='UI'/><title type='text'>Simply Amazing - if Apple did a medical kiosk...</title><content type='html'>It's not often that you see an application that simply blows you away. This video has been receiving well deserved praise in the yellow-verse during the last week. If you are not a member, of said yellow-verse, you might have missed it. Frankly, its  well worth watching regardless of which is your preferred platform/language/religon/taste in beer yada, yada.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/BnYIYHjm1qo&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;hl=en&amp;amp;feature=player_embedded&amp;amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.lotus911.com/nathan/escape.nsf/"&gt;Nathan Freeman&lt;/a&gt; and &lt;a href="http://interfacematters.com/"&gt;Chris Blatnick&lt;/a&gt; have been presenting and actively evangalising 'impactful' interfaces. This new one, blows away what has been in their presentations thus far (which has been pretty good anyway). 'Bones' sets the bar well and truly high. The whole project, not just the UI, is pretty astounding. &lt;a href="http://www.bleedyellow.com/blogs/dotdomino/entry/notes_8_5_now_has_a_real_back_bone2"&gt;Peter Presnell&lt;/a&gt;  has a good write up which is worth a read.&lt;br /&gt;&lt;br /&gt;Nathan and the team at &lt;a href="http://www.lotus911.com/"&gt;Lotus911&lt;/a&gt; have worked out some of the trickier details in crafting the interface, kiosk mode and composite applications, but have been smart in choosing Lotus Notes &amp;amp; Domino for the ancillary parts of the project around security, encryption and network failure. They've also been smart in choosing the hardware specifically for the target environment.&lt;br /&gt;&lt;br /&gt;Dare I say a smart choice for a &lt;a href="http://www.smartplanet.com/"&gt;smart planet&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The take-away for Lotus Notes developers, who don't develop kiosk applications all that often, is that with composite applications you &lt;span style="font-weight: bold; font-style: italic;"&gt;can&lt;/span&gt; craft any user interface you or your users desire.&lt;br /&gt;&lt;br /&gt;It may not be easy, but at least now we know it's possible.&lt;br /&gt;&lt;br /&gt;Well done Lotus911, Nathan and the Team.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-3869472386997479572?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/3869472386997479572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2009/06/simply-amazing-if-apple-did-medical.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/3869472386997479572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/3869472386997479572'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2009/06/simply-amazing-if-apple-did-medical.html' title='Simply Amazing - if Apple did a medical kiosk...'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-3597953880442889310</id><published>2009-05-25T09:18:00.007+10:00</published><updated>2009-05-25T09:44:58.138+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>Paper : Introducing Scrum into Government</title><content type='html'>Here is an award winning industry paper by Adrian Royce, from the &lt;a href="http://aswec2009.itee.uq.edu.au/"&gt;Australian Software Engineering Conference&lt;/a&gt; (ASWEC 2009), via &lt;a href="http://blog.softwarewithstyle.com/2009/05/20/agile-in-government-paper.aspx"&gt;Rowans blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here are some extracts;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;This paper outlines the steps the author took in introducing the Scrum agile process into the Dept of Housing and what lessons were learnt.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Housing has now been running the ‘Scrum’ agile project delivery process for over 2 years. During that time all software projects have been delivered on or ahead of agreed time frames. ICT staff, engaged in the Scrum process, became motivated about delivering value to the client. ICT staff morale increased which led to staff retention. Feedback from business units across the department indicates that the usage of Scrum is a success.&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;The agile process called “Scrum” was selected over the&lt;br /&gt;alternatives because it:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Emphasized communication and collaboration, functioning software, and the flexibility to adapt to emerging business realities[1];&lt;/li&gt;&lt;li&gt;Was not just relevant for developers but the entireproject team; and&lt;/li&gt;&lt;li&gt;Embraced agile philosophies such as the Agile Manifesto[2].&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;I particularly like the summary, which highlights an often missed attribute of Scrum.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;The use of Scrum was a success at the Department of Housing. However even as a lightweight methodology, it requires much discipline.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Whilst Scrum is an Agile method, Agile doesn't mean that there is a lack of discipline. In fact the contrary is true, in that Scrum and XP have a great deal of discipline. This is how higher quality software is produced. What is different from traditional 'waterfall' development is that redundant and wasteful practice has been removed.&lt;br /&gt;&lt;br /&gt;If you are interested in such things, or how Scrum and Prince 2 integrated for this department, then go read the paper.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-3597953880442889310?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/3597953880442889310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2009/05/paper-introducing-scrum-into-government.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/3597953880442889310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/3597953880442889310'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2009/05/paper-introducing-scrum-into-government.html' title='Paper : Introducing Scrum into Government'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-4704011495494199842</id><published>2009-05-19T20:47:00.003+10:00</published><updated>2009-05-19T20:50:49.170+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Ubuntu 9.04, Nvidia and GeForce4 MX440</title><content type='html'>If nothing above applies, move along - nothing to see. This is one for the google search.&lt;br /&gt;&lt;br /&gt;If you are trying to get Ubuntu and a GeForce4 MX 440 with AGP8X working at a decent resolution then the following may help. The information is a little scattered, so here it is in one place.&lt;br /&gt;&lt;br /&gt;1. Download the latest version of the Nvidia driver &lt;a href="http://www.nvidia.com/object/linux_display_x86_96.43.11.html"&gt;NVIDIA-Linux-x86-96.43.11-pkg1.run&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. Install (instructions at the link)&lt;br /&gt;&lt;br /&gt;If the screen fails to come up, or displays an error about choosing a different resolution and refresh rate then boot in safe mode, no user interface.&lt;br /&gt;&lt;br /&gt;3. Modify your /etc/X11/xorg.conf like below (backup the default version first!) - you might need to brush up on your &lt;a href="http://www.lagmonster.org/docs/vi.html"&gt;vi commands&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Restart.&lt;br /&gt;&lt;br /&gt;You should see more resolution options when you open the Nvidia settings. You can then set your resolution.&lt;br /&gt;&lt;br /&gt;4. To make the resolution stick, update the file /home/.username/.config/monitors.xml with your preferred resolution.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Links for futher information&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://bugs.launchpad.net/ubuntu/+source/nvidia-settings/+bug/362704/comments/6"&gt;https://bugs.launchpad.net/ubuntu/+source/nvidia-settings/+bug/362704/comments/6&lt;/a&gt;&lt;br /&gt;&lt;a href="http://ubuntuguide.org/wiki/Ubuntu:Jaunty#Install_Latest_Nvidia.2FATI_drivers"&gt;http://ubuntuguide.org/wiki/Ubuntu:Jaunty#Install_Latest_Nvidia.2FATI_drivers&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Other Notes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1. Every time that you upgrade, you might need to re-install the Nvidia driver.&lt;br /&gt;2. If you have a more modern card you might not need to do this.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Files&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;xorg.conf&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;# nvidia-settings: X configuration file generated by nvidia-settings&lt;br /&gt;# nvidia-settings:  version 1.0  (buildmeister@builder63)  Mon Feb 23 15:44:13 PST 2009&lt;br /&gt;&lt;br /&gt;Section "ServerLayout"&lt;br /&gt;Identifier     "Layout0"&lt;br /&gt;Screen      0  "Screen0" 0 0&lt;br /&gt;InputDevice    "Keyboard0" "CoreKeyboard"&lt;br /&gt;InputDevice    "Mouse0" "CorePointer"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Files"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Module"&lt;br /&gt;Load           "dbe"&lt;br /&gt;Load           "extmod"&lt;br /&gt;Load           "type1"&lt;br /&gt;Load           "freetype"&lt;br /&gt;Load           "glx"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "ServerFlags"&lt;br /&gt;Option         "Xinerama" "0"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "InputDevice"&lt;br /&gt;# generated from default&lt;br /&gt;Identifier     "Mouse0"&lt;br /&gt;Driver         "mouse"&lt;br /&gt;Option         "Protocol" "auto"&lt;br /&gt;Option         "Device" "/dev/psaux"&lt;br /&gt;Option         "Emulate3Buttons" "no"&lt;br /&gt;Option         "ZAxisMapping" "4 5"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "InputDevice"&lt;br /&gt;# generated from default&lt;br /&gt;Identifier     "Keyboard0"&lt;br /&gt;Driver         "kbd"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Monitor"&lt;br /&gt;# HorizSync source: xconfig, VertRefresh source: xconfig&lt;br /&gt;Identifier     "Monitor0"&lt;br /&gt;VendorName     "Unknown"&lt;br /&gt;ModelName      "CRT-0"&lt;br /&gt;HorizSync       30.0 - 81.0&lt;br /&gt;VertRefresh     60.0&lt;br /&gt;Option         "DPMS"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Device"&lt;br /&gt;Identifier     "Videocard0"&lt;br /&gt;Driver         "nvidia"&lt;br /&gt;VendorName     "NVIDIA Corporation"&lt;br /&gt;BoardName      "GeForce4 MX 440 with AGP8X"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Screen"&lt;br /&gt;Identifier     "Screen0"&lt;br /&gt;Device         "Videocard0"&lt;br /&gt;Monitor        "Monitor0"&lt;br /&gt;DefaultDepth    24&lt;br /&gt;Option         "metamodes" "1152x864_60 +0+0; 1280x1024_60 +0+0; 1024x768 +0+0; 800x600 +0+0; 640x480 +0+0; 800x600_60 +0+0"&lt;br /&gt;SubSection     "Display"&lt;br /&gt;    Depth       24&lt;br /&gt;    Modes      "1600x1200" "1280x1024" "1024x768" "800x600" "640x480"&lt;br /&gt;EndSubSection&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;monitors.xml&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;monitors version="1"&amp;gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;  &amp;lt;clone&amp;gt;no&amp;lt;/clone&amp;gt;&lt;br /&gt;  &amp;lt;output name="default"&amp;gt;&lt;br /&gt;      &amp;lt;vendor&amp;gt;???&amp;lt;/vendor&amp;gt;&lt;br /&gt;      &amp;lt;product&amp;gt;0x0000&amp;lt;/product&amp;gt;&lt;br /&gt;      &amp;lt;serial&amp;gt;0x00000000&amp;lt;/serial&amp;gt;&lt;br /&gt;&amp;lt;width&amp;gt;1152&amp;lt;/width&amp;gt;&lt;br /&gt;      &amp;lt;height&amp;gt;864&amp;lt;/height&amp;gt;&lt;br /&gt;      &amp;lt;rate&amp;gt;60&amp;lt;/rate&amp;gt;&lt;br /&gt;      &amp;lt;x&amp;gt;0&amp;lt;/x&amp;gt;&lt;br /&gt;      &amp;lt;y&amp;gt;0&amp;lt;/y&amp;gt;&lt;br /&gt;      &amp;lt;rotation&amp;gt;normal&amp;lt;/rotation&amp;gt;&lt;br /&gt;&amp;lt;reflect_x&amp;gt;no&amp;lt;/reflect_x&amp;gt;&lt;br /&gt;      &amp;lt;reflect_y&amp;gt;no&amp;lt;/reflect_y&amp;gt;&lt;br /&gt;  &amp;lt;/output&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&amp;lt;/monitors&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-4704011495494199842?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/4704011495494199842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2009/05/nvidia-ubuntu-904-nvidia-and-geforce4.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/4704011495494199842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/4704011495494199842'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2009/05/nvidia-ubuntu-904-nvidia-and-geforce4.html' title='Ubuntu 9.04, Nvidia and GeForce4 MX440'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-7024754442941758316</id><published>2009-05-14T12:29:00.006+10:00</published><updated>2009-05-14T14:09:30.537+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lotus'/><category scheme='http://www.blogger.com/atom/ns#' term='UX'/><category scheme='http://www.blogger.com/atom/ns#' term='UI'/><category scheme='http://www.blogger.com/atom/ns#' term='Domino'/><title type='text'>My quick tips for UI design and another example</title><content type='html'>&lt;div&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Style&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;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.&lt;br /&gt;&lt;br /&gt;1. Rule of thirds&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://desktoppub.about.com/cs/pagelayout/qt/rule_of_thirds.htm"&gt;http://desktoppub.about.com/cs/pagelayout/qt/rule_of_thirds.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. Complementary Colours&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.easyrgb.com/index.php?X=HARM"&gt;http://www.easyrgb.com/index.php?X=HARM&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.colourlovers.com/"&gt;http://www.colourlovers.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3. Restrict the numbers of colours&lt;br /&gt;&lt;br /&gt;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 &lt;a href="http://www.photoshoplab.com/web20-design-kit.html"&gt;violator&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;4. Consistent Fonts&lt;br /&gt;&lt;br /&gt;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 &lt;a href="http://www.smh.com,au/"&gt;websites&lt;/a&gt; of traditional &lt;a href="http://www.theaustralian.com.au/"&gt;printed&lt;/a&gt; materials like newspapers that have a long history of serif fonts.&lt;br /&gt;&lt;br /&gt;5. Alignment&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.design-lib.com/alignment-in-graphic-design-gd.php"&gt;http://www.design-lib.com/alignment-in-graphic-design-gd.php&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;6. White space&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Whitespace is often used to create a balanced, harmonious layout&lt;/blockquote&gt;&lt;br /&gt;&lt;a href="http://www.alistapart.com/articles/whitespace"&gt;http://www.alistapart.com/articles/whitespace&lt;/a&gt;&lt;br /&gt;&lt;a href="http://interfacematters.com/2009/03/cheap-ui-trick-add-whitespace-with.html"&gt;http://interfacematters.com/2009/03/cheap-ui-trick-add-whitespace-with.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Function&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here are my five functional guidelines.&lt;br /&gt;&lt;br /&gt;1. Hide the irrelevant and clutter&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;2. Consistent behavior&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. Simplify the choices&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;4. Remove Mild Annoyances&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;5. Proactive help&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sample from the archive&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As promised, here is a user interface make over from the archives, that included some (but not all) of my guidelines.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Form&lt;/span&gt;. Note rule of thirds, colours, alignment and whitespace.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_zz66mErCWS8/SgkayNOl5xI/AAAAAAAAAJY/tqFwIpbR1pE/s1600-h/doco-2.jpg"&gt;&lt;img style="margin: 0px auto 10px; text-align: center; width: 400px; display: block; height: 289px; cursor: pointer;" id="BLOGGER_PHOTO_ID_5334824683443709714" alt="" src="http://1.bp.blogspot.com/_zz66mErCWS8/SgkayNOl5xI/AAAAAAAAAJY/tqFwIpbR1pE/s400/doco-2.jpg" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-7024754442941758316?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/7024754442941758316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2009/05/my-quick-tips-for-ui-design-and-another.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/7024754442941758316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/7024754442941758316'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2009/05/my-quick-tips-for-ui-design-and-another.html' title='My quick tips for UI design and another example'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_zz66mErCWS8/SgkayNOl5xI/AAAAAAAAAJY/tqFwIpbR1pE/s72-c/doco-2.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-1449618034908862388</id><published>2009-05-12T15:36:00.004+10:00</published><updated>2009-05-12T15:59:12.180+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UX'/><category scheme='http://www.blogger.com/atom/ns#' term='UI'/><title type='text'>UI : what's the value of eye candy ?</title><content type='html'>Would you like to add some eye candy to your applications or website ? Need to justify to the boss some budget for a graphic designer ? or maybe even that Photoshop 101 course ?&lt;br /&gt;&lt;br /&gt;Have a look at this &lt;a href="http://www.alistapart.com/articles/indefenseofeyecandy"&gt;article&lt;/a&gt; on &lt;a href="http://www.alistapart.com/"&gt;a list apart&lt;/a&gt;, which explains why eye candy is more than just decoration.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;According to a &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.consumerwebwatch.org/news/report3_credibilityresearch/stanfordPTL.pdf"&gt;2002 study&lt;/a&gt;&lt;span style="font-style: italic;"&gt;, the “appeal of the overall visual design of a site, including layout, typography, font size, and color schemes,” is the number one factor we use to evaluate a website’s credibility.&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;That's right, if your website design dates back to the 1990's then perhaps you should think about adding a bit more eye candy or giving it a makeover.&lt;br /&gt;&lt;br /&gt;The article also points out that, apparently, attractive things work better.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;Okay, so maybe perceptions are important to product design. But what about “real” usability concerns such as lower task completion times or fewer difﬁculties? Do attractive products actually work better? This idea was tested in a study conducted in 1995 (and then again in 1997). Donald Norman describes it in detail in his book Emotional Design.&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;So there you have it, eye candy does have value.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-1449618034908862388?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/1449618034908862388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2009/05/ui-whats-value-of-eye-candy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/1449618034908862388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/1449618034908862388'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2009/05/ui-whats-value-of-eye-candy.html' title='UI : what&apos;s the value of eye candy ?'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-7039781033252807795</id><published>2009-05-08T11:30:00.002+10:00</published><updated>2009-05-08T14:18:53.386+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>Scrum Intro Presentation</title><content type='html'>From  &lt;a href="http://www.scrummaster.com.au/Article.mvc/Detail/56"&gt;ScrumMaster.com.au&lt;/a&gt; website is a great introduction to Scrum. The presentation covers the  the roles, the flow, the theory and artefacts.&lt;br /&gt;&lt;br /&gt;&lt;img style="visibility: hidden; width: 0px; height: 0px;" src="http://counters.gigya.com/wildfire/IMP/CXNID=2000002.0NXC/bT*xJmx*PTEyNDE3NDU4NDA5MjgmcHQ9MTI*MTc*NTg1OTI2NSZwPTEwMTkxJmQ9c3NfZW1iZWQmZz*yJnQ9Jm89YmJkNGI1NjM2YTg2NDI4YWI*OTYyYmQwNjI5NzAwNTgmb2Y9MA==.gif" border="0" width="0" height="0" /&gt;&lt;div style="width: 425px; text-align: left;" id="__ss_1372347"&gt;&lt;a style="margin: 12px 0pt 3px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; display: block; text-decoration: underline;" href="http://www.slideshare.net/scrummaster/scrum-introduction?type=presentation" title="Scrum Introduction"&gt;Scrum Introduction&lt;/a&gt;&lt;object style="margin: 0px;" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=scrumintro3-090501055113-phpapp01&amp;amp;stripped_title=scrum-introduction"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=scrumintro3-090501055113-phpapp01&amp;amp;stripped_title=scrum-introduction" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;"&gt;View more &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/scrummaster"&gt;scrummaster&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-7039781033252807795?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/7039781033252807795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2009/05/scum-intro-presentation.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/7039781033252807795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/7039781033252807795'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2009/05/scum-intro-presentation.html' title='Scrum Intro Presentation'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-7607245385560244204</id><published>2009-05-07T14:07:00.011+10:00</published><updated>2009-05-07T21:19:57.759+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UX'/><category scheme='http://www.blogger.com/atom/ns#' term='UI'/><category scheme='http://www.blogger.com/atom/ns#' term='Domino'/><title type='text'>UI Pattern : Linking Data</title><content type='html'>Here is a UI sample from my latest web application, for those of you who are interested in such things.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;The Problem.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;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 &lt;a href="http://en.wikipedia.org/wiki/General_practitioner"&gt;GP&lt;/a&gt; (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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;This new requirement raised a few questions that I needed to resolve;&lt;br /&gt;&lt;br /&gt;1. How can the user identify the third patient they submitted in cycle 1.&lt;br /&gt;2. How could the user enter data and ensure that it was linked to the correct patient.&lt;br /&gt;3. How could I ensure that the duplicate data (like gender and patient code is retained)&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;The Solution.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic"&gt;Cycle 1.&lt;/span&gt;&lt;br /&gt;The user sees the traditional (in &lt;a href="http://www.scius.com.au/"&gt;our&lt;/a&gt; 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.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_zz66mErCWS8/SgJn7O--k4I/AAAAAAAAAJI/AMpFTxkJ3ME/s1600-h/t2-1.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 353px; CURSOR: pointer" id="BLOGGER_PHOTO_ID_5332939176092275586" border="0" alt="" src="http://3.bp.blogspot.com/_zz66mErCWS8/SgJn7O--k4I/AAAAAAAAAJI/AMpFTxkJ3ME/s400/t2-1.jpg" /&gt;&lt;/a&gt;&lt;span style="FONT-STYLE: italic"&gt;Cycle 2.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;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.&lt;br /&gt;&lt;br /&gt;I was trying to not make the user &lt;a href="http://www.sensible.com/"&gt;think&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_zz66mErCWS8/SgJn7GGpTVI/AAAAAAAAAJQ/-prFWyg46CA/s1600-h/t2-2.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 235px; CURSOR: pointer" id="BLOGGER_PHOTO_ID_5332939173708516690" border="0" alt="" src="http://2.bp.blogspot.com/_zz66mErCWS8/SgJn7GGpTVI/AAAAAAAAAJQ/-prFWyg46CA/s400/t2-2.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Summary.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It's a simple interface that provides a really intuitive way to link the cycle 1 data to the cycle 2 data.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-7607245385560244204?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/7607245385560244204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2009/05/ui-pattern-linking-data.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/7607245385560244204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/7607245385560244204'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2009/05/ui-pattern-linking-data.html' title='UI Pattern : Linking Data'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_zz66mErCWS8/SgJn7O--k4I/AAAAAAAAAJI/AMpFTxkJ3ME/s72-c/t2-1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-8211288649141030220</id><published>2009-05-06T23:56:00.001+10:00</published><updated>2009-05-07T12:10:37.301+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PDF'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Scius PDF library Beta 8</title><content type='html'>&lt;a href="http://www.scius.com.au/external/flash.nsf/scius-pdfdoc-beta8.zip"&gt;Beta 8&lt;/a&gt; of the &lt;a href="http://palmerweb.blogspot.com/2008/10/simple-java-library-for-creating-pdfs.html"&gt;Scius PDF Library&lt;/a&gt;, that I &lt;a href="http://palmerweb.blogspot.com/2009/03/scius-pdf-library-what-is-in-next.html"&gt;mentioned&lt;/a&gt; earlier, is available for those that need the following extra features.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Bullet List,&lt;/li&gt;&lt;li&gt;Manual Page Break,&lt;/li&gt;&lt;li&gt;Repeating Table Headers,&lt;/li&gt;&lt;li&gt;In-line Images, and&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Page Orientation changes on the fly.&lt;/li&gt;&lt;/ul&gt;This will be the final version. I will not be enhancing the library further.&lt;br /&gt;&lt;br /&gt;The code base that this is used in will not be changing and therefore, there are no new features planned.&lt;br /&gt;&lt;br /&gt;Below are some code extracts, so you can see how easy it is to use those new features.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Repeating Table Headers&lt;/span&gt;&lt;br /&gt;       &lt;style type="text/css"&gt;  &lt;!--   @page { margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="color:#000000;"&gt; &lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;RowElement&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;headerrow&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;RowElement();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;CellElement&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;headercell&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#1a1a1a;"&gt;                           &lt;/span&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;CellElement(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;                              &lt;/span&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#2a00ff;"&gt;"Here is a big table and some headings"&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;headercell.setCellspan(3);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;headerrow.addCell(headercell);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;headerrow.setTableHeading(&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;true&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#1a1a1a;"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;table.AddRow(headerrow);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Bullet Lists&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;style type="text/css"&gt;  &lt;!--   @page { margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt;  &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#3f7f5f;"&gt; &lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;// create a list item and add the bullet.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;ListElement&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;le&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;ListElement(10,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;tableStyle);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;le.setSymbolImage(&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;"examples/orgball.gif"&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;le.setBulletIndent(20);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;le.addBullet(&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;"Here is one"&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;le.addBullet(&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;"Here is two"&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#1a1a1a;"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;data.add(le);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;In-line Images&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;style type="text/css"&gt;  &lt;!--   @page { margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="color:#3f7f5f;"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;// create an image and set scale and alignments.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;ImageElement&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;ie&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;ImageElement();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;ie.addImage(&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;"examples/ls09-bloggers.jpg"&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;ie.setImageScalePercent(100);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;ie.setImageAlignment(ImageElement.&lt;/span&gt;&lt;span style="color:#0000c0;"&gt;&lt;i&gt;IMAGE_ALIGNMENT_MIDDLE&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#1a1a1a;"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;data.add(ie);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Page Orientation&lt;/span&gt;&lt;br /&gt;  &lt;style type="text/css"&gt;  &lt;!--   @page { margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt;  &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;data.add(&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;PageElement(Page.&lt;/span&gt;&lt;span style="color:#0000c0;"&gt;&lt;i&gt;ORIENTATION_LANDSCAPE&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;));&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Page Breaks&lt;/span&gt;&lt;br /&gt;    &lt;style type="text/css"&gt; &lt;!--   @page { margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt;  &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;data.add(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;PageBreakElement());&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-8211288649141030220?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/8211288649141030220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2009/05/scius-pdf-library-beta-8.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/8211288649141030220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/8211288649141030220'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2009/05/scius-pdf-library-beta-8.html' title='Scius PDF library Beta 8'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-5963797789102283761</id><published>2009-05-04T23:59:00.003+10:00</published><updated>2009-05-05T10:28:50.462+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>Agile or Not. A few links to help you decide</title><content type='html'>&lt;div&gt;Need a checklist to decide if that new project should be done using Agile ?&lt;br /&gt;&lt;br /&gt;So far the Scrum Agilitists that I've met seem to be a very pragmatic bunch, a bit like myself. They realise that Scrum isn't a silver bullet, quick fix or guarantee of sucess for every project. As part of the CSM course that I recently took, we covered when to choose Scrum and &lt;span style="font-style: italic; font-weight: bold;"&gt;importantly&lt;/span&gt; when not to.&lt;br /&gt;&lt;br /&gt;Scrum makes reference to the &lt;a href="http://en.wikipedia.org/wiki/Cynefin"&gt;Cynefin Framework&lt;/a&gt;  (developed by &lt;a href="http://www.cognitive-edge.com/blogs/dave/"&gt;Dave Snowdon&lt;/a&gt;, the KM guru and  pioneer in the application of complex adaptive theory) around leadership decision making and complexity.&lt;br /&gt;&lt;br /&gt;You see, Scrum work best for complex projects where the scope is not well understood or agreed and the technology is far from certain - two huge areas for contention in traditional waterfall approaches. For the complex domains, 'probe, sense and respond' is prescribed by the Cynefin Framework which matches the 'apply, inspect and adapt', that Scrum uses. &lt;/div&gt;&lt;br /&gt;&lt;div&gt;Even then, if you have worked out that you have a set of suitable project, which ones are likely to have a successful outcome and are ripe to use Agile techniques. &lt;a href="http://kanemar.com/"&gt;Kane Mar&lt;/a&gt;, a well known Scrum Trainer and Coach, has published a simple score card to get started. &lt;a href="http://danube.com/system/files/Agile+scorecard+blog_1.pdf"&gt;Agile Project Selection from a portfolio of projects&lt;/a&gt;, it might help to identify which projects are good candidates. Although, he notes that as you become more experienced you'll be able to identify which projects to choose without a scorecard.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Here is a bit more about the scorecard.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-style: italic;"&gt;The Scorecard is simply a list of criteria that can be uses to assess the characteristics&lt;/span&gt; &lt;span style="font-style: italic;"&gt;of a particular project. A numeric value is associated with each question, so that&lt;/span&gt; &lt;span style="font-style: italic;"&gt;scores can be simply tallied up based on the total value and then used to determine if&lt;/span&gt; &lt;span style="font-style: italic;"&gt;the project is suitable for “the Agile treatment.”&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Lets also consider some stats.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;a href="http://www.enterprisemanagement.com/"&gt;EMA&lt;/a&gt; research conducted in mid-2008 determined that 80% of companies surveyed had custom software in production, a higher percentage than Enterprise Resource Planning (ERP), Customer Relationship Management (CRM), or any other application type.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;They also  determined that over 60% of the time, software development projects fell short of expectations which means that only 40% of budget dollars invested in software development yield business value and therefore the conclusion is that reversing this trend can yield very rapid ROI.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;The CSM course cites the &lt;a href="http://www.standishgroup.com/"&gt;Standish CHAOS Reports&lt;/a&gt; to determine that 64% (I'm not sure the date of which report) of features are seldom or never used and therefore the case for deciding on features based on value.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;So if the EMA and Standish data is &lt;a href="http://www.infoq.com/articles/Interview-Johnson-Standish-CHAOS"&gt;right&lt;/a&gt; (some may disagree) then adopting a software development methodology that reduces waste and has an emphasis on value is going to be a wise choice in the current environment. &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;div&gt;So it's hardly surprising then, given the numbers, that you will be hearing more about Agile (and Scrum) as this rapidly becomes the standard approach for complex projects - which includes software development.&lt;/div&gt;&lt;br /&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-5963797789102283761?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/5963797789102283761/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2009/05/agile-or-not-few-links-to-help-you.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/5963797789102283761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/5963797789102283761'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2009/05/agile-or-not-few-links-to-help-you.html' title='Agile or Not. A few links to help you decide'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-3080887097834079850</id><published>2009-04-29T20:18:00.006+10:00</published><updated>2009-04-30T11:02:20.368+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>Agile Contracts</title><content type='html'>I can see how Agile works for software vendors or corporates who develop software internally,  but what about service companies, like IBM Business Partners, who supply software development services ? Usually client like to know what they are going to get and for how much. &lt;a href="http://en.wikipedia.org/wiki/Fixed_price"&gt;Fixed Price&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Labor_and_materials"&gt;Labour/Time and Materials&lt;/a&gt; contract models, with the &lt;a href="http://en.wikipedia.org/wiki/Big_Design_Up_Front"&gt;BDUF&lt;/a&gt;, are prevalent method that I've come across.&lt;br /&gt;&lt;br /&gt;So how does this work for Agile ?&lt;br /&gt;&lt;br /&gt;Two interesting posts that contain the agile approach to the contractual obligations between customer and supplier have appeared on my RSS feed recently.  They might be a useful starting point if you are pondering how to supply your services in an Agile manner and so I thought they would be worth a re-post.&lt;br /&gt;&lt;br /&gt;Firstly, &lt;a href="http://blog.softwarewithstyle.com/"&gt;Rowan,&lt;/a&gt; the Scrum Trainer from my recent &lt;a href="http://www.scrumalliance.org/"&gt;Certified Scrum Master&lt;/a&gt; training has &lt;a href="http://blog.softwarewithstyle.com/2009/04/27/our-new-sydney-csms-have-rhythm.aspx"&gt;posted&lt;/a&gt; the course round up, including links to further information about the Agile contract models that we covered.&lt;br /&gt;&lt;br /&gt;Secondly, there is a very detailed description of &lt;a href="http://agilesoftwaredevelopment.com/blog/peterstev/10-agile-contracts"&gt;10 Contracts for your next Agile Software Project&lt;/a&gt;. Which breaks down different contract types into the following;&lt;br /&gt;&lt;br /&gt;&lt;ul style="font-style: italic;"&gt;&lt;li&gt;How is the contract structured? &lt;/li&gt;&lt;li&gt;How does it handle changes in scope (requirements)? &lt;/li&gt;&lt;li&gt;How does it apportion Risk and Reward between customer and supplier? &lt;/li&gt;&lt;li&gt;What model of customer relationship does it foster: competitive (my win is your loss), cooperative (win-win), indifferent (I don’t care-you lose) or dependent (heads-I-win-tails-you lose)? &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-3080887097834079850?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/3080887097834079850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2009/04/agile-contracts.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/3080887097834079850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/3080887097834079850'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2009/04/agile-contracts.html' title='Agile Contracts'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-1958818018758459403</id><published>2009-04-08T17:12:00.003+10:00</published><updated>2009-04-08T17:16:05.357+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lotus'/><category scheme='http://www.blogger.com/atom/ns#' term='Domino'/><title type='text'>Quote of the Day : The Lotus Notes platform -- it's very sophisticated</title><content type='html'>&lt;span id="intelliTXT"&gt;"&lt;span style="font-style: italic;"&gt;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&lt;/span&gt;."&lt;/span&gt;&lt;br /&gt;&lt;a href="http://redmondmag.com/news/article.asp?EditorialsID=10749"&gt;&lt;br /&gt;More&lt;/a&gt; via &lt;a href="http://www.edbrill.com/ebrill/edbrill.nsf/dx/redmondmag-microsoft-partner-phase-2-adds-ibms-hosted-apps-?opendocument&amp;amp;comments"&gt;Ed&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-1958818018758459403?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/1958818018758459403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2009/04/quote-of-day-lotus-notes-platform-its.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/1958818018758459403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/1958818018758459403'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2009/04/quote-of-day-lotus-notes-platform-its.html' title='Quote of the Day : The Lotus Notes platform -- it&apos;s very sophisticated'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-3738295369861085845</id><published>2009-03-30T14:28:00.004+11:00</published><updated>2009-03-30T14:44:34.508+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='UX'/><category scheme='http://www.blogger.com/atom/ns#' term='UI'/><title type='text'>Are you interested in Agile and UX together...</title><content type='html'>With 341 bloggers posting on &lt;a href="http://planetlotus.org/"&gt;PlanetLotus&lt;/a&gt;, sometimes you miss something. I'd previously missed &lt;a href="http://www-10.lotus.com/ldd/insidelotusblog.nsf"&gt;Chris Recklings&lt;/a&gt; older post about &lt;a href="http://www.ibm.com/design"&gt;Design@IBM&lt;/a&gt;. However, I did see his recent post about the &lt;a href="http://www-10.lotus.com/ldd/insidelotusblog.nsf/dx/lotus-inotes-ultra-lite-ux-design-cast"&gt;UXDesignCast&lt;/a&gt;, which led me to discover the team talking about &lt;a href="http://www.uxdesigncast.com/"&gt;Optimized Agile Design&lt;/a&gt; in one session. I also found the new article &lt;a href="http://www-01.ibm.com/software/ucd/agileuxd.html"&gt;An Agile Approach to User Experience and Design&lt;/a&gt; on the Design@IBM website.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-3738295369861085845?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/3738295369861085845/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2009/03/are-you-interested-in-agile-and-ux.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/3738295369861085845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/3738295369861085845'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2009/03/are-you-interested-in-agile-and-ux.html' title='Are you interested in Agile and UX together...'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-734353058606821670</id><published>2009-03-27T14:24:00.006+11:00</published><updated>2009-03-27T15:34:13.856+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unit Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Domino'/><title type='text'>Domino Unit Framework Q&amp;A - Part 1</title><content type='html'>Here are some questions about using '&lt;a href="http://www.openntf.org/Projects/pmt.nsf/ProjectLookup/Domino%20Unit%20Framework"&gt;Domino Unit Framework&lt;/a&gt;' 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 &lt;a href="http://www.openntf.org/"&gt;OpenNTF&lt;/a&gt; project. Excuse the poor English in the questions, they are coming from Karnataka in Banglore and English isn't the first language.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Question 1.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"So now  my query is i need to get the document context of this..then only i&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;can test or compare or what ever it is..Can i run the tests of domino unit&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;frame work independently with out tieing to the Application data base."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Answer 1.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Yes, you can run the unit tests independent of the Domino Unit Framework database.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;Set OutputStream = New NotesDatabaseOutputStream(session, "", "DUFResults.nsf")&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When you are migrating to production/uat, remove the script libraries and agents.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Question 2.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"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)"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Answer 2.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nope....&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Question 3.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"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."&lt;/span&gt;  &lt;div&gt; &lt;/div&gt; &lt;span style="font-style: italic;"&gt;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"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Answer 3.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;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 ?&lt;br /&gt;&lt;br /&gt;Therefore, asserting equality between arrays (and arrays of variants) is not (and perhaps never will be) included in Domino Unit Framework.&lt;br /&gt;&lt;br /&gt;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;&lt;br /&gt;&lt;br /&gt;Call Test101.AssertEqual(array_a(0),array)b(0))&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-734353058606821670?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/734353058606821670/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2009/03/domino-unit-framework-q-part-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/734353058606821670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/734353058606821670'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2009/03/domino-unit-framework-q-part-1.html' title='Domino Unit Framework Q&amp;A - Part 1'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-7221731938756996801</id><published>2009-03-25T15:07:00.005+11:00</published><updated>2009-03-25T15:19:08.528+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PDF'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Scius PDF library - what is in the next version.</title><content type='html'>Would you like to know what is in the next release of the &lt;a href="http://palmerweb.blogspot.com/2008/10/simple-java-library-for-creating-pdfs.html"&gt;Scius PDF library&lt;/a&gt; ?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_zz66mErCWS8/ScmuRAhGqjI/AAAAAAAAAJA/Oz8hC3HXuuY/s1600-h/scius-pdf-library.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 181px; height: 400px;" src="http://2.bp.blogspot.com/_zz66mErCWS8/ScmuRAhGqjI/AAAAAAAAAJA/Oz8hC3HXuuY/s400/scius-pdf-library.jpg" alt="" id="BLOGGER_PHOTO_ID_5316972442307439154" border="0" /&gt;&lt;/a&gt;1. Changing the page orientation on the fly,&lt;br /&gt;2. Inline images that you can scale,&lt;br /&gt;3. Bullet lists.&lt;br /&gt;&lt;br /&gt;The code has been written and I'm using it, but the release is not &lt;span style="font-weight: bold;"&gt;done&lt;/span&gt;.  That is, I haven't met my personal 'definition of done', which include examples and documentation.&lt;br /&gt;&lt;br /&gt;I've been a bit busy of late and getting it ready has fallen down the backlog.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-7221731938756996801?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/7221731938756996801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2009/03/scius-pdf-library-what-is-in-next.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/7221731938756996801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/7221731938756996801'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2009/03/scius-pdf-library-what-is-in-next.html' title='Scius PDF library - what is in the next version.'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_zz66mErCWS8/ScmuRAhGqjI/AAAAAAAAAJA/Oz8hC3HXuuY/s72-c/scius-pdf-library.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-1569880012761162696</id><published>2009-03-25T12:55:00.004+11:00</published><updated>2009-03-25T13:17:16.066+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Dojo'/><category scheme='http://www.blogger.com/atom/ns#' term='UI'/><title type='text'>Dojo Drawing Tools and Charting</title><content type='html'>Do you want to know more about dojo drawing tools and charting. See this article, a reprint from the &lt;a href="http://www.linuxjournal.com/issue/178"&gt;Linux Journal&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dojotdg.zaffra.com/2009/03/dojo-now-with-drawing-tools-linux-journal-reprint/"&gt;Dojo, Now with Drawing Tools&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The article has a fairly detailed explanation of the dojo gfx library and a preview of the &lt;a href="http://docs.dojocampus.org/dojox/charting"&gt;charting API&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-1569880012761162696?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/1569880012761162696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2009/03/dojo-drawing-tools-and-charting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/1569880012761162696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/1569880012761162696'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2009/03/dojo-drawing-tools-and-charting.html' title='Dojo Drawing Tools and Charting'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-6935191455034783837</id><published>2009-03-16T12:35:00.007+11:00</published><updated>2009-03-16T13:30:21.740+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>An introduction to Scrum (plus some interesting case studies)</title><content type='html'>Here is a link to a 14 page &lt;a href="http://www.scrumalliance.org/resources/598"&gt;Scrum Guide&lt;/a&gt; and some case studies (via &lt;a href="http://www.scrumalliance.org/"&gt;ScrumAlliance.org&lt;/a&gt;) for those interested.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Abstract.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;This guide explains how to use Scrum to build products. In doing so, it will describe how the&lt;/span&gt; &lt;span style="font-style: italic;"&gt;framework and its artifacts, time-boxes, roles and rules work together. Scrum does not include&lt;/span&gt; &lt;span style="font-style: italic;"&gt;techniques and processes for building products; however, it will point out the efficacy and flaws&lt;/span&gt; &lt;span style="font-style: italic;"&gt;of these techniques and processes.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Scrum is a framework for developing complex products and systems. It is grounded in empirical&lt;/span&gt; &lt;span style="font-style: italic;"&gt;process control theory*. Scrum employs an iterative, incremental approach to optimize&lt;/span&gt; &lt;span style="font-style: italic;"&gt;predictability and control risk. Within each iteration, Scrum employs self-organizing, cross functional&lt;/span&gt; &lt;span style="font-style: italic;"&gt;Teams to optimize flexibility and productivity.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Have a look at some of the case studies that were presented at the 2009 Scrum Gathering (in Orlando, FL.). It makes for some interesting reading.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Case Studies:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.scrumalliance.org/resources/606"&gt;Scrum But&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.scrumalliance.org/resources/609"&gt;Scrum Games&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.scrumalliance.org/resources/594"&gt;Bootstrapping Scrum&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-6935191455034783837?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/6935191455034783837/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2009/03/introduction-to-scrum-plus-some.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/6935191455034783837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/6935191455034783837'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2009/03/introduction-to-scrum-plus-some.html' title='An introduction to Scrum (plus some interesting case studies)'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-4227844995441803407</id><published>2009-03-10T11:28:00.007+11:00</published><updated>2009-03-10T20:30:26.600+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SDLC'/><category scheme='http://www.blogger.com/atom/ns#' term='Methodologies'/><category scheme='http://www.blogger.com/atom/ns#' term='ALM'/><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>Agile what is it and should I care ?</title><content type='html'>&lt;a href="http://interfacematters.com/2009/03/its-all-about-whole-packagedesigning.html"&gt;Chris&lt;/a&gt; has cajoled me into posting this, its been in draft for ages. I've been trying to work out if this is relevant and useful to the Lotus community, or am I the only one interested in this stuff.&lt;br /&gt;&lt;br /&gt;I've been learning as much as I can about Agile and, in particular, Scrum. I'm a certified project manager (based on PMBok), so I was interested to understand the implications of managing software projects in an Agile way. Did I need to throw away all I knew about the PMBok. How do you manage the same things that the stakeholders need to know about risks, schedule and budget but in the Agile way.&lt;br /&gt;&lt;br /&gt;I am also interested to find out how others tackle software development in the context of the Lotus platform. It doesn't seem to be a topic that is talked about much within our community.&lt;br /&gt;&lt;br /&gt;There is a rising ground swell of interest and adoption of Agile software development, which is gaining credibility.  Agile is now a widely accepted and valid method for managing software development. &lt;a href="http://searchsoftwarequality.techtarget.com/news/article/0,289142,sid92_gci1346021,00.html?track=NL-516&amp;amp;ad=686675&amp;amp;asrc=EM_USC_5737493&amp;amp;uid=1643103"&gt;IBM Lotus Software Group&lt;/a&gt; and the &lt;a href="http://www.ibm.com/developerworks/blogs/page/marybeth?entry=user_stories_for_personal_journal"&gt;Lotus Notes Development Team&lt;/a&gt; are using Agile and the fourth edition of the &lt;a href="http://www.pmi.org/Resources/Pages/Library-of-PMI-Global-Standards.aspx"&gt;PMBok&lt;/a&gt; guide is being &lt;a href="http://www.gantthead.com/discussions/discussionsTopicContainer.cfm?ID=10552"&gt;influenced&lt;/a&gt; by agile projects.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Should the Lotus community be interested ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Is Agile (and Scrum) something that, as professional software developers, we should be interested in ? or interested enough to find out more ? We take toolkits and ideas from other technology areas and reuse them for our own purpose, so why not a development method ?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;I don't need Agile, I'm using a RAD tool.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lotus Notes has always been on the agile side of the spectrum and is often referred to a rapid application development (RAD) environment. Of course, just because you are using a RAD tool does not necessarily mean that you are developing software in a RAD way. In the same way that you can still write Java code in a procedural way and shun any form of Object Oriented techniques. I've seen the waterfall, big document up front, approach for Notes development and  you end up spending more time on the document than actually writing the software.&lt;br /&gt;&lt;br /&gt;For me developing solutions in Notes has been somewhat Agile. I started with Joint Application Design (JAD) and then &lt;a href="http://www.thefreelibrary.com/Lotus+Accelerated+Value+Method+program+goes+global%3B+Program+aimed+at...-a017323108"&gt;Accelerate Value Method&lt;/a&gt; (AVM). AVM, for those who have not heard of it, was the Lotus consulting methodology from 1995 which embraced a collaborative development style with stakeholders and team. The aim was also to deliver value to the customer at the earliest opportunity through short iterations.&lt;br /&gt;&lt;br /&gt;In fact if you did business with Lotus Consulting in Australia you would have come across a &lt;a href="http://www.projectconnections.com/templates/detail/project-flexibility-matrix.html"&gt;project flexibility matrix&lt;/a&gt; in our statements of work. I saw the same matrix recently while reading '&lt;a href="http://www.amazon.com/Software-Project-Managers-Agility-Development/dp/0321502752"&gt;The Software Project Managers bridge to Agility&lt;/a&gt;'. We even used a documentation formatting &lt;a href="http://www.tacticsconsulting.com.au/article/view/1162/250/252"&gt;methodology&lt;/a&gt; that favoured brevity and efficiency in communications.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;So why should I care if I'm using Agile or Scrum ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Simply, it gives you a common language that you can talk to other developers, clients and managers when they ask what is it that you are doing. You can point to a wealth of credible experience online and in books and say, yes we are using a software development methodology. A methodology favoured by highly respected experts, and by the way, they have produced high quality software that the users want quicker. Make no mistake, there are pit falls and traps which you will need to look out for. You will also need to assess if your team and organistion is ready &lt;span style="font-style: italic;"&gt;and&lt;/span&gt; willing to try Agile.&lt;br /&gt;&lt;br /&gt;There are also lot if &lt;a href="http://www.google.com.au/search?hl=en&amp;amp;client=firefox-a&amp;amp;rls=org.mozilla%3Aen-US%3Aofficial&amp;amp;hs=AI1&amp;amp;q=Agile+Myths&amp;amp;btnG=Search&amp;amp;meta="&gt;misconceptions&lt;/a&gt; around Agile methods that have the potential to strike fear into managers and the &lt;a href="http://en.wikipedia.org/wiki/Project_management_office"&gt;PMO&lt;/a&gt; alike. "No documentation", "you'll get it when you get it" and "Agile doesn't scale" are some of the common ones. If you take the time to understand, like I have recently, you will realise that Agile has structure for dealing with the processes and disciplines that the &lt;a href="http://www.pmi.org/Resources/Pages/Library-of-PMI-Global-Standards.aspx"&gt;PMBok&lt;/a&gt; describe. The PMBok is very general and, as the title describes, and only provides a guide to manage projects from building bridges to software development. Agile fills in the 'how' for software development and so the two &lt;a href="http://searchsoftwarequality.techtarget.com/news/article/0,289142,sid92_gci1348177,00.html?track=NL-498&amp;amp;ad=689660&amp;amp;asrc=EM_NLN_5897472&amp;amp;uid=1643103"&gt;can exist&lt;/a&gt; happily together.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;I really would like to use Agile, how can I explain the benefits  between Agile and Waterfall &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;in a simple way&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I recently attended the &lt;a href="http://www.meetup.com/The-Sydney-Scrum-Meetup-Group/"&gt;Sydney Scrum User Group&lt;/a&gt; and we worked through an exercise, which was an analogy for one of the difference between a waterfall approach and a scrum/agile approach. Rather than pinch the idea, here is my contrived &lt;a href="http://www.anecdote.com.au/index.php"&gt;story&lt;/a&gt; to explain the difference. Think of sandwiches in terms of software features, and a tray as a release or increment, and it might all make sense - then again maybe not.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Scenario 1. Making sandwiches the waterfall way.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Requirements.&lt;/span&gt;&lt;br /&gt;Customer sends a fax at 9:00 am in the morning he needs vegemite sandwiches for 100 people for an event at lunch. Deliver to the office at 11:30.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Development.&lt;/span&gt;&lt;br /&gt;You get a production line started, one person buttering and spreading the vegemite, the next person slicing and arranging on a platter. By 10:30 you've spread 75 sandwiches with vegemite, when the customer calls in to check on progress.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;The customer suddenly remembers that, not everyone likes vegemite. So ask for half to be roast beef. Rather than 25 vegemite sandwiches end up in the bin the client agree to increase his order by 25 sandwiches to get the 50 roast beef sandwiches.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;User Acceptance.&lt;/span&gt;&lt;br /&gt;You turn up at the customers office, he looks at the platter and it looks  a little plain then remembers that he has some vegetarians turning up who don't like vegemite! You quickly call the guys at the cafe and get them to quickly make another 25 sandwiches, this time  cucumber.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sign Off&lt;/span&gt;.&lt;br /&gt;The customer is happy, but it cost him 150 sandwiches and you've expended 150 sandwich making effort. There is only 100 people so there is a lot of sandwiches left over that are not used.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Scenario 2. Making sandwiches the agile way.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Requirements.&lt;/span&gt;&lt;br /&gt;Sometime later the same customer faxes another order, this time you try a different approach.&lt;br /&gt;You invite him to come to the cafe and tell him he can use the wi-fi and he'll get a coffee on the house while he waits. You sit down with him and ask your usual catering questions. How many people ? are there any vegetarians ? The barista overhears - and suggests that to cater for vegans and wheat intolerance and through your many years of experience you estimate that 75 sandwiches should be enough for 100 people.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Development.&lt;/span&gt;&lt;br /&gt;You start making sandwiches one at a time. As each tray of sandwiches is made you show the customer. You have made 50 sandwiches (two trays). When you overhear the customer exclaim - bugger!&lt;br /&gt;&lt;br /&gt;He's just got an email. The meeting has been rescheduled until the afternoon. You suggest to him that for an afternoon meeting cakes might be more appropriate and so decide that 50 sandwiches and 25 cakes would be plenty. You stop making any more sandwiches and the and start slicing cake.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;User Acceptance&lt;/span&gt;&lt;br /&gt;The customer has seen the first tray of sandwiches as they have been made. He quickly checks the cakes as they are being arrange - all is looking good.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sign Off.&lt;/span&gt; The customer is happy and pays. You suggest that he takes one tray of sandwiches to put in the fridge on the off chance that some of the attendees didn't get the rescheduled meeting notice. After all they are already made - he might as well take them.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Let me explain the difference&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Scenario 1&lt;/span&gt; - the customer didn't really understand what he wanted until he started thinking more about his needs when he saw the entire finished platter. He ended up with more food than he actually needed and there was a certain amount of waste. The sandwiches were all produced in great big block so there is little flexibility in changing the fillings during the making of the platter.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Scenario 2&lt;/span&gt; - the customer also did not understand what he wanted, but as he was available in the coffee shop he could actively participate and give the sandwich makes feedback as his requirements changed, like when the meeting was rescheduled. There was little to no waste in the construction and as the platter was made in smaller, fully complete, chunks. In fact, so complete that the customer could actually take part of the order with him and realise that value earlier.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Summary.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You can see for the examples that when the customer is involved more closely with the production of the sandwiches that the whole team is more able to quickly adapt to the changing situation. Have smaller, fully complete, increments allowed for the customer to start using the end product quicker. The customer only paid for what he actually needed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The trade off.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The customer/product owner has to commit to spend time working with the team. If the product owner, the person with ultimate responsibility to steer the results of the software development effort, doesn't have the time or inclination to work in an agile way then waterfall my still be the most appropriate method for your situation.&lt;br /&gt;&lt;br /&gt;There is a lot more to agile than one post. Hopefully this post has given you a small insight and taster into Agile. Let me leave you with one last thought.&lt;br /&gt;&lt;br /&gt;Image you have two project, one waterfall and one agile. Imagine a time of economic uncertainty. Imagine both projects are canceled half way through. Which project will be able deliver value to the customer in the form of working software.&lt;br /&gt;&lt;br /&gt;Answers on a postcard...(or comments)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-4227844995441803407?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/4227844995441803407/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2009/03/agile-what-is-it-and-should-i-care.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/4227844995441803407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/4227844995441803407'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2009/03/agile-what-is-it-and-should-i-care.html' title='Agile what is it and should I care ?'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-681283447334990958</id><published>2009-02-24T08:46:00.003+11:00</published><updated>2009-02-24T10:09:36.799+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scams'/><title type='text'>should I or shouldn't I ?</title><content type='html'>Here's an e-mail that I received this morning. Its tempting to engage in a bit of &lt;a href="http://www.419eater.com/"&gt;fun&lt;/a&gt;. But I just don't have the time right now. I guess that not everyone in the world knows about the &lt;a href="http://www.nigerianscams.org/"&gt;scams&lt;/a&gt; as they're still trying it on.&lt;br /&gt;&lt;br /&gt;If anyone is wondering what a scam email looks like, here is one.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;From  Mr Benson &lt;span class="yshortcuts" id="lw_1235410432_0"&gt;Karim&lt;/span&gt; &lt;br /&gt;Auditing  Manager,&lt;br /&gt;Bank of Africa(B.O.A)&lt;br /&gt;Ouagadougou Burkina Faso.&lt;br /&gt;&lt;span class="yshortcuts" id="lw_1235410432_1" style="border-bottom: 1px dashed rgb(0, 102, 204); background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;West Africa&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;ATTN,   &lt;br /&gt;                                                        &lt;br /&gt;&lt;br /&gt;Sorry to distract your attention, I am Mr Benson Karim  the Auditing  manager&lt;br /&gt;in the &lt;span class="yshortcuts" id="lw_1235410432_2" style="border-bottom: 1px dashed rgb(0, 102, 204); background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;bank of Africa&lt;/span&gt; Ouagadougou Burkina Faso West Africa.&lt;br /&gt;&lt;br /&gt;In my department, I found the deposited fund amounted ($12.5 MILLION US&lt;br /&gt;DOLLARS)  belonging to a customer who died in the air crash with his entire&lt;br /&gt;family.&lt;br /&gt;&lt;br /&gt;However, I shall detail you with the full information as soon as I hear from&lt;br /&gt;you.&lt;br /&gt;&lt;br /&gt;Can you be able and capable to assist me  provide your receiving bank account&lt;br /&gt;where this fund will lodge in your favour?&lt;br /&gt;&lt;br /&gt;I shall give you 35% of the total sum as soon as this fund hits your account&lt;br /&gt;and I shall visit you in your country for the shearing of the fund.&lt;br /&gt;&lt;br /&gt;Please this is very confidential. If you are interested, please forward to me&lt;br /&gt;the bellow information's;&lt;br /&gt;&lt;br /&gt;Your name:............................&lt;br /&gt;&lt;br /&gt;Your country:.........................&lt;br /&gt;&lt;br /&gt;Your phone Number:......................&lt;br /&gt;&lt;br /&gt;Your tel/fax:...........................&lt;br /&gt;&lt;br /&gt;Your age:...............................&lt;br /&gt;&lt;br /&gt;Your occupation:.......................&lt;br /&gt;&lt;br /&gt;Thank for your anticipated co-peration.&lt;br /&gt;Your's  Faithfully.&lt;br /&gt;Mr Benson Karim&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-681283447334990958?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/681283447334990958/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2009/02/should-i-or-shouldnt-i.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/681283447334990958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/681283447334990958'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2009/02/should-i-or-shouldnt-i.html' title='should I or shouldn&apos;t I ?'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-7765869334468154388</id><published>2009-02-13T14:42:00.004+11:00</published><updated>2009-02-13T14:49:43.688+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UI'/><category scheme='http://www.blogger.com/atom/ns#' term='Domino'/><title type='text'>Web UI Patterns</title><content type='html'>From the authors of &lt;a href="http://www.amazon.com/gp/product/0596516258?ie=UTF8&amp;amp;tag=looksgoodwork-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0596516258"&gt;Designing Web Interfaces&lt;/a&gt; via &lt;a href="http://ajaxian.com/archives/390-designing-web-interface-screencasts"&gt;Ajaxian&lt;/a&gt;, via their &lt;a href="http://designingwebinterfaces.com/screencasts-added-to-flickr"&gt;blog&lt;/a&gt;. 390 screens have been added to the Designing Web Interfaces &lt;a href="http://flickr.com/photos/designingwebinterfaces"&gt;Photostream&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;You should also checkout the &lt;a href="http://designingwebinterfaces.com/15-common-components"&gt;15 Common Component Patterns&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Lots of inspiration, eye candy and general UI tips for the Domino developers out there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-7765869334468154388?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/7765869334468154388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2009/02/web-ui-patterns.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/7765869334468154388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/7765869334468154388'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2009/02/web-ui-patterns.html' title='Web UI Patterns'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-191577278849697385</id><published>2009-01-15T15:14:00.000+11:00</published><updated>2009-01-15T16:50:44.328+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blogging'/><category scheme='http://www.blogger.com/atom/ns#' term='LS09'/><title type='text'>2008 retrospective</title><content type='html'>2008 was an interesting year, there have been many highlights. However, one of the most rewarding aspect has been writing this blog and giving back to the community. Even though I've been around Notes and Domino a long time I've never really been in a position to regularly contribute. It's been great to change that and something that I've really enjoyed. I would like to thank all those who have commented on my blog. It's great to get feedback that the posts and downloads have been useful and you've gained something out of them.&lt;br /&gt;&lt;br /&gt;However, next week I'll be mostly reading. I hope that all the LS09 attendees enjoy next week and I'm looking forward to keeping up with all the latest news.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-191577278849697385?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/191577278849697385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2009/01/2008-retrospective.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/191577278849697385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/191577278849697385'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2009/01/2008-retrospective.html' title='2008 retrospective'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-9029560021869730348</id><published>2008-12-18T11:59:00.007+11:00</published><updated>2008-12-18T12:45:31.937+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><category scheme='http://www.blogger.com/atom/ns#' term='UI'/><title type='text'>Vista UI gaffe : Why users delete the recycle bin</title><content type='html'>I'm not running Vista, but &lt;a href="http://www.holdandmodify.com/2008/04/10/windows-vista-rubbish-logic/"&gt;happened upon&lt;/a&gt; this particular &lt;a href="http://en.wikipedia.org/wiki/Error"&gt;gaffe&lt;/a&gt; and thought it was worth sharing for those of you that use Vista or have users that do. The link also has instructions on restoring and stopping users from this particular problem.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.computerperformance.co.uk/vista/vista_registry_recycle_bin.htm#Why_People_Delete_the_Recycle_Bin"&gt;why people delete the recycle bin&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3167/2403334735_742e14d58f_o.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 291px; height: 258px;" src="http://farm4.static.flickr.com/3167/2403334735_742e14d58f_o.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I would have thought that using "Remove Recycle Bin" or even "Delete Recycle Bin" rather than "Delete" would have been a better option.&lt;br /&gt;&lt;br /&gt;I guess that MS didn't pass round the "&lt;a href="http://www.sensible.com/"&gt;Don't make me think&lt;/a&gt;" book.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-9029560021869730348?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/9029560021869730348/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2008/12/vista-ui-gaffe-why-users-delete-recycle.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/9029560021869730348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/9029560021869730348'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2008/12/vista-ui-gaffe-why-users-delete-recycle.html' title='Vista UI gaffe : Why users delete the recycle bin'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-26223482395755729</id><published>2008-11-28T14:17:00.005+11:00</published><updated>2008-11-28T15:27:20.513+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Dojo'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><category scheme='http://www.blogger.com/atom/ns#' term='Domino'/><title type='text'>Dojo Domino Applications : Performance Tips</title><content type='html'>Are you curious about how to get better performance from your dojo domino apps, here are the results of me taking a little peek.&lt;br /&gt;&lt;br /&gt;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 &lt;a href="http://dojotoolkit.org/book/dojo-book-0-9/part-4-meta-dojo/package-system-and-custom-builds"&gt;custom build system&lt;/a&gt;. 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.&lt;br /&gt;&lt;br /&gt;The two things that I wanted to find out were;&lt;ul&gt;&lt;li&gt;How easy is the dojo custom build system ?&lt;/li&gt;&lt;li&gt;How much difference will this make to the performance ?&lt;/li&gt;&lt;/ul&gt;I also wanted to explore some of the server side settings that would help overall performance and document the whole lot in one place.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Dojo Build System - Creating your own custom build.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As Tim has already &lt;a href="http://www.timtripcony.com/blog.nsf/d6plinks/TTRY-7LLHQP"&gt;blogged&lt;/a&gt; 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.&lt;br /&gt;&lt;br /&gt;I was quite surprised just how easy the build system was to set up and use. Here is what to do.&lt;br /&gt;&lt;br /&gt;1. Download the source code files - I used the dojo-release-1.2.2-src.zip&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;dependencies = {&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;layers: [&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;            {&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;       &lt;br /&gt;name: "scius-dojo.js",&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;             &lt;br /&gt;dependencies: [&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;                     &lt;br /&gt;"dojo.parser",&lt;/span&gt;  &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;"dijit.Dialog",&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;"dijit.form.Button",&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;"dijit.form.DateTextBox",&lt;/span&gt;&lt;br /&gt;     &lt;span style="font-family:courier new;"&gt;"dijit.form.NumberTextBox",&lt;/span&gt;&lt;br /&gt;     &lt;span style="font-family:courier new;"&gt;"dijit.form.CheckBox",&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;"dijit.ProgressBar",&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;"dijit.layout.ContentPane",&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;"dijit.layout.StackContainer"&lt;/span&gt;  &lt;span style="font-family:courier new;"&gt;             &lt;br /&gt;]&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;            },&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;],&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;prefixes: [&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;            [ "dijit", "../dijit" ],&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;            [ "dojox", "../dojox" ]&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;    ]&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;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&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;build.bat&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;profile=scius&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;action=release&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;profileFile=scius-profile.js&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;releaseName=scius-dojo-122&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;optimize=shrinksafe&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;layerOptimize=shrinksafe&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;copyTests=false&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;localeList=en,en-us,en-au&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;After about 85 seconds, the build system is finished and you then have your own custom build waiting for you in the release directory.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How to use the custom build in your page ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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;&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&amp;lt;script type="text/javascript" src="https://website/scius-dojo-122/dojo/dojo.js" djconfig="isDebug: false, parseOnLoad: true"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript" src="https://website/scius-dojo-122/dojo/scius-dojo.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_zz66mErCWS8/SS870aMGUAI/AAAAAAAAAGw/dDkHT7MpQ5M/s1600-h/beforeafter1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 194px;" src="http://1.bp.blogspot.com/_zz66mErCWS8/SS870aMGUAI/AAAAAAAAAGw/dDkHT7MpQ5M/s400/beforeafter1.jpg" alt="" id="BLOGGER_PHOTO_ID_5273499460243443714" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Where should I store the dojo files ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Can you reduce the number of requests further ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;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 &lt;a href="http://developer.yahoo.com/performance/rules.html#expires"&gt;expires headers&lt;/a&gt; set. &lt;a href="http://chris-linfoot.net/d6plinks/CWLT-6RLHBT"&gt;Chris Linfoot&lt;/a&gt; and &lt;a href="http://chris.brandlehner.at/Brandlehner/cab_blog.nsf/d6plinks/CBRR-69WKNV"&gt;Chris Brandlehner&lt;/a&gt; have both blogged about setting the expires header for domino applications in more detail.&lt;br /&gt;&lt;br /&gt;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 &lt;a href="http://www.codestore.net/store.nsf/unid/BLOG-20080908"&gt;bad idea&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_zz66mErCWS8/SS9MEMgY5PI/AAAAAAAAAG4/_1II16Mktuw/s1600-h/website-rules.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 232px;" src="http://2.bp.blogspot.com/_zz66mErCWS8/SS9MEMgY5PI/AAAAAAAAAG4/_1II16Mktuw/s400/website-rules.jpg" alt="" id="BLOGGER_PHOTO_ID_5273517323634402546" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_zz66mErCWS8/SS9Rel6DmWI/AAAAAAAAAHA/2oup9zKNgx0/s1600-h/stats12.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 327px;" src="http://3.bp.blogspot.com/_zz66mErCWS8/SS9Rel6DmWI/AAAAAAAAAHA/2oup9zKNgx0/s400/stats12.jpg" alt="" id="BLOGGER_PHOTO_ID_5273523274687682914" border="0" /&gt;&lt;/a&gt;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.&lt;br /&gt;&lt;br /&gt;;-)&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Summary.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Was the custom build system easy to use ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;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 &lt;a href="http://ant.apache.org/"&gt;ANT&lt;/a&gt;, including copying the custom build to your server by &lt;a href="http://ant.apache.org/manual/OptionalTasks/ftp.html"&gt;FTP&lt;/a&gt; - if you really wanted to.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;How much difference did this make to performance ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Additional Notes about the Set up:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;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.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-26223482395755729?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/26223482395755729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2008/11/dojo-domino-applications-performance.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/26223482395755729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/26223482395755729'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2008/11/dojo-domino-applications-performance.html' title='Dojo Domino Applications : Performance Tips'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_zz66mErCWS8/SS870aMGUAI/AAAAAAAAAGw/dDkHT7MpQ5M/s72-c/beforeafter1.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-8614752659200923252</id><published>2008-10-21T20:40:00.005+11:00</published><updated>2008-10-21T21:17:41.780+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PDF'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Domino'/><title type='text'>Taking the View to PDF example to the next step.</title><content type='html'>As promised, here are some enhancements to make the PDF of a view a little nicer on the eyes.&lt;br /&gt;&lt;br /&gt;The example agent enclosed improves on the previous version by;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;handling a view with one &lt;a href="http://www.scius.com.au/external/flash.nsf/ViewByCategory.pdf"&gt;category&lt;/a&gt; or a &lt;a href="http://www.scius.com.au/external/flash.nsf/ViewByTitle.pdf"&gt;flat&lt;/a&gt; view&lt;br /&gt;&lt;/li&gt;&lt;li&gt;handling a view that has hidden, icon and total detail columns&lt;/li&gt;&lt;li&gt;adding a header image (from SuperNTF)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;adding a footer with page numbers&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;The code is attached &lt;a href="http://www.scius.com.au/external/flash.nsf/JavaAgentPDFStyle.java"&gt;here&lt;/a&gt; and extracts below.&lt;br /&gt;&lt;br /&gt;     &lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt;  &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#3f7f5f;"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   // get the date time for the report&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;DateTime&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;dt&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;session.createDateTime(&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;"Today"&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;dt.setNow();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// the generic data object&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;PdfData&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;data&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;PdfData();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// where to put the file&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;PdfDocumentConfig&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;config&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;PdfDocumentConfig(&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;"Text"&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;     &lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;"ViewByTitle.pdf"&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;"c:\\pdfs"&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;/*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#3f7f5f;"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    * Set up some of the styles that &lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#3f7f5f;"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    * we will use in the pdf document.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#3f7f5f;"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// the style for the database and view title&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;Style&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;styleViewTitle&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;Style(&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;"viewTitle"&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;Style.&lt;/span&gt;&lt;span style="color:#0000c0;"&gt;&lt;i&gt;TYPEFACE_HELVETICA&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;     &lt;/span&gt;&lt;span style="color:#000000;"&gt;18);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;styleViewTitle.setDecoration(Style.&lt;/span&gt;&lt;span style="color:#0000c0;"&gt;&lt;i&gt;DECORATION_BOLD&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;styleViewTitle.setAlign(Style.&lt;/span&gt;&lt;span style="color:#0000c0;"&gt;&lt;i&gt;ALIGN_CENTER&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;styleViewTitle.setBackgroundColour(232,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;232,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;232);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;styleViewTitle.setColor(0,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;94,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;187);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// the style for the date stamp&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;Style&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;styleDate&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;Style(&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;"date"&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;Style.&lt;/span&gt;&lt;span style="color:#0000c0;"&gt;&lt;i&gt;TYPEFACE_HELVETICA&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;10);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;styleDate.setAlign(Style.&lt;/span&gt;&lt;span style="color:#0000c0;"&gt;&lt;i&gt;ALIGN_RIGHT&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;styleDate.setBackgroundColour(Color.&lt;/span&gt;&lt;span style="color:#0000c0;"&gt;&lt;i&gt;RED&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// the style for the view column titles &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;Style&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;styleColumnTitle&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;Style(&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;"columnsTitle"&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;     &lt;/span&gt;&lt;span style="color:#000000;"&gt;Style.&lt;/span&gt;&lt;span style="color:#0000c0;"&gt;&lt;i&gt;TYPEFACE_HELVETICA&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;12);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;styleColumnTitle.setDecoration(Style.&lt;/span&gt;&lt;span style="color:#0000c0;"&gt;&lt;i&gt;DECORATION_BOLD&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;styleColumnTitle.setBackgroundColour(232,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;232,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;232);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;styleColumnTitle.setColor(0,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;94,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;187);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// the style for the column categories&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;Style&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;styleColumnCat&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;Style(&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;"columnsCat"&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;Style.&lt;/span&gt;&lt;span style="color:#0000c0;"&gt;&lt;i&gt;TYPEFACE_HELVETICA&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;     &lt;/span&gt;&lt;span style="color:#000000;"&gt;12);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;styleColumnCat.setDecoration(Style.&lt;/span&gt;&lt;span style="color:#0000c0;"&gt;&lt;i&gt;DECORATION_BOLD&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;styleColumnCat.setBackgroundColour(247,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;247,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;247);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;styleColumnCat.setColor(255,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;153,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;0);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// the default style for the view data&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;Style&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;styleViewDefault&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;Style(&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;"default"&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;Style.&lt;/span&gt;&lt;span style="color:#0000c0;"&gt;&lt;i&gt;TYPEFACE_HELVETICA&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;     &lt;/span&gt;&lt;span style="color:#000000;"&gt;10);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;/*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#3f7f5f;"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    * set header image - used the image from the superNTF nsf&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#3f7f5f;"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;HeaderImage&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;headerImage&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;HeaderImage();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;headerImage.addImage(&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;"c:\\pdfs\\BrandBanner.gif"&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;headerImage.setImageScale(HeaderImage.&lt;/span&gt;&lt;span style="color:#0000c0;"&gt;&lt;i&gt;IMAGE_NO_SCALE&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;false&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// create a header to write the date into&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;HeaderTwoColumns&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;header&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;HeaderTwoColumns(50,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;50);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;header.setLeftColumn(&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;CellElement(&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;""&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;styleDate));&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;header.setRightColumn(&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;CellElement(dt.getDateOnly(),&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;styleDate));&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;header.setStyle(styleDate);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;header.setHeight(100);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// create a footer &lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;FooterTwoColumns&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;footer&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;FooterTwoColumns(50,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;50);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;footer.setLeftColumn(&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;CellElement(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;     &lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;"http://palmerweb.blogspot.com - http://www.scius.com.au"&lt;/span&gt;&lt;span style="color:#000000;"&gt;));&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;footer.setRightColumn(&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;CellElement(&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;""&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;styleDate));&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;footer.setStyle(styleViewDefault);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;footer.setPageNum(&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;PageNumbersElement(styleDate));&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;footer.includePageNumbers(&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;true&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;       &lt;/span&gt;&lt;span style="color:#000000;"&gt;FooterTwoColumns.&lt;/span&gt;&lt;span style="color:#0000c0;"&gt;&lt;i&gt;PAGE_NUMBERS_RIGHT&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// getting the notes handles&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;AgentContext&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;ctx&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;session.getAgentContext();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;Database&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;db&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;ctx.getCurrentDatabase();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// this is the view&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;View&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;viewMembers&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;db.getView(&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;"vw-docsbytitle"&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#1a1a1a;"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// read the columns to get the report headings&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;Vector&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;cols&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;viewMembers.getColumns();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// filter out the columns that we are not interested in&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// such as icons, hidden, total details and categories&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;Vector&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;colsToRead&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;Vector();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;x&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;0;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;x&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;cols.size();&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;x++)&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;ViewColumn&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;col&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;(ViewColumn)&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;cols.get(x);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;    &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;(col.isIcon()&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;false&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;col.isCategory()&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;false&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;      &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;col.isHidden()&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;false&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;      &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;col.isHideDetail()&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;false&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;     &lt;/span&gt;&lt;span style="color:#000000;"&gt;colsToRead.add(col);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// create a table based on the number of columns&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;TableElement&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;tb&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;TableElement(colsToRead.size());&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;/*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#3f7f5f;"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   * create the heading (repeating) rows for the table.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#3f7f5f;"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#1a1a1a;"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// database and view title&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;RowElement&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;rw&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;RowElement();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;CellElement&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;title&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;CellElement(db.getTitle()&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;" - "&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;     &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;viewMembers.getName()&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;"\n\n"&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;styleViewTitle);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;title.setCellspan((colsToRead.size()));&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;rw.addCell(title);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;rw.setTableHeading(&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;true&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;tb.AddRow(rw);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#1a1a1a;"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// column headings&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;rw&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;RowElement();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;x&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;0;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;x&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;colsToRead.size();&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;x++)&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;ViewColumn&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;col&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;(ViewColumn)&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;colsToRead.get(x);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;rw&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;      &lt;/span&gt;&lt;span style="color:#000000;"&gt;.addCell(&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;CellElement(col.getTitle()&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;"\n\n"&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;        &lt;/span&gt;&lt;span style="color:#000000;"&gt;styleColumnTitle));&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;rw.setTableHeading(&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;true&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;tb.AddRow(rw);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#1a1a1a;"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;/*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#3f7f5f;"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   * populate the table with the view data&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#3f7f5f;"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;ViewNavigator&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;viewNav&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;viewMembers.createViewNav();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;ViewEntry&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;rowData&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;viewNav.getFirst();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;while&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;(!(rowData&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;))&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;rw&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;RowElement();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;Vector&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;viewCol&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;rowData.getColumnValues();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;    &lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// check to see if this is a category&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;    &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;(rowData.isCategory())&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;     &lt;/span&gt;&lt;span style="color:#000000;"&gt;CellElement&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;catCell&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;CellElement(&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;"\n"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;       &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;viewCol.get(1).toString()&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;"\n\n"&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;styleColumnCat);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;     &lt;/span&gt;&lt;span style="color:#000000;"&gt;catCell.setCellspan(colsToRead.size());&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;     &lt;/span&gt;&lt;span style="color:#000000;"&gt;rw.addCell(catCell);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;else&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;(rowData.isDocument())&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;     &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;x&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;0;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;x&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;colsToRead.size();&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;x++)&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;      &lt;/span&gt;&lt;span style="color:#000000;"&gt;ViewColumn&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;col&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;(ViewColumn)&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;colsToRead.get(x);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;      &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;pos&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;col.getPosition()&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;1;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;      &lt;/span&gt;&lt;span style="color:#000000;"&gt;rw.addCell(&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;CellElement(viewCol.get(pos).toString(),&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;        &lt;/span&gt;&lt;span style="color:#000000;"&gt;styleViewDefault));&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;     &lt;/span&gt;&lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;tb.AddRow(rw);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;rowData&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;viewNav.getNext(rowData);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// add the table to the data object&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;data.add(tb);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// overide the default layout&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;LayoutElement&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;layout&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;LayoutElement(LayoutElement.&lt;/span&gt;&lt;span style="color:#0000c0;"&gt;&lt;i&gt;PAGESIZE_A4&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;     &lt;/span&gt;&lt;span style="color:#000000;"&gt;LayoutElement.&lt;/span&gt;&lt;span style="color:#0000c0;"&gt;&lt;i&gt;ORIENTATION_LANDSCAPE&lt;/i&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;10,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;10,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;10,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;10,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;40,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;50);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// add the image to the layout&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;layout.setHeaderImage(headerImage);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;layout.setFooter(footer);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;layout.setHeader(header);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// configure with the config, data and layout&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;PdfDocument&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;pdf&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;PdfDocument(config,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;data,&lt;/span&gt;&lt;span style="color:#1a1a1a;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;layout);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#1a1a1a;"&gt;   &lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// go&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color:#1a1a1a;"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;pdf.createDocument();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What's next ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;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.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-8614752659200923252?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/8614752659200923252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2008/10/taking-view-to-pdf-example-to-next-step.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/8614752659200923252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/8614752659200923252'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2008/10/taking-view-to-pdf-example-to-next-step.html' title='Taking the View to PDF example to the next step.'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-412644391696265915</id><published>2008-10-20T09:21:00.006+11:00</published><updated>2008-10-20T13:48:15.197+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PDF'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Domino'/><title type='text'>Notes View to PDF in 60 seconds</title><content type='html'>&lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt;  &lt;p  style="margin-bottom: 0cm;font-family:verdana;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);font-size:100%;" &gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Watch the &lt;a href="http://www.scius.com.au/external/flash.nsf/viewtopdf.html"&gt;movie&lt;/a&gt; to see how to create a pdf of a &lt;a href="http://www.scius.com.au/external/flash.nsf/agent-test.pdf"&gt;view&lt;/a&gt; in 60 seconds.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin-bottom: 0cm;font-family:verdana;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);font-size:100%;" &gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin-bottom: 0cm;font-family:verdana;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);font-size:100%;" &gt;&lt;span style="color: rgb(0, 0, 0);"&gt; 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 &lt;a href="http://www.openntf.org/Projects/pmt.nsf/ProjectLookup/SuperNTF"&gt;SuperNTF&lt;/a&gt; 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 '&lt;a href="http://www.imdb.com/title/tt0187078/"&gt;Gone in 60 seconds&lt;/a&gt;' but does show you how quickly you can implement this in your own databases.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin-bottom: 0cm;font-family:verdana;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);font-size:100%;" &gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin-bottom: 0cm;font-family:verdana;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);font-size:100%;" &gt;&lt;span style="color: rgb(0, 0, 0);"&gt;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 (&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);font-size:100%;" &gt;&lt;span style="color: rgb(0, 0, 0);"&gt;yes you can specify more than one) &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);font-size:100%;" &gt;&lt;span style="color: rgb(0, 0, 0);"&gt; are repeated on each page as the content forces a page break. Again, most of the heavy lifting is done by &lt;a href="http://www.lowagie.com/iText/"&gt;iText&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin-bottom: 0cm;font-family:verdana;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);font-size:100%;" &gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);font-family:verdana;font-size:100%;"  &gt;&lt;span style="font-weight: bold;font-family:verdana;" &gt;The Code&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;// the generic data object&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;PdfData&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;data&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;PdfData();&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;// where to put the file&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;PdfDocumentConfig&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;config&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;PdfDocumentConfig(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Text"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"agent-test.pdf"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"c:\\temp"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;// getting the notes handles&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;AgentContext&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;ctx&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;session.getAgentContext();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Database&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;db&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;ctx.getCurrentDatabase();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;// this is the view&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;View&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;viewMembers&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;db.getView(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;" - insert your view alias here - "&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;// get the column names for a header&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Vector&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;cols&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;viewMembers.getColumnNames();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;// create a table based on the number of columns&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;TableElement&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;tb&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;TableElement(cols.size());&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;// start populating with the column names&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;RowElement&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rw&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;RowElement();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;x&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;0;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;x&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;cols.size();&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;x++)&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rw.addCell(&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;CellElement(cols.get(x).toString()));&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;// mark this as a table header to be repeated&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rw.setTableHeading(&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;true&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;tb.AddRow(rw);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;// start populating the table with the view data&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;ViewNavigator&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;viewNav&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;viewMembers.createViewNav();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;ViewEntry&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rowData&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;viewNav.getFirst();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;while&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(!(rowData&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;==&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;))&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rw&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;RowElement();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Vector&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;viewCol&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rowData.getColumnValues();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;y&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;0;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;y&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;viewCol.size();&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;y++)&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rw.addCell(&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;CellElement(viewCol.get(y).toString()));&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;tb.AddRow(rw);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rowData&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;viewNav.getNext(rowData);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;// add the table to the data object&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;data.add(tb);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;// overide the default layout&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;LayoutElement&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;layout&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;b&gt;    &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;LayoutElement(LayoutElement.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;&lt;i&gt;PAGESIZE_A4&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;LayoutElement.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;&lt;i&gt;ORIENTATION_LANDSCAPE&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;       &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;10,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;10,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;10,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;10,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;10,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;10);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;// configure with the config, data and layout&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;PdfDocument&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;pdf&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;PdfDocument(config,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;data,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;layout);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;// go&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;pdf.createDocument();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;catch&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(Exception&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;e)&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;e.printStackTrace();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;finally&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin-bottom: 0cm;font-family:verdana;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);font-size:100%;" &gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin-bottom: 0cm;font-family:verdana;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);font-size:100%;" &gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-weight: bold;"&gt;I've seen the move so how can I use this ?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin-bottom: 0cm;font-family:verdana;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);font-size:100%;" &gt;&lt;span style="color: rgb(0, 0, 0);"&gt;1. Download &lt;a href="http://www.scius.com.au/external/flash.nsf/scius-pdfdoc-beta7-update1.zip"&gt;Beta 7&lt;/a&gt;, and extract the updated jar file to a directory c:\lib&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin-bottom: 0cm;font-family:verdana;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);font-size:100%;" &gt;&lt;span style="color: rgb(0, 0, 0);"&gt;2. Download The &lt;a href="http://www.scius.com.au/external/flash.nsf/JavaAgentPdf.java"&gt;JavaAgentPdf&lt;/a&gt; code&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin-bottom: 0cm;font-family:verdana;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);font-size:100%;" &gt;&lt;span style="color: rgb(0, 0, 0);"&gt;3. Create a new Java agent in your database, add the iText-2.0.8 jar and the new scius-pdfdoc.beta7.jar&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin-bottom: 0cm;font-family:verdana;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);font-size:100%;" &gt;&lt;span style="color: rgb(0, 0, 0);"&gt;3. Replace the JavaAgent code with the downloaded version and update the view name, pdf filename and pdf directory.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin-bottom: 0cm;font-family:verdana;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);font-size:100%;" &gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin-bottom: 0cm;font-family:verdana;" align="left"&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Enhancing the example further.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin-bottom: 0cm;font-family:verdana;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);font-size:100%;" &gt;&lt;span style="color: rgb(0, 0, 0);"&gt;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.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin-bottom: 0cm;font-family:verdana;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);font-size:100%;" &gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin-bottom: 0cm;font-family:verdana;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);font-size:100%;" &gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Stay tuned because the next post might have an example that produces a pdf that is a bit nicer on the eyes.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin-bottom: 0cm;font-family:verdana;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);font-size:100%;" &gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin-bottom: 0cm;font-family:verdana;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);font-size:100%;" &gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-weight: bold;"&gt;Update : &lt;/span&gt;The link to the zip file has changed. I found a bug with Beta7 and ParagraphElements.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(63, 127, 95);font-family:verdana;font-size:100%;"  &gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-412644391696265915?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/412644391696265915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2008/10/notes-view-to-pdf-in-60-seconds.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/412644391696265915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/412644391696265915'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2008/10/notes-view-to-pdf-in-60-seconds.html' title='Notes View to PDF in 60 seconds'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-7022061151289756115</id><published>2008-10-07T14:04:00.015+11:00</published><updated>2008-10-07T16:18:56.247+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PDF'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>A simple java library for creating pdfs</title><content type='html'>Here is a free, lightweight, simple to use library that sits on top of the iText library and which helps you quickly create PDF documents with java code.&lt;br /&gt;&lt;br /&gt;I've created this library for my own applications and was toying with what to do with the library.  After listening to &lt;a href="http://www.takingnotespodcast.com/blogs/takingnotes.nsf/dx/TakingNotesEpisode86.htm"&gt;Taking Notes Episode 86&lt;/a&gt; I have decided to give it away and make it open source. After all, I'd found this useful so someone else might.  So here I am, a guy sitting at a desk writing code, throwing it at a wall.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What is iText ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you've not heard of &lt;a href="http://www.lowagie.com/iText/"&gt;iText&lt;/a&gt;, it's a comprehensive open source Java library that you can use to create and manipulate PDF documents. You can use it to do pretty much anything from creating a regular document, to reports to creating maps and bar charts.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Why did you create another layer on iText ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In the course of using the library I found that there were some simple and common things that I always wanted to do that were a little more complicated than I'd like. Things like adding page numbers, or calculating margins when you change the page orientation.&lt;br /&gt;&lt;br /&gt;So I started adding a layer that would shield me from that complexity for the simple documents that I needed to create.&lt;br /&gt;&lt;br /&gt;My library is fairly simplistic, for example, I only support Helvetica, Times Roman and Courier fonts. I only supports A4 and Letter page sizes. I didn't want to rewrite the entire iText library, just provide a little quicker access to the stuff I would need to change on a regular basis.&lt;br /&gt;&lt;br /&gt;If you need to create A4 (or Letter) Pdf documents that are either Landscape or Portrait. If you need to have a header with an image and footers with page numbers and If you need to include paragraphs and tables with basic fonts and formatting (such a bold, italics and colors) then this library might help you.&lt;br /&gt;&lt;br /&gt;If you have much more complex requirements then you should probably look at using iText directly or using one of the many Pdf libraries that are available.&lt;br /&gt;&lt;br /&gt;However, if this almost meets your needs and hits that sweet spot, like it did for me, then it will save a bit of time. If it is almost what you need, then you have access to the source code to make your own variation.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Show me how I can use it&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A simple example and the &lt;a href="http://www.scius.com.au/external/flash.nsf/example3.pdf"&gt;result&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt; &lt;style&gt;  &lt;!--   @page { size: 8.27in 11.69in; margin: 0.79in }   P { margin-top: 0in; margin-bottom: 0.08in }  --&gt;  &lt;/style&gt; &lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;/*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    * Create a config object to contain file location and&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    * some meta data settings&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;config&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;PdfDocumentConfig(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Example 3"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"example3.pdf"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"examples"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;config.setReportSubject(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Example 3 - Image banner"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;config.setReportAuthor(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Scius and iText"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;/*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    * Creating a header image&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;headerImage&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;HeaderImage();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;headerImage.addImage(&lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;String(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"examples/top.jpg"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;));&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;headerImage.setImageScale(HeaderImage.&lt;/span&gt;&lt;i&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;IMAGE_PAGE_SCALE&lt;/span&gt;&lt;/i&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;true&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;/*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    * Create a layout, size, orientation, margins, header and footer &lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;layout&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;LayoutElement(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;LayoutElement.&lt;/span&gt;&lt;i&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;PAGESIZE_A4&lt;/span&gt;&lt;/i&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;LayoutElement.&lt;/span&gt;&lt;i&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;ORIENTATION_PORTRAIT&lt;/span&gt;&lt;/i&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;20,20,10,10,100,100&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;// add the image to the layout&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;layout.setHeaderImage(headerImage);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;/*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    * Create the PDF content, the data written to the PDF&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;data&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;PdfData();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;data.add(&lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;ParagraphElement(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Hello World"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;));&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;/*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    * Create a instance of the PDF Document writer, using&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    * the config, data and layout&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;pdf&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;PdfDocument(config,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;data,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;layout);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;/*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    *  generate the document&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;pdf.createDocument();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;A more complicated example and the &lt;a href="http://www.scius.com.au/external/flash.nsf/example5.pdf"&gt;result&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;style&gt;  &lt;!--   @page { size: 8.27in 11.69in; margin: 0.79in }   P { margin-top: 0in; margin-bottom: 0.08in }  --&gt;  &lt;/style&gt; &lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;/*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    * Create a config object to contain file location and&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    * some meta data settings.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;config&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;PdfDocumentConfig(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Example 5"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"example5.pdf"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"examples"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;config.setReportSubject(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Example 4 - Tables"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;config.setReportAuthor(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Scius and iText"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;/*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    * Creating a header image.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;headerImage&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;HeaderImage();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;headerImage.addImage(&lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;String(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"examples/top.jpg"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;));&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;headerImage.setImageScale(HeaderImage.&lt;/span&gt;&lt;i&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;IMAGE_PAGE_SCALE&lt;/span&gt;&lt;/i&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;true&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;/*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    * Set the default style and page numbers style.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Style&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;defaultStyle&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Style(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"default"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,Style.&lt;/span&gt;&lt;i&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;TYPEFACE_TIMES_ROMAN&lt;/span&gt;&lt;/i&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,15);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;// styles for the table&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Style&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;tableStyle&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Style(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"default"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Style.&lt;/span&gt;&lt;i&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;TYPEFACE_HELVETICA&lt;/span&gt;&lt;/i&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;10);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;tableStyle.setColor(Color.&lt;/span&gt;&lt;i&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;BLUE&lt;/span&gt;&lt;/i&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Style&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;tableHeaderStyle&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Style(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"default"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Style.&lt;/span&gt;&lt;i&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;TYPEFACE_HELVETICA&lt;/span&gt;&lt;/i&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;10);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;tableHeaderStyle.setDecoration(Style.&lt;/span&gt;&lt;i&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;DECORATION_BOLD&lt;/span&gt;&lt;/i&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;tableHeaderStyle.setBackgroundColour(192,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;192,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;192);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Style&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;stylePageNumbers&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Style(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"pagenumbers"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Style.&lt;/span&gt;&lt;i&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;TYPEFACE_TIMES_ROMAN&lt;/span&gt;&lt;/i&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;15);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;stylePageNumbers.setAlign(Style.&lt;/span&gt;&lt;i&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;ALIGN_RIGHT&lt;/span&gt;&lt;/i&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;/*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    * Create a two column footer. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;footer&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;FooterTwoColumns(50,50);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;footer.setLeftColumn(&lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;CellElement(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Example 4"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;));&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;footer.setRightColumn(&lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;CellElement(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;""&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,stylePageNumbers));&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;footer.setStyle(defaultStyle);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;footer.setPageNum(&lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;PageNumbersElement(stylePageNumbers));&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;footer.includePageNumbers(&lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;true&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,FooterTwoColumns.&lt;/span&gt;&lt;i&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;PAGE_NUMBERS_RIGHT&lt;/span&gt;&lt;/i&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;/*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    * Create a layout, size, orientation, margins, header and footer &lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;layout&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;LayoutElement(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;LayoutElement.&lt;/span&gt;&lt;i&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;PAGESIZE_A4&lt;/span&gt;&lt;/i&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;LayoutElement.&lt;/span&gt;&lt;i&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;ORIENTATION_PORTRAIT&lt;/span&gt;&lt;/i&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;20,20,10,10,100,100&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;layout.setHeaderImage(headerImage);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;layout.setFooter(footer);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;/*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    * Create the PDF content, the data written to the PDF.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;data&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;PdfData();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;data.add(&lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;ParagraphElement(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Hello World"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;defaultStyle));&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;data.add(&lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;ParagraphElement(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"table of authors\n\n"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;defaultStyle));&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;// add tabular information&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;TableElement&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;table&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;TableElement(3);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;// define the column widths&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;float&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;[]&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;wd&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{50f,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;25f,25f};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;table.setColumnWidths(wd);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;// start adding data&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;RowElement&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;row&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;RowElement();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;row.addCell(&lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;CellElement(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Author"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,tableHeaderStyle));&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;CellElement&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;ce&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;CellElement(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Book Details"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,tableHeaderStyle);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;ce.setCellspan(2);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;row.addCell(ce);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;table.AddRow(row);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;RowElement&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;row2&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;RowElement();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;row2.addCell(&lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;CellElement(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Bruno Lowgie"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;tableStyle));&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;row2.addCell(&lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;CellElement(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"iText in Action"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;tableStyle));&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;row2.addCell(&lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;CellElement(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"http://www.lowagie.com/iText"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,tableStyle));&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;           &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;table.AddRow(row2);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;RowElement&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;row3&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;RowElement();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;row3.addCell(&lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;CellElement(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Bruce Eckel"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;tableStyle));&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;row3.addCell(&lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;CellElement(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Thinking in Java"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;tableStyle));&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;row3.addCell(&lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;CellElement(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"http://mindview.net/Books/TIJ4"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,tableStyle));&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;           &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;table.AddRow(row3);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;// add the table to the data transfer object&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;data.add(table);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;/*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    * Create a instance of the PDF Document writer, using&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    * the config, data and layout.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;pdf&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;PdfDocument(config,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;data,&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;layout);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;/*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    *  creates the pdf document file.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;    */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0in; margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;pdf.createDocument();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Where can I get it ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.scius.com.au/external/flash.nsf/scius-pdfdoc-beta6.zip"&gt;Here&lt;/a&gt;...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What's in the zip file ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The zip file contains;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A source folder, complete with 5 examples.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;A library folder with my library (scius-pdfdoc-beta6.jar) and the iText jar,&lt;/li&gt;&lt;li&gt;A doc folder with a &lt;a href="http://www.scius.com.au/external/flash.nsf/readme.pdf"&gt;document&lt;/a&gt; that describes the library and how to get started with it in eclipse,&lt;br /&gt;&lt;/li&gt;&lt;li&gt;A javadoc foder with the javadoc for the source code.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;What's next ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If I get enough interest then I'll write a step by step guide, similar to the eclipse one, showing you how to using the library in Notes and Domino.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-7022061151289756115?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/7022061151289756115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2008/10/simple-java-library-for-creating-pdfs.html#comment-form' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/7022061151289756115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/7022061151289756115'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2008/10/simple-java-library-for-creating-pdfs.html' title='A simple java library for creating pdfs'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-9089215881670258650</id><published>2008-10-03T15:14:00.004+10:00</published><updated>2008-10-03T15:45:50.987+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><title type='text'>My Office</title><content type='html'>&lt;span style="font-family:verdana;"&gt;Ok, I'll join in too.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_zz66mErCWS8/SOWqr3MrzAI/AAAAAAAAAGY/MnQWg6I5uc4/s1600-h/office-large.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_zz66mErCWS8/SOWqr3MrzAI/AAAAAAAAAGY/MnQWg6I5uc4/s400/office-large.jpg" alt="" id="BLOGGER_PHOTO_ID_5252792210925800450" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;A - kids art work.&lt;/span&gt; &lt;span style="font-family:verdana;"&gt;&lt;br /&gt;B - bag from the recent collaboration and portal technical university&lt;/span&gt; &lt;span style="font-family:verdana;"&gt;&lt;br /&gt;C - x3200 office file server&lt;/span&gt; &lt;span style="font-family:verdana;"&gt;&lt;br /&gt;D - generic PC reverse proxy&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;E - z61t (Development Server and Development Client)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;F - Various Tech books - no redwiki's here :-)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;G - box to recycle paper (we're a green company you know !)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;H - Corporate coloured mug....really, everything has to match&lt;/span&gt; &lt;span style="font-family:verdana;"&gt;&lt;br /&gt;I - Empty cabinet, except for a couple of old mobile phones and a redundant usb HD&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;E (continued..) multiple development environments.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_zz66mErCWS8/SOWwQRmGtnI/AAAAAAAAAGg/lkY0KzsaoUc/s1600-h/dev-environment.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_zz66mErCWS8/SOWwQRmGtnI/AAAAAAAAAGg/lkY0KzsaoUc/s320/dev-environment.jpg" alt="" id="BLOGGER_PHOTO_ID_5252798334045173362" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-9089215881670258650?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/9089215881670258650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2008/10/my-office.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/9089215881670258650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/9089215881670258650'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2008/10/my-office.html' title='My Office'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_zz66mErCWS8/SOWqr3MrzAI/AAAAAAAAAGY/MnQWg6I5uc4/s72-c/office-large.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-8249982324266163928</id><published>2008-09-03T23:00:00.002+10:00</published><updated>2008-09-04T09:14:37.876+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lotus'/><category scheme='http://www.blogger.com/atom/ns#' term='Domino'/><title type='text'>My take on the truth : part 3</title><content type='html'>&lt;div&gt;Nathan asked the question "&lt;a href="http://www.lotus911.com/nathan/escape.nsf/d6plinks/NTFN-7GUS3N"&gt;So how do you maximise the adaptability of your solution&lt;/a&gt;". Ironically, this post has been 'brewing' in draft for some time, so it's timely that the third truth has popped up in time for me to post it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One of the concepts of &lt;a href="http://en.wikipedia.org/wiki/Extreme_programming"&gt;XP&lt;/a&gt; is "do the best today, striving for the awareness and understanding necessary to do better tomorrow", which in essence is what we want to achieve by having adaptable (or agile) solutions. To have a solution designed and developed in such a way that incremental changes (refactoring) to meet new needs is not an major deal. I'm not saying adopt XP or Agile techniques and magically your solution will be agile. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So what am I saying, and what has XP and Agile got to do with Notes and Domino development ?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The most important thing for me is the mindset of XP and Agile. When I approach development I start by considering what is absolutely necessary to get a solution, but being mindful of potential unknown future requirements. Sort of future proofing the solution in design, but only implementing what is needed for today. It's a guessing game, sure, but with experience you get better at anticipating those areas. In XP this is the simple principle, "What is the simplest solution that could work". This is not deliver on minimal spec or cutting corners so that you are locked in to an incorrect approach.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Using Object Oriented (OO) techniques in your code can allow you to be more agile when refactoring and can provide good reuse. However, there is a trap.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In OO you can sometimes trip up and try to implement every possible feature in a class. Something that I did, when reuse was king and Lotus Notes 4.6 was the latest version. For your solution today, some of what you develop for &lt;span class="Apple-style-span" style="font-style: italic;"&gt;ultimate&lt;/span&gt; reuse may not be necessary today.  In effect you are adding additional complexity for what you actually need &lt;span class="Apple-style-span" style="font-style: italic;"&gt;right now&lt;/span&gt; - and your effort may never be used - wasted. Don't get caught in the trap of building the perfect class with every possible method/feature or property that anyone could ever want. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, this doesn't mean doing a &lt;a href="https://gettingreal.37signals.com/ch05_Half_Not_Half_Assed.php"&gt;half baked job&lt;/a&gt; or locking yourself into an approach. (&lt;a href="http://www.37signals.com/"&gt;37 signals&lt;/a&gt; have an interesting take on this - read the article). It does mean being brutal about what to include and what not to include. Which means that you can spend time on the bits that you do need, ensuring that what you deliver is of a better quality.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;All of this is just a bunch of nice concepts and buzz words - show me the code, I hear you ask. So here, in code, is one example of how I did this with LotusScript.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the first version of our web content system, I needed to be able to send Mime messages. The message template was stored as XML/XHTML template in a document. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I created a generic &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;MimeMessage&lt;/span&gt; class to handle the construction and sending of a HTML message. I didn't start by trying to implement every Mime feature based on the spec. I just wrote  what I needed. I implemented a &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;SCMTemplateMailMessage&lt;/span&gt; to wrap the retrieving of the template XML and Mime message creation so that the code in my agents and actions looked like this.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Dim confirmMessage As SCMTemplateMailMessage&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Set confirmMessage = New SCMTemplateMailMessage(session,noteProcessed)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;confirmMessage.SendTo=noteProcessed.email(0)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Call confirmMessage.SendMessage("register_confirm")&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Later aother client, for a different website, based on the same CMS code required a weekly report of registrations in a CSV file. I extended the &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;SCMTemplateMailMessage&lt;/span&gt; to a &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;SCMTemplateReportMailMessage&lt;/span&gt;, which sourced the recipient list stored with a refactored template document. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I also needed to send Mime attachments, I refactored the &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;MimeMessage&lt;/span&gt; class to include three new member variables and a new method, to store the filename ready for attaching.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;MimeMessage.addAttachment(filename As String, stype As String, displayName As String)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This was then called from the method.&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;SCMTemplateReportMailMessage.appendAttachment()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When I looked at the way in which to generate attachments, the type "text/csv", seemed something that in the future might change. I included this a seperate parameter for the mime type - designing some flexibility for the future.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Later on a new requirement surfaced where a mime messages with two pdf attachments needed to be sent.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I refactored the &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;MimeMessage&lt;/span&gt; class again. I updated the inner workings, by changing the member variables to be an array of files, types and display name. This then allowed the adding of multiple attachments which could be pdfs or some other file type. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The code in the new agent, for sending pdf reports looks like so.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Set confirmMessage = New SCMTemplateMailMessage(session,note)&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Call confirmMessage.appendAttachment("file1.pdf","application/pdf")&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Call confirmMessage.appendAttachment("file2.pdf","application/pdf")&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;confirmMessage.SendTo = note.email(0)&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Call confirmMessage.SendMessage("personal_performance")&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When I started building the MimeMessage class, I had no idea that I might need to send attachments let alone multiple attachments. The code was refactored to include new features and functionality and allowed me to quickly add additional features.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Of course this is a LotusScript example, but the same is true for other elements if you look at how you can use shared subforms, columns, actions and fields and file resources - there are  ways that you can design agility into your solution. Notes provides a lot of functionality that helps agility and for me it's a sweet spot for the type of applications that I deliver.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Build for today, Design for tomorrow.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That's how I ensure my solutions are adaptable and I'm looking forward to seeing 'the truth:part 4'&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-8249982324266163928?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/8249982324266163928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2008/06/my-take-on-truth-part-3.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/8249982324266163928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/8249982324266163928'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2008/06/my-take-on-truth-part-3.html' title='My take on the truth : part 3'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-8816301204270149791</id><published>2008-08-06T09:28:00.004+10:00</published><updated>2008-08-06T10:26:14.860+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lotus'/><category scheme='http://www.blogger.com/atom/ns#' term='Dojo'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><category scheme='http://www.blogger.com/atom/ns#' term='Domino'/><title type='text'>SnTT : The Dojo Example NSF - available now.</title><content type='html'>&lt;span style="font-family: verdana;"&gt;The NSF containing the recipe from my four Dojo posts, is available for download and reuse - plus there is an added bonus too! If you want to see the code for;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="font-family: verdana;" href="http://palmerweb.blogspot.com/2008/02/sntt-dojo-dialogs-for-validation-and.html"&gt;Dojo Dialogs for Validation and Help&lt;/a&gt;&lt;span style="font-family: verdana;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;a style="font-family: verdana;" href="http://palmerweb.blogspot.com/2008/02/sntt-dojo-stack-container-for-wizards.html"&gt;Dojo Stack Container for Wizards&lt;/a&gt;&lt;span style="font-family: verdana;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;a style="font-family: verdana;" href="http://palmerweb.blogspot.com/2008/05/sntt-dojo-its-not-just-eye-candy.html"&gt;Dojo : Its not just Eye Candy&lt;/a&gt;&lt;span style="font-family: verdana;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;a style="font-family: verdana;" href="http://palmerweb.blogspot.com/2008/08/dojo-without-javascript-enabled.html"&gt;Dojo without JavaScript Enabled&lt;/a&gt;&lt;span style="font-family: verdana;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;The added bonus ?&lt;br /&gt;&lt;br /&gt;I've included all of the image resources, example framesets, outlines, forms  from the post &lt;/span&gt;&lt;a style="font-family: verdana;" href="http://palmerweb.blogspot.com/2008/05/sntt-lotus-notes-and-web-ui-examples.html"&gt;Lotus Notes and Web UI Examples&lt;/a&gt;&lt;span style="font-family: verdana;"&gt;. That's right, if you have a lotus notes application that is looking a little '&lt;/span&gt;&lt;a style="font-family: verdana;" href="http://interfacematters.com/2008/08/is-lotus-notes-long-in-tooth.html"&gt;long in the tooth&lt;/a&gt;&lt;span style="font-family: verdana;"&gt;' then you can use the application resources to create a little more up-to-date look.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: verdana;"&gt;How to get started ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;1 - download the zipped nsf from &lt;/span&gt;&lt;a style="font-family: verdana;" href="http://www.scius.com.au/external/flash.nsf/dojo-examples-nsf.zip"&gt;here&lt;/a&gt;&lt;span style="font-family: verdana;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;2 - sign the agent on you server.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;3 - open the register form using http://[yourserver]/[file&amp;amp;directory]/register?open&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: verdana;"&gt;A little more about the examples.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;The NSF is to demonstrate the Dojo samples from the articles, I tried to keep the number of places where the code is located to a minimum. So you'll only need to look in the register form and the two agents. In practice you could take the JS Header contents and place them in a separate file.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;The database is version ND8 (8.0.1), but should work the same for ND7 - I haven't tried that.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;The dojo version is 1.0.2, which was the latest when I started using Dojo - again, should work with later versions but I haven't tried.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: verdana;"&gt;What if I need more help with the example ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;You have two options, &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;1) - Free. I'll do my best to answer - but that will be limited to my availability and workload.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;2) - &lt;a href="http://www.scius.com.au"&gt;Hire&lt;/a&gt; me. If you need more involved assistance or have a deadline.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: verdana;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-8816301204270149791?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/8816301204270149791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2008/08/sntt-dojo-example-nsf-available-now.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/8816301204270149791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/8816301204270149791'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2008/08/sntt-dojo-example-nsf-available-now.html' title='SnTT : The Dojo Example NSF - available now.'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-3221377324847597013</id><published>2008-08-01T10:04:00.009+10:00</published><updated>2008-08-01T12:47:39.559+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SnTT'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><category scheme='http://www.blogger.com/atom/ns#' term='Domino'/><title type='text'>Dojo without JavaScript Enabled</title><content type='html'>&lt;span style="font-family:verdana;"&gt;So what can you do if the users browser does not have JavaScript enabled ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Even in todays day and age, there are still a small minority of Joe Average users that either don't have JavaScript enabled through bad set-up or overzealous security settings. Even for an intranet you might like to be able to help out the poor employee that 'some how' has managed to turn off JavaScript and give them a message that all is not well with the page that they are using.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;If you are using JavaScript or an Ajax toolkit for use in building forms that collect data, and rely on scripting to perform validation, then having JS disabled can be a problem.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Like most things there are various schools of thought and regardless of whether you choose &lt;/span&gt;&lt;a style="font-family: verdana;" href="http://en.wikipedia.org/wiki/Progressive_enhancement"&gt;progressive enhancement&lt;/a&gt;&lt;span style="font-family:verdana;"&gt; or &lt;/span&gt;&lt;a style="font-family: verdana;" href="http://en.wikipedia.org/wiki/Unobtrusive_JavaScript"&gt;graceful degradation&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;,  you should at least have an alternative to solely relying on JS being available.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;I decided that a simple graceful degradation was the most appropriate option for  me. That is, if JS is disabled then show an error message and disabled the Ajax form. The solution is so simple that I wasn't sure if it would be worth a post - but hey what the heck!&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;The idea is  to hide all the forms and buttons using css, then  if JS is disabled use the  &lt;/span&gt;&lt;a style="font-family: verdana;" href="http://www.w3schools.com/TAGS/tag_noscript.asp"&gt;&amp;lt;noscript&amp;gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt; tag to display a suitable message. If JS is available, then use the Dojo goodness to replace the style of the form objects.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;In Domino, I added a subform to contain the contents between the noscript tag.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;noscript&amp;gt;&amp;lt;img src="design/bb70/$file/error.jpg"/&amp;gt;&lt;br /&gt;&amp;lt;h1&amp;gt;Error : JavaScript is not enabled&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;lt;p &amp;gt;&amp;lt;strong&amp;gt;Message:&amp;lt;/strong&amp;gt;Your browser does not have JavaScript enabled and is required for this website to function correctly.&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;p &amp;gt;&amp;lt;strong&amp;gt;Action:&amp;lt;/strong&amp;gt;You can do one of the following;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;ul&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;Enable JavaScript for this website in your browser&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;Contact your IT support department or supplier to get JavaScript enabled in your browser&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;&amp;lt;p &amp;gt;You will need to refresh this page once JavaScript is enabled.&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/noscript&amp;gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;In the sylesheet add in a new class.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-family:courier new;"&gt;.noscript {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    display:none;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;In the HTML node that contains the form, update (or add) the class to be "noscript", which hides the form so that it can't be submitted. Do the same for other nodes that rely on JS.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;In the onload() event of the form, add the code to change the hidden forms, to be visible using the dojo.removeClass and dojo.addClass.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-family:courier new;"&gt;dojo.removeClass("caseForm","noscript");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;dojo.addClass("caseForm","case-form");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;dojo.removeClass("dojopopups","noscript");&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;You can take the noscript idea further and provide an alternative non JS form to submit, rather than an error message. You could also use server side validation as the definitive way ensure the forms submitted have been completed correctly.&lt;br /&gt;&lt;br /&gt;Even if you don't expect JS to be disabled, implementing a system like the one described is simple and quick enough, that its not much extra effort and might just save you a headache or two.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-3221377324847597013?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/3221377324847597013/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2008/08/dojo-without-javascript-enabled.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/3221377324847597013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/3221377324847597013'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2008/08/dojo-without-javascript-enabled.html' title='Dojo without JavaScript Enabled'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-5038375317128845990</id><published>2008-05-29T20:50:00.011+10:00</published><updated>2008-05-29T22:58:23.501+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lotus'/><category scheme='http://www.blogger.com/atom/ns#' term='UI'/><category scheme='http://www.blogger.com/atom/ns#' term='Domino'/><title type='text'>SnTT: Lotus Notes and Web UI Examples</title><content type='html'>&lt;div&gt;&lt;a href="http://quintessens.wordpress.com/2008/05/28/great-ui-examples-for-ln-applications/"&gt;Patrick&lt;/a&gt; asked for some Notes UI examples, so I thought that I'd post a couple of mine in the interest of additional food for thought - and also to let &lt;a href="http://interfacematters.com/"&gt;Chris&lt;/a&gt; and that other &lt;a href="http://www.lotus911.com/nathan/escape.nsf/"&gt;chap&lt;/a&gt; (the one with the funny colored hair!) that their mission was maybe a little effective.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'll explain how I ended up with each UI. First of all I'm not a graphic designer and would never claim to be one. I'm pretty familiar with Photoshop and Gimp and if I'm given a starting point then I can come up with a few similar concepts.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The inspiration for my latest UIs are from the web 2.0 styles and web 2.0 applications. I love the simplicity of the interfaces like &lt;a href="http://www.basecamphq.com/"&gt;basecamp&lt;/a&gt;, &lt;a href="http://ideajam.net/"&gt;ideaJam&lt;/a&gt;, &lt;a href="http://www.rememberthemilk.com/"&gt;Remember the milk&lt;/a&gt; and &lt;a href="http://www.linkedin.com/"&gt;linkedin&lt;/a&gt;. These application have the less-is-more approach to making the interfaces simple. This is what I was striving for. A simple interface that is closer to what you see on the web than the traditional notes applications.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've still retained the traditional frames approach, but removing the borders made the first page more web like. The horizontal outline in black, for the primary navigation is something that you might see on a website. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_zz66mErCWS8/SD6SMKvvCOI/AAAAAAAAAFE/6NewYua_zKE/s1600-h/snippets.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_zz66mErCWS8/SD6SMKvvCOI/AAAAAAAAAFE/6NewYua_zKE/s400/snippets.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5205758957027526882" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;On the form the removal of the traditional border around the action bar is removed and shaded so that the action button feels more like it is part of the page. (I think that I picked up that tip from someone else, although I can't remember who)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_zz66mErCWS8/SD6R_6vvCNI/AAAAAAAAAE8/c09ke7vx5zQ/s1600-h/member.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_zz66mErCWS8/SD6R_6vvCNI/AAAAAAAAAE8/c09ke7vx5zQ/s400/member.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5205758746574129362" /&gt;&lt;/a&gt;The downside of the tabbed approach is that printing format isn't that great, but the client rarely prints so its not much of an issue.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Finally a web example, this is a Lotus Domino web application. The process that this manages is a 6 step process with sub task for each one. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I started by drawing a low fidelity prototype which laid out what I wanted to convey and where to put it. For example, the status of the top level steps and status bar for the sub steps.  I then engaged a local graphic designer to come up with the images, colors and general look and feel.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_zz66mErCWS8/SD6RG6vvCMI/AAAAAAAAAE0/bxOiaiX1jkU/s1600-h/web1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_zz66mErCWS8/SD6RG6vvCMI/AAAAAAAAAE0/bxOiaiX1jkU/s400/web1.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5205757767321585858" /&gt;&lt;/a&gt;&lt;br /&gt;With these examples I think that I got a closer to what I was striving for and embraced some of the things that Chris and Nathan endorse. Starting with a blank piece of paper and working out what am I'm trying to tell the user was a good technique for me to detach from the technology and focus on the interface without considering how to implement it. For web applications this works well. For Notes applications, there's no harm in starting with the vision and then re-factoring the paper interface by accepting compromises as you work out the detail.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Finally try de-cluttering the interface. You might have elements of your design that have been inherited from application to application and just accepted as required.&lt;/div&gt;&lt;div&gt;I've seen heaps of LN applications that have the old classic 5 entry audit history tagged at the bottom of every form. Do forms with pick list values for dblookups really require an audit history ? If not then get rid of them as they are not only cluttering the interface but you are also storing and managing irrelevant information.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;There you go Patrick, a few additional Lotus Notes and Domino UI examples.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-5038375317128845990?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/5038375317128845990/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2008/05/sntt-lotus-notes-and-web-ui-examples.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/5038375317128845990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/5038375317128845990'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2008/05/sntt-lotus-notes-and-web-ui-examples.html' title='SnTT: Lotus Notes and Web UI Examples'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_zz66mErCWS8/SD6SMKvvCOI/AAAAAAAAAFE/6NewYua_zKE/s72-c/snippets.jpg' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-5631332997073262179</id><published>2008-05-19T14:46:00.007+10:00</published><updated>2008-05-20T14:46:27.448+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SnTT'/><category scheme='http://www.blogger.com/atom/ns#' term='Dojo'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><category scheme='http://www.blogger.com/atom/ns#' term='Domino'/><title type='text'>SnTT : Dojo. It's not just eye candy</title><content type='html'>&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;If you thought that Dojo was all about fancy widgets and eye candy for you web apps, then you might have missed another advantage of using Dojo. In fact, it's not just Dojo. Most of the popular toolkits provide the features to make OO in JavaScript easier. I'm using Dojo, so my third post on Dojo is all about how I used OO in Dojo.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;The challenge.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Let me explain the challenge. I needed to build  a few HTML forms (without resorting to the whole lotus workplace forms solution). The forms, while fairly short (the longest being 30 multiple choice questions), were complicated by the fact that a large majority needed to include the 'Other - please specify' additional to the simple radio and checkbox fields. In addition the users could also choose different paths through questions. As a user answers the questions the subsequent questions that they need to answer change.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;I wanted to have the simplest user experience possible and in my opinion that means, if you can't fill in a field then it should be hidden away. In short, I wanted the field that captures the 'other' detail to be hidden until the 'other' choice is selected. Likewise, fields that are not available based on previously selected choices are also hidden. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;To make it even simpler for the user I wanted to maintain the hidden fields choices. If the user changed their mind a few times, they would not need to repeat answering questions. I would also need to remove all the hidden values before the form was submitted so that the data sent to the server represented exactly what was on screen.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;It sounds like a lot of work, for something so simple as filling in a few multiple choice fields - but I don't think of it has extra programming. Think of it as an investment in reducing the number of support calls.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;So why Dojo ?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Sure, you could do all of this in plain old JS. Functions for this and functions for that, but wouldn't it be nice to be able to just write some simple JavaScript. Something like...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;if(fielda.mandatorySelected()==false) {&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;// then record or show errors&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;or &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;fielda.visible(true);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;fieldb.visible(false);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;and maybe...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;fielda.display();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;fieldb.display();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Dojo.Declare.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Dojo gives you a great framework for &lt;/span&gt;&lt;a href="http://dojotoolkit.org/book/dojo-book-0-9/part-3-programmatic-dijit-and-dojo/object-orientation"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;OO&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt; using &lt;/span&gt;&lt;a href="http://dojotoolkit.org/book/dojo-book-0-9/part-3-programmatic-dijit-and-dojo/object-orientation/declaring-class"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Dojo.declare&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt; for building JS classes. Its simple to implement, simple to reuse and easy to read. If you are reusing it then you're writing less lines of code. Which means less that the browser needs to download which in turn makes the pages load faster. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;How did I use Dojo Declare ?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;In the Notes form, the HTML looks like the screen shot below. A div for the radio or checkbox field with a unique id 'q8' and a div for the other field with a unique id of 'q8-other'.  All pretty standard stuff.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;img src="http://1.bp.blogspot.com/_zz66mErCWS8/SDEZw-aCg0I/AAAAAAAAAEU/3sM0SOB38BQ/s400/other-fields.jpg" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;I started by calling my class scius.AuditField. I won't reproduce all the functions as I've attached the JS file &lt;/span&gt;&lt;a href="http://www.scius.com.au/external/flash.nsf/sciusauditfield.js"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;here&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;dojo.declare("scius.AuditField", null, &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;{ ... } );&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;then I added in some member variables and the constructor. The constructor allows me to initially specify the visibility, and if this field has the 'other' field.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;_id:null,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;_other:"other",&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;_hasOther : null,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;_isVisible : null,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;_otherIdSuffix : "-other",&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;_otherFieldSuffix  : "other",&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;constructor : function(id, isvisible, hasOther) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;this._id = id;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;this._hasOther = hasOther;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;this._isVisible = isvisible;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;some setters and getters (or properties), which I can use to determine the visibility or set the visibility.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;visible : function(isVisible) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;this._isVisible = isVisible;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;},&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;isVisible : function() {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;return this._isVisible;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;},&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;The hiding and showing using CSS classes through hide() and show() which is called by the display() function. The display function also checks to see if it needs to display the 'other' field (see the source code attached).&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;hide : function(fieldid) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;dojo.removeClass(fieldid,'form-fields');&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;dojo.addClass(fieldid,'form-fields-hidden');&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;},&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;show : function(fieldid) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;dojo.removeClass(fieldid,'form-fields-hidden');&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;dojo.addClass(fieldid,'form-fields');&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Next is the checking of mandatory fields function. Note I reused an existing function to determine the actual value of the radio button via the 'isRadioChecked(rbo)' line. I guess it should really be part of the class or a utility class of its own.....maybe one day it will !&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;mandatorySelected : function() {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;var rbo= document.forms[0][this._id];&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;if(isRadioChecked(rbo)) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;if (this._hasOther &amp;amp;&amp;amp; this.hasValue("other")) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;var oth = document.forms[0][this._id+this._otherFieldSuffix];&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;if (oth.value=="") {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;return false;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;} else {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;return true;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;} else {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;return true;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;} else {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;return false;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;},&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;So how did I use this class in the Form ?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;As I had around 30 questions, I decided to store the questions in an array and initialize them in the Notes forms JSHeader object. Creation is fairly simple. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;The format is scius.AuditField(domid, visible, hasOther).&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;var qlist = new Array();&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;qlist[8] = new scius.AuditField("q8",false, false);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;qlist[9] = new scius.AuditField("q9",false, true);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;....&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;I have a checkConditionalQuestion() function that gets called from the onClick() of each field, which checks the visibility of dependent fields.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;function checkConditionalQuestion(cond_question) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;span class="Apple-style-span" style="white-space: normal;"&gt;} else if (cond_question=="7") {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;if (qlist[7].hasValue("yes")) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;qlist[8].visible(true);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;qlist[9].visible(false);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;}else if (qlist[7].hasValue("no")) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;qlist[9].visible(true);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;qlist[8].visible(false);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;qlist[7].display();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;qlist[8].display();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;qlist[9].display();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;} else if (cond_question=="9") {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;qlist[9].display();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;You've already seen the checking of mandatory field values and of course there is the emptying of the invisible fields. Called after validation and before the submit.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;function emptyInvisible() {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;for (var i = 1; i &lt;= 30; i++) { &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;if (qlist[i].isVisible()==false) {&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;qlist[i].empty();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Summary.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Using the Dojo.declare to create classes is more readable than the JS &lt;/span&gt;&lt;a href="http://developer.mozilla.org/en/docs/Introduction_to_Object-Oriented_JavaScript"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;prototype&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt; way. The format is closer to the way you would create Object in LotusScript and Java and so is familiar and easier to read. I only scratched the surface of what's possible and I can see areas for improvement. If you are interested, here it is in &lt;/span&gt;&lt;a href="http://www.scius.com.au/external/flash.nsf/dojodeclare.html"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;action.&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;  &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Next.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;I think that a database containing the three articles as a download would be a useful starting place if you need to implement similar forms. I've already started pulling out the various components into a standalone application and I'd like to tidy up a few areas before releasing it. As soon as its ready I'll post it.  I can't say when - it all depends on the workload over the next few months. &lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-5631332997073262179?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/5631332997073262179/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2008/05/sntt-dojo-its-not-just-eye-candy.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/5631332997073262179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/5631332997073262179'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2008/05/sntt-dojo-its-not-just-eye-candy.html' title='SnTT : Dojo. It&apos;s not just eye candy'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_zz66mErCWS8/SDEZw-aCg0I/AAAAAAAAAEU/3sM0SOB38BQ/s72-c/other-fields.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-3149927526096679073</id><published>2008-05-07T21:20:00.006+10:00</published><updated>2008-05-07T22:14:58.782+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>YSlow - in moderation.</title><content type='html'>&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;An interesting &lt;/span&gt;&lt;a href="http://ajaxian.com/archives/ajaxian-featured-tutorial-using-yslow-for-performance-analysis"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;post&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt; popped up on my &lt;/span&gt;&lt;a href="http://ajaxian.com/"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Ajaxian&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt; feed, which linked to a &lt;/span&gt;&lt;a href="http://www.ibm.com/developerworks/web/library/wa-aj-perform/?ca=dgr-lnxw01FasterAjax"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;post&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt; in developerworks. The post is about using Yahoos &lt;/span&gt;&lt;a href="http://developer.yahoo.com/yslow/"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;YSlow&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt; tool. YSlow analyzes a website and gives you a performance score complete with suggestions.&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;The posts are worth a read if you are interested in how to make your websites and web applications quicker. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;I decided to run YSlow against a web application that is in the final testing phase - just out of curiosity. I'd already checked the performance with firebug and was pretty happy with the speed, especially seeing as it used a few of the dojo libraries and was much faster that the clients website. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;I was disappointed when YSlow reported a middle of the range score. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;I then ran YSlow against a number of popular websites and web applications, all of which fared similar to mine. Finally, I decided to run YSlow against the local Yahoo website au.yahoo.com.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Guess what....&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;img src="http://2.bp.blogspot.com/_zz66mErCWS8/SCGT7PPKuXI/AAAAAAAAAEM/_vFrm_chdaA/s320/yslow.jpg" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Yahoo gets an F. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;I felt much better after that.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;After a bit of &lt;/span&gt;&lt;a href="http://www.codinghorror.com/blog/archives/000932.html"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;research&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;, it seems as though you shouldn't take the score card too literally. There are plenty of popular websites out there that don't score highly according to YSlow.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-3149927526096679073?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/3149927526096679073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2008/05/yslow-in-moderation.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/3149927526096679073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/3149927526096679073'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2008/05/yslow-in-moderation.html' title='YSlow - in moderation.'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_zz66mErCWS8/SCGT7PPKuXI/AAAAAAAAAEM/_vFrm_chdaA/s72-c/yslow.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-8654110555338938768</id><published>2008-02-28T15:45:00.002+11:00</published><updated>2008-02-28T16:00:36.264+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SnTT'/><category scheme='http://www.blogger.com/atom/ns#' term='Dojo'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><category scheme='http://www.blogger.com/atom/ns#' term='Domino'/><title type='text'>SnTT : Dojo Stack Container for Wizards</title><content type='html'>Here is a simple tutorial of how you can use the Dojo stack container (dijit.layout.StackContainer) to make a multi-page (dijit.layout.ContentPane) wizard. The sort of thing where you can progressively lead users through completing a form or reading content. The tutorial also shows how you can integrate your own website styling rather than having to use the three shipped themes with Dojo. You can get all the dojo goodness such as ease of use and use your own styles at the same time.&lt;br /&gt;&lt;br /&gt;The tutorial is in flash/camtasia format and is my second attempt at camtasia recording, which include my slow typing and excessive mouse movements - but you'll get the idea.&lt;br /&gt;&lt;br /&gt;So enjoy the &lt;a href="http://www.scius.com.au/external/flash.nsf/dojoStackContainer.html"&gt;Dojo Stack Container&lt;/a&gt; tutorial.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-8654110555338938768?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/8654110555338938768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2008/02/sntt-dojo-stack-container-for-wizards.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/8654110555338938768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/8654110555338938768'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2008/02/sntt-dojo-stack-container-for-wizards.html' title='SnTT : Dojo Stack Container for Wizards'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-2317773077538261732</id><published>2008-02-11T11:33:00.000+11:00</published><updated>2008-02-11T11:34:56.777+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><title type='text'>Addicted ?</title><content type='html'>&lt;a href="http://www.justsayhi.com/bb/blog_addiction" style="background: transparent url(http://assets.justsayhi.com/badges/827/810/blog_addiction.80xvftcfhm.jpg) no-repeat scroll 0% 50%; color: rgb(214, 75, 50); text-decoration: none; display: block; width: 286px; height: 128px; padding-top: 50px; padding-left: 17px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; font-family: Times New Roman,sans-serif; font-size: 30px;"&gt;62%&lt;span style="display: none;"&gt;How Addicted to Blogging Are You?&lt;/span&gt;&lt;/a&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-2317773077538261732?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/2317773077538261732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2008/02/addicted.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/2317773077538261732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/2317773077538261732'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2008/02/addicted.html' title='Addicted ?'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-4542092309568054428</id><published>2008-02-06T14:40:00.000+11:00</published><updated>2008-02-07T19:47:46.595+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SnTT'/><category scheme='http://www.blogger.com/atom/ns#' term='Dojo'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><category scheme='http://www.blogger.com/atom/ns#' term='Domino'/><title type='text'>SnTT : Dojo Dialogs for validation and help</title><content type='html'>&lt;span style="FONT-WEIGHT: bold"&gt;Greetings&lt;/span&gt;,&lt;br /&gt;&lt;br /&gt;It looks like 2008 started of nicely judging by the post and comments on the blogsphere in January. While most of you were getting insane brain dumps of all things Lotus and quite possibly bleeding yellow, I was doing the same as &lt;a href="http://collaborationmatters.com/blog/cmblog.nsf/dx/lotusphere2008.-must.stop.torturing.myself...?opendocument&amp;amp;comments#anc1"&gt;Stuart&lt;/a&gt;. I was also getting started on a new project, toiling away in the southern hemisphere - where we have experienced one of the wettest summers in the 10 years that I been in Sydney&lt;br /&gt;&lt;br /&gt;One of the interesting announcements was the support for Dojo in the Domino 8.5 server (although seeing it is used in quikr I was expecting it at some point). Dojo has been on my list of things to look at for a while. I know that others prefer different tool kits and I've had a look at some of them. I guess knowing that dojo will ship with Domino is some indication that it will be better supported and less gotchas. So if you have only time to learn one, then dojo is a safe bet for Domino developers.&lt;br /&gt;&lt;br /&gt;I've wanted to use dojo but never had a reason to use Ajax. For the new project there was specific functionality that I wanted and dojo looked like it could provide it. My requirements were that firstly I wanted to have a validation dialog that shows the user, in one hit, all of the fields that failed validation and why. I also needed to check that a user name wasn't already a registered user in the NAB (Domino Directory). I also wanted this to be cross browser and I also quite liked the way that lightshow and quickr fade the background and have a modal type effect where the user can't access the rest of the page.&lt;br /&gt;&lt;br /&gt;This post explains the recipe and how to implement this is your own applications using dojo 1.0.2. If you want to see this in action I've linked to a &lt;a href="http://www.scius.com.au/external/blog.nsf/dx/dojoDialogs.swf/$file/dojoDialogs.swf"&gt;flash movie.&lt;/a&gt; (my first effort in using Camtasia - thanks Carl)&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Step1. download Dojo and mix with Domino.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Firstly, download the Dojo toolkit. I used 1.0.2. Then use the ridiculously easiest WebDAV method for uploading the toolkit into a database (really it's so easy that it almost hurts). Check out the instructions on the &lt;a href="http://www.codestore.info/store.nsf/unid/FISR-6U8SN7?OpenDocument"&gt;award winning bloggers website&lt;/a&gt; ( BTW, congratulations to Jake). Just make sure that 'design locking' is enabled.&lt;br /&gt;&lt;br /&gt;Secondly, (and optionally) you can the run the Dojo test harness &amp;lt;dojo-root&amp;gt;\dijit\tests\runTests.html just to check that the installation is fine and dandy.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Step2. Libraries&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Next we will need to include the appropriate dojo libraries for our use. You do this in the &amp;lt;HEAD&amp;gt; tag for your form.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;&lt;span style="font-size:85%;"&gt;/script&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;lt;&lt;span style="font-size:85%;"&gt;script type="text/javascript" src="http://dev.bonesbeyond70.com.au/development/bonesbeyond.nsf/dojo102/dojo/dojo.js" djConfig="isDebug: true, parseOnLoad: true"&gt;&lt;/span&gt;&amp;lt;&lt;span style="font-size:85%;"&gt;/script&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;lt;&lt;span style="font-size:85%;"&gt;style type="text/css"&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;@import "http://server/development/bonesbeyond.nsf/dojo102/dojo/resources/dojo.css";&lt;br /&gt;@import "http://server/development/bonesbeyond.nsf/dojo102/dijit/themes/dijit.css";&lt;br /&gt;@import "http://server/development/bonesbeyond.nsf/dojo102/dijit/themes/tundra/tundra.css";&lt;br /&gt;&lt;/span&gt;&amp;lt;&lt;span style="font-size:85%;"&gt;/style&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;lt;&lt;span style="font-size:85%;"&gt;script language="JavaScript" type="text/javascript"&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;!--&lt;br /&gt;dojo.require("dijit.Dialog");&lt;br /&gt;dojo.require("dijit.form.Button");&lt;br /&gt;dojo.require("dojo.parser");&lt;br /&gt;dojo.require("dijit.ProgressBar");&lt;br /&gt;var baseurl = "http://server/development/bonesbeyond.nsf/";&lt;br /&gt;// --&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;lt;&lt;span style="font-size:85%;"&gt;/script&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 3 - Presentation and Dialog place holders&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;You'll also need to add the dojo styling to the Body tag as a class attribute on the Domino Form&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;"class=\"tundra\""&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Add your fields into the form as you would for a web application. The validation will be done in JavaScript so you can leave out validation formulas.&lt;br /&gt;&lt;br /&gt;Then we'll need two define the actual dialogs html, in this case I need two. One for a progress dialog so that if the web server, the directory query or connection is slow the user knows that something is happening. The second dialog will then display the results of the validation. We do this by defining two div areas that are hidden and displayed by dojo. Take note of the dojoType and id attributes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;!--&lt;br /&gt;dialog box for the progress&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;div dojoType="dijit.Dialog" id="dialog1" title="Validating your registration" loadingMessage="loading" &amp;gt;&lt;br /&gt;&amp;lt;div id="progress"&amp;gt;&lt;br /&gt;&amp;lt;center&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;Please wait while we check your registration details.&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;div dojoType="dijit.ProgressBar" style="width:300px" jsId="jsProgress" id="downloadProgress"&amp;gt;&lt;br /&gt;&amp;lt;/center&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;dialog box for the error messages&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;div dojoType="dijit.Dialog" id="dialog2" title="Validating your registration" loadingMessage="loading" &amp;gt;&lt;br /&gt;&amp;lt;div id="errors"&amp;gt;&lt;br /&gt;&amp;lt;img src="design/bb70/$file/error.jpg"/&amp;gt;&lt;br /&gt;&amp;lt;div id="errorContainer" &amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;button dojoType="dijit.form.Button" type="submit"&amp;gt;OK&amp;lt;/button&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Finally we then need a button to call a JavaScript function that handles the validation.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;input type="button" class="login-button" value="Register" onclick="validateForm()"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br style="FONT-WEIGHT: bold"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Step 4 - Validation&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The validateForm() functions, starts by showing the progress dialog (dialog1) so that immediately the users knows that something is happening. You remember that I need to check if a user is registered (or not!). In the script this only happens if the username field contains a valid value. If the user name is empty I add the mandatory error message to the stack, skip checking the NAB and then continue to validate the rest of the form.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;/*&lt;br /&gt;* function to check mandatory fields, field properties and username availability&lt;br /&gt;*/&lt;br /&gt;function validateForm() {&lt;br /&gt;var un=document.forms[0].username.value;&lt;br /&gt;var errors = false;&lt;br /&gt;var isavailable = true;&lt;br /&gt;var user_msg = "";&lt;br /&gt;&lt;br /&gt;showDialog();&lt;br /&gt;&lt;br /&gt;if (un=="")&lt;br /&gt;{&lt;br /&gt;errors = true;&lt;br /&gt;validateRestForm(errors, isavailable, user_msg);&lt;br /&gt;} else {&lt;br /&gt;if (isValidUserName(un)) {&lt;br /&gt;dojo.xhrGet({&lt;br /&gt;url: baseurl+'validateUser?OpenAgent&amp;amp;username='+un,&lt;br /&gt;handleAs: "json",&lt;br /&gt;load: function(responseObject, ioArgs) {&lt;br /&gt;isavailable = responseObject.user[0].isavailable;&lt;br /&gt;validateRestForm(errors, isavailable, user_msg);&lt;br /&gt;}&lt;br /&gt;});&lt;br /&gt;} else {&lt;br /&gt;errors = true;&lt;br /&gt;user_msg = "&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:85%;"&gt;b&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:85%;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:85%;"&gt;Username&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:85%;"&gt;/b&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:85%;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:85%;"&gt; contains one of the following invalid characters&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:85%;"&gt;br/&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:85%;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:85%;"&gt; space / \ + &amp;amp; % @ # * ( ) ! $ [ ] &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:85%;"&gt;br/&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:85%;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;";&lt;br /&gt;validateRestForm(errors, isavailable, user_msg);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Step 5 - dojo.xhrGet and JSON&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You might have noticed the dojo.xhrGet. In order to determine if a user is registered or not I have an agent that queries the Domino Directory ($Users) view and returns a JSON object that indicates if the user exists already. Note I had to add a 2 second delay in the agent to make the progress show.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;{ "user": [{"isavailable": "false" }] } or { "user": [{"isavailable": "true" }] }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;The validateRestForm() then continues to validate the form and the last steps are to open the dialog. I won't bother you with all the validation, but enclosed is the last field validation and the main flow. If there are no errors then the hideDialogs() function is called. If there are errors then the refreshDialogs() hides the progress dialog and display the error dialog (dialog2).&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;racgp = document.forms[0].racgpnumber.value&lt;br /&gt;if (racgp == "") {&lt;br /&gt;errors = true;&lt;br /&gt;msg = msg + "&lt;b&gt;RACGP/ACCRM&lt;/b&gt; "+mdt;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;if(isValidRacgp(racgp)==false)&lt;br /&gt;{&lt;br /&gt;errors = true&lt;br /&gt;msg=msg+"&lt;b&gt;RACGP/ACCRM&lt;/b&gt; number is invalid&lt;br /&gt;";&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (errors) {&lt;br /&gt;var ob = document.getElementById("errorContainer")&lt;br /&gt;ob.innerHTML = msg&lt;br /&gt;refreshDialog();&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;hideDialog();&lt;br /&gt;document.forms[0].submit();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Below are the functions that Hide, Show and Refresh the dialogs&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;/*&lt;br /&gt;* show the progress dialog for slow connections and busy servers&lt;br /&gt;*/&lt;br /&gt;function showDialog() {&lt;br /&gt;var dlg = dijit.byId('dialog1');&lt;br /&gt;dijit.byId("downloadProgress").update({indeterminate: true});&lt;br /&gt;dlg.show();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;* refresh the progress dialog with the error dialog&lt;br /&gt;*/&lt;br /&gt;function refreshDialog() {&lt;br /&gt;var pg = dijit.byId('dialog1');&lt;br /&gt;var dlg = dijit.byId('dialog2');&lt;br /&gt;pg.hide();&lt;br /&gt;dlg.show();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;* hide dialogs&lt;br /&gt;*/&lt;br /&gt;function hideDialog() {&lt;br /&gt;var dlg = dijit.byId('dialog2');&lt;br /&gt;var pg = dijit.byId('dialog1');&lt;br /&gt;dlg.hide();&lt;br /&gt;pg.hide();&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Step 6 - You need HELP...(I've been told that before!)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The other requirement was that I had was to populate some context sensitive help. I used xhrGet and the dialogs to achieve this. The benefit of this approach is that users only pay the download penalty if the help is actually needed.&lt;br /&gt;&lt;br /&gt;In terms of how this is implemented, the HTML dialogs are the same as the validations - with the exception of a help icon rather than an error icon and a different style. The help anchor link sends the unique helpid to a function that assembles it into a call.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&amp;lt;a href="#" onClick="getHelp('help+standard+drinks');return false"&amp;gt;Standard Drink&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;This time JSON is not required as the content is stored as HTML/Rich Text in the CMS (note the handleAs:text). The getHelp agent just queries the notes content document, gets the HTML and sends it to the dialog.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;/*&lt;br /&gt;* function to retrieve context sensitive help&lt;br /&gt;* from the content, stored in the application&lt;br /&gt;*/&lt;br /&gt;function getHelp(helpid) {&lt;br /&gt;showDialog();&lt;br /&gt;dojo.xhrGet({&lt;br /&gt;url: baseurl+'getHelp?OpenAgent&amp;amp;helpid='+helpid,&lt;br /&gt;handleAs: "text",&lt;br /&gt;load: function(response, ioArgs) {&lt;br /&gt;var ob = document.getElementById("helpContainer")&lt;br /&gt;ob.innerHTML = response&lt;br /&gt;refreshDialog();&lt;br /&gt;}&lt;br /&gt;});&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;...and that's it.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;When time permits, I'll en devour to produce a simple standalone database for download. I hope that entry will be of use to those of you that are hesitant to use dojo or ajax for your Domino web apps. I've shown that you don't need to use all of the dojo toolkit and widgits but that you can on a case-by-case basis use bits of the toolkits to enhance you web applications user experience. In fact I also used the &lt;a href="http://smoothgallery.jondesign.net/what/"&gt;JonDesign's Smooth Gallary 2.o&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:100%;"&gt; (which is based on mootools) for the rotating images in the banner, so there is no reason why you can't mix and match toolkits when required.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://technorati.com/tag/sntt" rel="tag"&gt;&lt;span style="font-family:verdana;"&gt;&lt;img style="BORDER-RIGHT: 0pt; BORDER-TOP: 0pt; MARGIN-LEFT: 0.4em; VERTICAL-ALIGN: middle; BORDER-LEFT: 0pt; BORDER-BOTTOM: 0pt" alt=" " src="http://static.technorati.com/static/img/pub/icon-utag-16x13.png?tag=SnTT" /&gt;SnTT&lt;/span&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-4542092309568054428?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/4542092309568054428/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2008/02/sntt-dojo-dialogs-for-validation-and.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/4542092309568054428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/4542092309568054428'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2008/02/sntt-dojo-dialogs-for-validation-and.html' title='SnTT : Dojo Dialogs for validation and help'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-2460273052202906432</id><published>2007-12-20T10:01:00.000+11:00</published><updated>2007-12-20T11:15:43.968+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SnTT'/><category scheme='http://www.blogger.com/atom/ns#' term='Lotus'/><category scheme='http://www.blogger.com/atom/ns#' term='Notes 8'/><category scheme='http://www.blogger.com/atom/ns#' term='Domino'/><title type='text'>SnTT : Unit Testing In Domino</title><content type='html'>&lt;span style="font-family:verdana;"&gt;I've had this database of code that is a framework for Unit testing in Domino/LotusScript. Its somewhat similar to JUnit. I wrote it so that I could double check code that was high risk and to give me another level of confidence that it would cope with the unexpected. I've been meaning to add a little polish to the database before I release it into the community. I've finally got around to it this week (and just in time for SnTT). It's not 100% complete, but might be of use to someone and rather than it sitting on my disk I've published it as a project on OpenNTF (&lt;/span&gt;&lt;a style="font-family: verdana;" href="http://www.openntf.org/Projects/pmt.nsf/ProjectLookup/Domino%20Unit%20Framework"&gt;here&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="font-weight: bold; font-family: verdana;" href="http://junit.sourceforge.net/doc/faq/faq.htm#overview_1"&gt;Follow this link to find out what is JUnit?&lt;/a&gt;&lt;span style="font-weight: bold;font-family:verdana;" &gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;JUnit fits into a technique for &lt;/span&gt;&lt;a style="font-family: verdana;" href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;Test Driven Development&lt;/a&gt;&lt;span style="font-family:verdana;"&gt; (TDD) where the basic premise is that you write tests for a unit (function, method etc) before writing the actual code. You then write your intended function (or method etc) until it passes all of your pre-written tests. In practice this is quite a large shift in mindset for some programmers. However, writing unit tests without adopting the whole TDD can still be beneficial (and I believe is quite common). For me it means that I can have a set of tests that I can check against code quickly, in a repeatable way and if I need to refactor my code I can quickly determine the impact of those changes by the success (or failures) of the existing tests.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;The 'Domino Unit Framework' (DUF) is the Domino (or maybe that should be LotusScript - although LUF isn't quite as funny) take on this framework. The database contains example code in the one and only agent, but here are a few snippets so that you can see how it works.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Dim OutputStream As NotesDatabaseOutputStream&lt;br /&gt;Set OutputStream = New NotesDatabaseOutputStream(session, "", "DominoUnitResults.nsf")&lt;br /&gt;&lt;br /&gt;Dim testObject As New Test("Test Objects", Outputstream)&lt;br /&gt;Call testObject.AssertEqual(session.currentdatabase,Null)&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:verdana;font-size:100%;"  &gt;You can also check for True or False, in the example below I have just passed a True/False but typically you would include your code that returns a true or false.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Call testTrue.AssertTrue(True)&lt;br /&gt;Call testFalse.AssertFalse(False)&lt;br /&gt;Call test.AssertFalse(object.myMethodThyatIExcepectToReturnFalse)    &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;You can also group up a set of tests into a 'suite of tests' which you can get an overall pass or fail or maybe just group them into logical functions.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Dim testSuite As New TestSuite("isMemberTests", OutputStream)&lt;br /&gt;Call testSuite.Add(test1)&lt;br /&gt;Call test1.AssertEqual(True,isMember(vArray2,vArray1))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:verdana;" &gt;So what objects does this support ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Currently the following objects are supported as they were the ones that I needed - I might added more later or maybe someone else might like to (if you fancy contributing).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Numeric&lt;br /&gt;- integer&lt;br /&gt;- long&lt;br /&gt;- double&lt;br /&gt;- currency&lt;br /&gt;LS Date&lt;br /&gt;Boolean (Integer)&lt;br /&gt;String&lt;br /&gt;NotesObjects&lt;br /&gt;- NotesDocument (based on UNID)&lt;br /&gt;- NotesDatabase (based on Replica Id)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:verdana;" &gt;Can I test my Own classes ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;You can also unit test your own custom classes. You will need to implement an isEqual method which the framework expects.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Dim tony As New Person&lt;br /&gt;Dim emp As New Person&lt;br /&gt;&lt;br /&gt;Call tony.init("Tony","A","Palmer")&lt;br /&gt;Call emp.init("Tony","A","Palmer")&lt;br /&gt;&lt;br /&gt;Call Test101.AssertEqual(tony,emp)&lt;br /&gt;&lt;br /&gt;Class Person&lt;br /&gt;...&lt;br /&gt;Function isEqual(people As Person) As Integer&lt;br /&gt;' add in your own code that determines equality or not.&lt;br /&gt;End Function&lt;br /&gt;..&lt;br /&gt;End Class&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:verdana;" &gt;How can I have a quick look ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Just download the DUF Database from OpenNTF and then create a copy (without Documents) in the root directory with a name of DUFResults.nsf. Then in the DUF database run the 'Development / Unit Test Agent'. There are some screen shots here of the database &lt;a href="http://www.openntf.org/Projects/pmt.nsf/4cf7002b4da2f726862570ef007ed885/3c11133ec5fbbf8b862573b6007d411e%21OpenDocument"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:verdana;" &gt;Until Next Year.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;I expect that this will be my last SnTT post until after LS08, I'm not going but will spending my time following all the news remotely.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Merry Xmas (Happy Holidays!) and Happy New Year.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://technorati.com/tag/sntt" rel="tag"&gt;&lt;span style="font-family:verdana;"&gt;&lt;img style="border: 0pt none ; margin-left: 0.4em; vertical-align: middle;" alt=" " src="http://static.technorati.com/static/img/pub/icon-utag-16x13.png?tag=SnTT" /&gt;SnTT&lt;/span&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-2460273052202906432?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/2460273052202906432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2007/12/sntt-unit-testing-in-domino.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/2460273052202906432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/2460273052202906432'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2007/12/sntt-unit-testing-in-domino.html' title='SnTT : Unit Testing In Domino'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-5770659843004539553</id><published>2007-11-22T11:32:00.000+11:00</published><updated>2007-11-22T11:36:53.452+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lotus'/><category scheme='http://www.blogger.com/atom/ns#' term='Composite Applications'/><category scheme='http://www.blogger.com/atom/ns#' term='Notes 8'/><title type='text'>IBM Education Assistant - Building Composite Applications</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;from the Notes 8 forum,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:Arial;font-size:85%;"  &gt;&lt;span style="font-style: italic;"&gt; For those building Composite Applications here is the latest version of the multi-media tutorial on building Notes 8 Composite Applications using IBM Education Assistant. It provides a great overview of Composite Applications, as well as, detailed step-by-step instructions on how to build one:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://publib.boulder.ibm.com/infocenter/ieduasst/lotv1r0/index.jsp?topic=/com.ibm.iea.notes/notes/notes80.html"&gt;more&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-5770659843004539553?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/5770659843004539553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/5770659843004539553'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2007/11/ibm-education-assitant-building.html' title='IBM Education Assistant - Building Composite Applications'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-5197073141710310192</id><published>2007-11-21T14:19:00.000+11:00</published><updated>2007-11-27T22:18:48.685+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SnTT'/><category scheme='http://www.blogger.com/atom/ns#' term='Composite Applications'/><category scheme='http://www.blogger.com/atom/ns#' term='Domino'/><title type='text'>SnTT : The Simplest Property Broker Example in Notes 8</title><content type='html'>&lt;span style="font-family:verdana;"&gt;&lt;strong&gt;Recap&lt;/strong&gt;&lt;/span&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;I've created a very simple, if not the simplest, property broker example using the Expeditor Toolkit. The idea is to understand the property broker and wires as part of the new breed of applications that integrate eclipse plugins and ND8.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;In keeping with the 'simple' theme, I wanted a simple database...err...application that would have a sim&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;ple notes view, when I select a document in the notes view the content in the column is sent to the text box on the TargetView view part.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;&lt;strong&gt;Blank Composite Application&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.scius.com.au/external/blog.nsf/dx/helloworld6.jpg/$file/helloworld6.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://www.scius.com.au/external/blog.nsf/dx/helloworld6.jpg/$file/helloworld6.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;I created a new composite application (CA) from the " - blank composite application - " template, which promptly opened to show me the message&lt;br /&gt;&lt;br /&gt;"This application page does not contain any content".&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;I opened the application with Designer and added a view and a form - nice and simple. Next I wanted to add a few documents. I needed to edit the composite application and add the notes form and view. Then from the &lt;strong&gt;action &gt; edit&lt;/strong&gt; application you can access the composite application editor and under the right hand side flyout pane (components palette) is the form and view.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;I dragged the view into the blank page and closed the CA Editor, it now looks like an old school Notes database. I could then add in a few data documents ready for the next steps.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;&lt;strong&gt;Packaging the Plugin&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;What you need to do is package up the plugin into a format that you can install into ND8. This is through the tried and tested &lt;/span&gt;&lt;span style="font-family:verdana;"&gt;update-site-format. If you have applied patches or upgraded RAD/RSA you would be very familiar with this way of installing plugins and updates.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;The instructions to update the plugin build properties, create a feature and generate an update site are in the tutorial "&lt;/span&gt;&lt;a href="http://www-128.ibm.com/developerworks/blogs/resources/CompApps/CompAppsTutorialPart2M4.pdf"&gt;&lt;span style="font-family:verdana;"&gt;CompAppsTutorialPart2M4.pdf&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;". I&lt;/span&gt;&lt;span style="font-family:verdana;"&gt; followed these instructions and built the update site. So far so good.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Installing a plugin&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Back to the Notes application and the CA Ed&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;itor. I need&lt;/span&gt;&lt;span style="font-family:verdana;"&gt; to add into the component palette my two ViewPart (TargetView and SourceView). To add components you right click, then choose Add Components &gt; Add Components from Update Site.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;My update site is in local directory, under my workspace directory. so I browsed to the site.xml and clicked OK. I was then given a dialog to select the components from the update site. Strangely the SourceView component was missing. No drama as it's the TargetView compone&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;nt that I needed anyway. I added the component and then dragged it onto the main page. Positioning can be a tad awkward. If you want to have the component on the bottom most part of the screen then you will need to drag the cursor right to the bottom of the screen.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;strong&gt;Wires&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;In the left hand menu I selected the 'source' component the Default View (notes) component and right click then wiring - I could see the 'sets the target message' action in TargetView but there was nothing to wire from. I could see the 'Default View' component but no property.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;&lt;strong&gt;oops...More wires&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;I had forgotten to add in the Notes side of the wiring. I created a new wiring properties (sample.wsdl), then opened the WSDL file with the editor and added a notesValue property, updated the namespace to cahelloworld.nsf and added a setter and getter action. The dialog is the same as the wiring editor in the Expeditor Toolkit.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;It was still not working. Come to think - how would the view know which property change has happened ? In the column properties in the 'Programmatic Use' tab there is a new setting on the bottom just for this...&lt;br /&gt;&lt;br /&gt;Composite Settings : Property&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.scius.com.au/external/blog.nsf/dx/helloworld7.jpg/$file/helloworld7.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://www.scius.com.au/external/blog.nsf/dx/helloworld7.jpg/$file/helloworld7.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;In the drop down there was only one choice 'notesValue'. When I went back to the Wiring Editor and the 'notesValue' property was showing. I wired them together and closed the CA Editor and the text box had a value. I selected the other documents and the text changed in the eclipse plugin.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.scius.com.au/external/blog.nsf/dx/helloworld8.jpg/$file/helloworld8.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://www.scius.com.au/external/blog.nsf/dx/helloworld8.jpg/$file/helloworld8.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;I also found out why the SourceView wasn't listed when I came to add the component. In the plugin.xml the TargetView Extention element 'allowMultiple' wasn't set.&lt;br /&gt;&lt;br /&gt;The eclipse &lt;/span&gt;&lt;a href="http://help.eclipse.org/help31/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/extension-points/org_eclipse_ui_views.html"&gt;&lt;span style="font-family:verdana;"&gt;documentation&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt; specifies that...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;allowMultiple&lt;/strong&gt; - flag indicating whether this view allows multiple instances to be created using IWorkbenchPage.showView(String id, String secondaryId). The default is false. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;On the whole the packaging up of the site and installation was fairly easy - until I moved the cahelloworld.nsf to another workstation. I'm not entirely sure about the deployment and distribution of a CA. One of the great thing about Notes applications is that deploying an application and new version is an easy process. Update the templates, maybe run agents to modify documents and thats it. Even if you have a Dev/UAT/SIT/Production type environment, it is still relatively simple. CA's will add another level of complexity to the equation.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;I also found that the Help &gt; Support &gt; View Trace (and View Log) is helpful in tracking down property broker issues. Have a go at installing the &lt;/span&gt;&lt;a href="http://www.ibm.com/developerworks/blogs/page/CompApps?entry=birt_sample_available_on_sandox"&gt;&lt;span style="font-family:verdana;"&gt;BIRT sample &lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;in a directory other that the Notes data directory and then having a look at the Trace and Log. BTW the report does not generate, so don't hang around waiting. The logs show why.&lt;br /&gt;&lt;br /&gt;So, there you have it. Quite possibly &lt;strong&gt;&lt;em&gt;the&lt;/em&gt;&lt;/strong&gt; most simple eclipse plugin and notes 8 composite application example.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.scius.com.au/external/blog.nsf/dx/helloworld9.jpg/$file/helloworld9.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://www.scius.com.au/external/blog.nsf/dx/helloworld9.jpg/$file/helloworld9.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-weight: bold;"&gt;Attachments.&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.scius.com.au/external/blog.nsf/dx/com.scius.examples.helloworld.updatesite103.zip/$File/com.scius.examples.helloworld.updatesite103.zip"&gt;com.scius.examples.helloworld.updatesite103.zip&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.scius.com.au/external/blog.nsf/dx/cahelloworld-nsf.zip/$file/cahelloworld-nsf.zip"&gt;cahelloworld-nsf.zip&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;a href="http://technorati.com/tag/sntt" rel="tag"&gt;&lt;span style="font-family:verdana;"&gt;&lt;img style="border: 0pt none ; margin-left: 0.4em; vertical-align: middle;" alt=" " src="http://static.technorati.com/static/img/pub/icon-utag-16x13.png?tag=SnTT" /&gt;SnTT&lt;/span&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-5197073141710310192?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/5197073141710310192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2007/11/sntt-simplest-property-broker-example.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/5197073141710310192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/5197073141710310192'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2007/11/sntt-simplest-property-broker-example.html' title='SnTT : The Simplest Property Broker Example in Notes 8'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-1781991547204310014</id><published>2007-11-15T15:47:00.000+11:00</published><updated>2007-11-16T10:56:19.818+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SnTT'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Composite Applications'/><title type='text'>SnTT : Quite possibly the simplest property broker example</title><content type='html'>&lt;span style="font-family:verdana;"&gt;I've completed step two of my "Adventures in Expeditor Toolkit". It is quite possibly &lt;span style="FONT-WEIGHT: bold; FONT-STYLE: italic"&gt;the&lt;/span&gt; simplest property broker example. One target view, one source view and one property.&lt;br /&gt;&lt;br /&gt;I looked the the Color Swatch example that comes with the toolkit. It had multiple properties and three views and the naming convention for a beginner was a little convoluted.&lt;br /&gt;&lt;br /&gt;I decided to create my own 'hello world' property broker example. I've attached a &lt;a href="http://www.scius.com.au/external/blog.nsf/dx/helloworld.zip/$file/helloworld.zip"&gt;zip&lt;/a&gt; of the workspace it you want to run it or browse the files.&lt;br /&gt;&lt;br /&gt;This purpose of this post is to share with you a very simple example to get to grips with the Property Broker and Wires. Something that the average&lt;/span&gt;&lt;span style="font-family:verdana;"&gt; Lotus/Notes Developer can look at, run and understand.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;About the Hello World Example&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I wanted a component where I could enter some text and using the property broker, send this to another component for display.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;I started with the New &gt; Project &gt; Client Services &gt; Client Services Project followed the prompts including choosing the 'rich basic application' which generates some of the bits required for the project. I then looked at the Color&lt;/span&gt;&lt;span style="font-family:verdana;"&gt; Swatch sample and worked out which parts needed changing. If you need step by step instructions on how to create a composite application, wires and actions in Expeditor then you should look at the &lt;a href="http://www.redbooks.ibm.com/redpapers/pdfs/redp4241.pdf"&gt;redpiece&lt;/a&gt;, &lt;a href="http://www.redbooks.ibm.com/abstracts/sg247367.html?Open"&gt;redbook,&lt;/a&gt; &lt;a href="http://www-10.lotus.com/ldd/nd8forum.nsf/7756aedc25e6d81285256324005ac76c/a5a1c8786bbc868b8525737000690532?OpenDocument"&gt;and the tutorial posted in the nd8 forum&lt;/a&gt; .&lt;br /&gt;&lt;br /&gt;So lets have a quick look at the parts of the puzzle.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Perspective.java&lt;/span&gt; - &lt;span style="font-family:verdana;"&gt;this pulls the components/view parts into the application and is one of the first files run&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;SourceView.java&lt;/span&gt; - &lt;span style="font-family:verdana;"&gt;the view part that contains, the field to enter the message and a button to trigger the location of a property, changing the value and sending the notification that a property had changed&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;TargetView.java&lt;/span&gt; - &lt;span style="font-family:verdana;"&gt;the view part that sets the text box with the value of the change property&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;TargetHandler.java&lt;/span&gt; - &lt;span style="font-family:verdana;"&gt;the action that is called by the property broker, and checks if the event is a property change event, and calls the TargetView to update the text box with the new value&lt;/span&gt;.&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;source.wsdl&lt;/span&gt; - &lt;span style="font-family:verdana;"&gt;contains &lt;span style="font-family:courier new;"&gt;getSourceMessage&lt;/span&gt; action and outgoing property &lt;span style="font-family:courier new;"&gt;MessageItemValue&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;target.wsdl&lt;/span&gt; - &lt;span style="font-family:verdana;"&gt;contains &lt;span style="font-family:courier new;"&gt;setTargetMessage&lt;/span&gt; action and incoming property &lt;span style="font-family:courier new;"&gt;MessageItemValue &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;I had all the parts of the puzzle there, but I couldn't get the Wiring Properties Editor to produce the same WSDL file as the Color Swatch example, so in the end I updated the file manually to set the &lt;span style="font-family:courier new;"&gt;actionNameParameter&lt;/span&gt; attribute and remove the &lt;span style="font-family:courier new;"&gt;boundTo="request-attribute"&lt;/span&gt; attribute. I also renamed the &lt;span style="font-family:courier new;"&gt;&amp;lt;portlet:param &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;name/&amp;gt;&lt;/span&gt; to &lt;span style="font-family:courier new;"&gt;setMessageValue&lt;/span&gt; for &lt;span style="font-family:courier new;"&gt;target.wsdl&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;getMessageValue&lt;/span&gt; for &lt;span style="font-family:courier new;"&gt;source.wsdl&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;&lt;br /&gt;I could run up the application, but nothing happened. I added a few debug lines and I could see that the property was being set in java but what about the property broker.The &lt;a href="http://www.ibm.com/developerworks/blogs/page/CompApps?entry=using_the_osgi_console_to"&gt;post&lt;/a&gt; on the Composite App details how to trouble shoot with the OSGi console. You can enter these commands in the eclipse console at the osgi&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="FONT-WEIGHT: bold;font-family:courier new;" &gt;pbsh p&lt;/span&gt;&lt;/span&gt; - showed me the current properties&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-family:courier new;"&gt;-----------------------------------------&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;Owner = com.scius.examples.helloworld&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;There are 2 properties registered.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;-----------------------------------------&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;Name: setMessageValue&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;Namespace: http://www.w3.org/2001/XMLSchema&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;Type: string&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;Class: class com.ibm.rcp.propertybroker.internal.property.PropertyImpl&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;Default: null&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;Direction: [IN]&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;Is Wired: NO&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;-----------------------------------------&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;Name: getMessageValue&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-family:courier new;"&gt;Namespace: http://www.w3.org/2001/XMLSchema&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;Type: string&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;Class: class com.ibm.rcp.propertybroker.internal.property.PropertyImpl&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;Default: null&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;Direction: [OUT]&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;Is Wired: YES&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;-----------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="FONT-WEIGHT: bold;font-family:courier new;" &gt;pbsh a - &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;shows me the actions&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;-&lt;span style="font-family:courier new;font-size:78%;"&gt;----------------------------&lt;br /&gt;NAME: getSourceMessage&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-family:courier new;font-size:78%;"&gt;Handler Type: SWT_ACTION&lt;br /&gt;Runnable Type: com.scius.examples.helloworld.actions.SourceAction&lt;br /&gt;Owner ID: com.scius.examples.helloworld&lt;br /&gt;Name Parameter: ACTION_NAME&lt;br /&gt;Parameters: 1 parameters&lt;br /&gt;Property = getMessageValue&lt;br /&gt;Property NS = http://www.w3.org/2001/XMLSchema&lt;br /&gt;Type: string&lt;br /&gt;Property ClassName = java.lang.String&lt;br /&gt;Property default Value = null&lt;br /&gt;Direction: [OUT]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-family:courier new;font-size:78%;"&gt;-----------------------------&lt;br /&gt;NAME: setTargetMessage&lt;br /&gt;Handler Type: SWT_ACTION&lt;br /&gt;Runnable Type: com.scius.examples.helloworld.actions.TargetHandler&lt;br /&gt;Owner ID: com.scius.examples.helloworld&lt;br /&gt;Name Parameter: ACTION_NAME&lt;br /&gt;Parameters: 1 parameters&lt;br /&gt;Property = setMessageValue&lt;br /&gt;Property Title =&lt;br /&gt;Property NS = http://www.w3.org/2001/XMLSchema&lt;br /&gt;Type: string&lt;br /&gt;Property ClassName = java.lang.String&lt;br /&gt;Property default Value = null&lt;br /&gt;Direction: [IN]&lt;br /&gt;-------------------------&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="FONT-WEIGHT: bold;font-family:courier new;" &gt;pbsh aw&lt;/span&gt; - shows me the active wires&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:78%;"&gt;-----------------------------&lt;br /&gt;Owner = com.scius.examples.helloworld&lt;br /&gt;There are 1 wires registered.&lt;br /&gt;-----------------------------------------&lt;br /&gt;Title: Source to Target Message&lt;br /&gt;Id: PROPERTY_TO_ACTION_WIRE:getMessageValue:setTargetMessage:com.scius.examples.helloworld.richapp.SourceView:com.scius.examples.helloworld.richapp.TargetView&lt;br /&gt;Owner Id: com.scius.examples.helloworld&lt;br /&gt;Ordinal: 100&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-family:courier new;font-size:78%;"&gt;Type: PROPERTY_TO_ACTION_WIRE&lt;br /&gt;Source Name: getMessageValue&lt;br /&gt;Source Entity ID: com.scius.examples.helloworld.richapp.SourceView&lt;br /&gt;Source Param: null&lt;br /&gt;Target Name: setTargetMessage&lt;br /&gt;Target Entity ID: com.scius.examples.helloworld.richapp.TargetView&lt;br /&gt;Target Param: null&lt;br /&gt;Is Cross Page: false&lt;br /&gt;-----------------------------&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;In the documentation the description of how a wire docking point is described as such.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic"&gt;In order to wire a docking or end point the location is uniquely identified by the following&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;The property’s namespace&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;The property’s name&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;The property’s type&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;The component’s entity ID&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:verdana;"&gt;When I looked through the information from the diagnostics it all looks good so why is the example not working ?&lt;br /&gt;&lt;br /&gt;OSGi console allows you to trace properties, so I registered each property.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-family:courier new;font-size:85%;"  &gt;pbt setMessageValue&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="FONT-WEIGHT: bold;font-family:courier new;font-size:85%;"  &gt;pbt getMessageValue&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:78%;"&gt;osgi&gt; pblt&lt;br /&gt;-----------------------------------------&lt;br /&gt;Registered Property Traces are:&lt;br /&gt;-----------------------------------------&lt;br /&gt;1. setMessageValue&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-family:courier new;font-size:78%;"&gt;2. getMessageValue&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;I tried again and this time there was more information from the trace&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-family:courier new;"&gt;osgi&gt; com.scius.examples.helloworld.richapp.SourceView:Text to be sent:hello world&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:78%;"&gt; &lt;span style="font-family:courier new;"&gt;com.scius.examples.helloworld.richapp.SourceView$Listener:Sending Property Change Notification&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;2007/11/16 10:09:50.062 WARNING PBTRACE(getMessageValue) changedProperties was called. ::class.method=com.ibm.rcp.propertybroker.internal.PropertyBrokerDispatcher.changedProperties() ::thread=main ::loggername=com.ibm.rcp.propertybroker&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So it looks like the notification is being sent correctly, but the &lt;span style="font-family:courier new;"&gt;TargetHandler.java&lt;/span&gt; isn't being called. Why ? This paragraph in the redpiece fills in the last piece of the puzzle.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic"&gt;However, as a view can be used in multiple places, sometimes&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="FONT-STYLE: italic"&gt; even on&lt;/span&gt; &lt;span style="FONT-STYLE: italic"&gt;the same page, a secondary ID is required to uniquely identify a view. If you&lt;/span&gt; &lt;span style="FONT-STYLE: italic"&gt;declared your application through a perspective as described in 3.9, “Laying out&lt;/span&gt; &lt;span style="FONT-STYLE: italic"&gt;applications programmatically” on page 53, you might not have provided any&lt;/span&gt; &lt;span style="FONT-STYLE: italic"&gt;secondary IDs for your views. &lt;span style="FONT-WEIGHT: bold"&gt;You must, however, always do so. Property broker &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;assumes, that all views have secondary IDs&lt;/span&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So even though I was only using one instance of &lt;span style="font-family:courier new;font-size:85%;"&gt;TargetView.java&lt;/span&gt; I needed to uniquely identify the View. I'd seen the ":fore" and ":back" seconday ids for the Color Swatch but thought that I didn't need them - once I added the ":hello" secondary id to the TargetView.java id and all references the sample worked.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_zz66mErCWS8/RzzVqyKX9FI/AAAAAAAAAEE/tafKTiL3HPM/s1600-h/helloworld3.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5133212606292030546" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: pointer; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_zz66mErCWS8/RzzVqyKX9FI/AAAAAAAAAEE/tafKTiL3HPM/s320/helloworld3.jpg" border="0" /&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;So there you have it - one working very simple property broker and wires example.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;&lt;a href="http://technorati.com/tag/sntt" rel="tag"&gt;&lt;img style="BORDER-RIGHT: 0pt; BORDER-TOP: 0pt; MARGIN-LEFT: 0.4em; VERTICAL-ALIGN: middle; BORDER-LEFT: 0pt; BORDER-BOTTOM: 0pt" alt=" " src="http://static.technorati.com/static/img/pub/icon-utag-16x13.png?tag=SnTT" /&gt;SnTT&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-1781991547204310014?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/1781991547204310014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2007/11/sntt-quite-possibly-simplest-property.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/1781991547204310014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/1781991547204310014'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2007/11/sntt-quite-possibly-simplest-property.html' title='SnTT : Quite possibly the simplest property broker example'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_zz66mErCWS8/RzzVqyKX9FI/AAAAAAAAAEE/tafKTiL3HPM/s72-c/helloworld3.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-2564618041810738876</id><published>2007-11-13T14:38:00.000+11:00</published><updated>2007-11-15T09:12:28.999+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SnTT'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Domino'/><title type='text'>SnTT : Using DXL and Java to update view designs</title><content type='html'>&lt;font face="verdana"&gt;In a recent project I needed to apply a new corporate interface design to a bunch of databases. Modifications to frames, pages, forms and views. The objective was to provide consistency for the end users. Updating the views was by far, the most time consuming and tedious part. I needed to find a quicker and easier way before I ended up with RSI.&lt;br /&gt;&lt;br /&gt;Enter DXL, with a dash of Java. I decided that Java and Eclipse would a better choice &lt;/font&gt;&lt;font face="verdana"&gt;rather than Domino Designer and LotusScript&lt;/font&gt;&lt;font face="verdana"&gt;. As a tool it would be independent of a notes database and there are plenty of dom and sax parsing libraries to choose from. I also chose to use eclipse so that I could ensure that the tool could be used and extended further by my client.&lt;br /&gt;&lt;br /&gt;The objective of the tool was to export the DXL for all the views in a database, then add or modify particular elements to change the style, colours and which shared buttons appear for each view. The modified DXL would then be imported into the database to make the changes.&lt;br /&gt;&lt;br /&gt;Below are snippets of the important pieces of the puzzle.&lt;br /&gt;&lt;br /&gt;Here I export the views DXL into the DOM parser&lt;br /&gt;&lt;font size="2"&gt;&lt;br /&gt;&lt;font face="courier new"&gt;&lt;/font&gt;&lt;font face="courier new"&gt;note.setSelectViews(true);&lt;br /&gt;&lt;/font&gt;&lt;font face="courier new"&gt;note.buildCollection();&lt;br /&gt;&lt;/font&gt;&lt;font face="courier new"&gt;DxlExporter exporter = s.createDxlExporter();&lt;br /&gt;&lt;/font&gt;&lt;font face="courier new"&gt;&lt;/font&gt;&lt;font face="courier new"&gt; &lt;/font&gt;&lt;font face="courier new"&gt;org.w3c.dom.Document doc = fac.newDocumentBuilder()&lt;/font&gt;&lt;font face="courier new"&gt;.parse(&lt;/font&gt; &lt;font face="courier new"&gt;    new InputSource(new StringReader(exporter&lt;/font&gt;&lt;font face="courier new"&gt;.exportDxl(note))));&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Then manipulating the actionBar node background colour, borders and style&lt;br /&gt;&lt;br /&gt;&lt;font size="2"&gt;&lt;font face="courier new"&gt;&lt;/font&gt;&lt;font face="courier new"&gt;actionBar.setAttribute("bgcolor", "#004573");&lt;br /&gt;&lt;/font&gt;&lt;font face="courier new"&gt;actionBar.setAttribute("bordercolor", "black");&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;font face="courier new"&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="verdana"&gt;&lt;font size="2"&gt;&lt;font face="courier new"&gt;&lt;/font&gt;&lt;font face="courier new"&gt;actionBarStyle.setAttribute("height", "40px");&lt;br /&gt;&lt;/font&gt;&lt;font face="courier new"&gt;actionBarStyle.setAttribute("repeat", "resize");&lt;br /&gt;&lt;/font&gt;&lt;font face="courier new"&gt;&lt;/font&gt;&lt;font face="courier new"&gt;Element imageRef;&lt;br /&gt;&lt;/font&gt;&lt;font face="courier new"&gt;imageRef = (Element) actionBarStyle.getElementsByTagName(&lt;/font&gt;&lt;font face="courier new"&gt;"imageref").item(0);&lt;br /&gt;&lt;/font&gt;&lt;font face="courier new"&gt;if (imageRef == null)&lt;br /&gt;&lt;/font&gt;&lt;font face="courier new"&gt;{&lt;br /&gt;&lt;/font&gt;&lt;font face="courier new"&gt;     imageRef = doc.createElement("imageref");&lt;/font&gt; &lt;font face="courier new"&gt;     actionBarStyle.appendChild(imageRef);&lt;br /&gt;&lt;/font&gt;&lt;font face="courier new"&gt; }&lt;br /&gt;&lt;/font&gt;&lt;font face="courier new"&gt;imageRef.setAttribute("name", "fade-blue-blue.gif");&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;And then import the modified XML DOM into the database&lt;br /&gt;&lt;br /&gt;&lt;font style="font-family: courier new;" size="2"&gt;ByteArrayOutputStream bs = new ByteArrayOutputStream();&lt;br /&gt;OutputFormat fmt = new OutputFormat(doc);&lt;br /&gt;XMLSerializer writer = new XMLSerializer(bs, fmt);&lt;br /&gt;writer.serialize(doc);&lt;/font&gt;&lt;br /&gt;&lt;font size="2"&gt;&lt;font face="courier new"&gt;Stream stream = s.createStream();&lt;br /&gt;&lt;/font&gt;&lt;font face="courier new"&gt;stream.setContents(new ByteArrayInputStream(bs.toByteArray()));&lt;br /&gt;&lt;/font&gt;&lt;font face="courier new"&gt;importer = s.createDxlImporter();&lt;br /&gt;&lt;/font&gt;&lt;font face="courier new"&gt;importer.setExitOnFirstFatalError(false);&lt;/font&gt;&lt;font face="courier new"&gt;&lt;/font&gt;&lt;font face="courier new"&gt;&lt;br /&gt;importer.importDxl(stream, dbTarget); &lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;font face="verdana"&gt;&lt;br /&gt;&lt;font style="font-weight: bold;"&gt;Summary&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;There were a few gotchas where the importer expects elements in certain order and a particular nasty bug in 7.0.2 that corrupts the view/column formulas. As far as reducing the monotony in updating a design I would highly recommend this approach and hopefully you can take the skeleton code and extend for you own purpose.&lt;br /&gt;&lt;br /&gt;You can download the workspace &lt;a href="http://www.scius.com.au/external/blog.nsf/dx/viewBlinger.zip/$file/viewBlinger.zip"&gt;zip&lt;/a&gt; file. You'll need to update the location to the NCSO.jar and Notes.jar libraries from my location of c:\lotus\notes.&lt;br /&gt;&lt;br /&gt;&lt;font size="4"&gt;&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;WARNING &lt;/span&gt;&lt;/font&gt;: You must ensure that you are using Lotus Notes Designer 7.0.3 otherwise you will corrupt your views - see this &lt;a href="http://www-10.lotus.com/ldd/nd6forum.nsf/55c38d716d632d9b8525689b005ba1c0/e660d215830f60bf852572190060e5bb?OpenDocument"&gt;technote&lt;/a&gt; and try it on a test database. &lt;/font&gt;&lt;font face="verdana"&gt;I haven't tried this in version 8.0 either.&lt;/font&gt;&lt;br /&gt;&lt;font face="verdana"&gt;&lt;/font&gt;&lt;br /&gt;&lt;a href="http://technorati.com/tag/sntt" rel="tag"&gt;&lt;img style="border: 0pt none ; vertical-align: middle; margin-left: 0.4em;" src="http://static.technorati.com/static/img/pub/icon-utag-16x13.png?tag=SnTT" alt=" "&gt;SnTT&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-2564618041810738876?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/2564618041810738876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2007/11/sntt-using-dxl-and-java-to-update-view.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/2564618041810738876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/2564618041810738876'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2007/11/sntt-using-dxl-and-java-to-update-view.html' title='SnTT : Using DXL and Java to update view designs'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-1845105290362456131</id><published>2007-11-09T09:39:00.000+11:00</published><updated>2007-11-09T10:30:29.257+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Composite Applications'/><category scheme='http://www.blogger.com/atom/ns#' term='Domino'/><title type='text'>Adventures in Expeditor Toolkit</title><content type='html'>&lt;span style="font-family:verdana;"&gt;I've been interested in the Composite Application features in Notes 8, in particular the ability to integrate rich client applications with notes. I've had some time recently to start looking in a little more detail. The interesting part is the way in which the PropertyBroker and Wires allows you to connect components together. I thought that I would have a go at creating a simple 'Hello World' example that I could integrate with a notes app.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;I've seen the Demos of other composite apps, but there is nothing like rolling your sleeves up and getting into the code. The Expeditor 6.1.1 toolkit is available to use in either Eclipse or the Rational Application Developer and Software Architect IDE. I decided that I'd use the RSA I already had installed.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;I &lt;/span&gt;&lt;span style="font-family:verdana;"&gt;followed the instructions and Installed the toolkit - there were no surpises. I then installed the PropertyBroker sample application, ran the application and it popped up under the 'open' menu. It pretty much confirmed that environments were working together -&lt;/span&gt;&lt;span style="font-family:verdana;"&gt; all &lt;/span&gt;&lt;span style="font-family:verdana;"&gt;going according to plan.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;The next step was to create my ow&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;n 'hello world' component.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;I chose New &gt; Client Services &gt; Client Services Project, filled in all the default values and chose Rich Basic Application from the list of templates.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;This generated some java files, properties and the plugin.xml files. The UI comes named as MainView.java, which you can either open with the Java editor or the Visual Editor. The Visual Editor gives you a graphical view of the Java code - similar to form designing in Domino Designer.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;The next step was to add in a 'Hello' world label and then run it in Notes to comfirm that this new project can run in Notes 8&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_zz66mErCWS8/RzObuH_pvMI/AAAAAAAAADw/wYQ3CufeUaU/s1600-h/helloworld.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_zz66mErCWS8/RzObuH_pvMI/AAAAAAAAADw/wYQ3CufeUaU/s320/helloworld.jpg" alt="" id="BLOGGER_PHOTO_ID_5130615617227439298" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;So what next ? I just wanted to see if I could add a break point and would that work with Notes, so I added a break point an ran the component using the Run &gt; Debug menu (rather than the run option) - and yes the breakpoint worked - very cool.&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_zz66mErCWS8/RzOb8X_pvNI/AAAAAAAAAD4/6k5VDORwc7w/s1600-h/helloworld2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_zz66mErCWS8/RzOb8X_pvNI/AAAAAAAAAD4/6k5VDORwc7w/s320/helloworld2.jpg" alt="" id="BLOGGER_PHOTO_ID_5130615862040575186" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Getting the wires and PropertyBroker working  is the next challenge that I'm working through.....&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-1845105290362456131?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/1845105290362456131/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2007/11/adventures-in-expeditor-toolkit.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/1845105290362456131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/1845105290362456131'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2007/11/adventures-in-expeditor-toolkit.html' title='Adventures in Expeditor Toolkit'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_zz66mErCWS8/RzObuH_pvMI/AAAAAAAAADw/wYQ3CufeUaU/s72-c/helloworld.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-4211884531139625225</id><published>2007-11-07T13:45:00.000+11:00</published><updated>2007-11-09T21:21:26.161+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SnTT'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><category scheme='http://www.blogger.com/atom/ns#' term='Domino'/><title type='text'>SnTT: NotesSAX Parsing</title><content type='html'>&lt;span style="font-family:verdana;"&gt;&lt;a href="http://www.codestore.info/store.nsf/unid/BLOG-20071106?OpenDocument#comments"&gt;Jake&lt;/a&gt; was asking about how to filter out malicous tags and code, I suggested using the NotesSAXParser after the HTML is converted to XHTML. I'm suprised that no one uses this as an approach, I mean fundementally XHTML is XML and the right tools for parsing this is the NotesSAXParser and NotesDOMParser. I figured that maybe there has not been a example of its use. So here is a sample &lt;a href="http://www.scius.com.au/external/blog.nsf/dx/renderEngine.lss/$file/renderEngine.lss"&gt;class&lt;/a&gt; pulled right out of our home grown content management system - which uses NotesSAXParser - a little early for Show-and-Tell Thursdays...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://technorati.com/tag/sntt" rel="tag"&gt;&lt;img style="border: 0pt none ; vertical-align: middle; margin-left: 0.4em;" src="http://static.technorati.com/static/img/pub/icon-utag-16x13.png?tag=SnTT" alt=" " /&gt;SnTT&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36816678-4211884531139625225?l=palmerweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palmerweb.blogspot.com/feeds/4211884531139625225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://palmerweb.blogspot.com/2007/11/notessax-parsing-sntt.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/4211884531139625225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36816678/posts/default/4211884531139625225'/><link rel='alternate' type='text/html' href='http://palmerweb.blogspot.com/2007/11/notessax-parsing-sntt.html' title='SnTT: NotesSAX Parsing'/><author><name>Tony Palmer</name><uri>http://www.blogger.com/profile/04902447052244842113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://4.bp.blogspot.com/_zz66mErCWS8/SKztMWeAdvI/AAAAAAAAAFo/06ish9cUWmY/S220/me.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36816678.post-4454689758554271661</id><published>2007-11-04T19:05:00.000+11:00</published><updated>2007-11-06T20:45:26.954+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><category scheme='http://www.blogger.com/atom/ns#' term='Domino'/><title type='text'>www.scius.com.au version 2.0</title><content type='html'>&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;I've finished updating the company's &lt;a href="http://www.scius.com.au/"&gt;website&lt;/a&gt;. The original &lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;design (below) was a bit incipid and dull, something that I managed to throw together in my spare time. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;We decided to spend a little more time and effort on the design and implementation for version 2.0 (on the bottom of the post).&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_zz66mErCWS8/Ry2RrUEIWZI/AAAAAAAAADQ/P6RCFukypGM/s1600-h/sciushome.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5128915723951298962" style="FLOAT: left; MARGIN: 0pt 10px 10px 0pt; CURSOR: pointer" alt="" src="http://1.bp.blogspot.com/_zz66mErCWS8/Ry2RrUEIWZI/AAAAAAAAADQ/P6RCFukypGM/s200/sciushome.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The website runs on our home grown product - a web content management system written in Domino. This is primarily so that the non technical members of the team can update content easily without effecting the design and layout.&lt;br /&gt;&lt;br /&gt;I wanted to target four of the most popular browsers, IE version 6 and 7, Firefox 2.0 and Safari 3. I've managed to achieve this, XHTML and CSS W3C validation by following some simple rules.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;CSS&lt;br /&gt;&lt;br /&gt;1. for height use both the HEIGHT and MIN-HEIGHT&lt;br /&gt;2. for width use both WIDTH and MIN-WIDTH&lt;br /&gt;3. for BORDERS, MARGIN always use the LEFT, RIGHT, TOP and BOTTOM qualifiers rather than the MARGIN:5px 10px 5px 10px even though its CSS 1 valid&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;4. use MARGIN-LEFT:AUTO rather than TEXT-ALIGN:LEFT/RIGHT/CENTER&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;XHTML Transitional&lt;br /&gt;&lt;br /&gt;1. only have one occurance of id="identifier" for elements (if you need more than one then it's a class="" approach)&lt;br /&gt;2. close all tags with either a forward slash of closing tag i.e. &amp;lt;img src="" alt="" /&amp;gt; or &amp;lt;/img&amp;gt;&lt;img...&gt; &lt;/img&gt;&lt;br /&gt;3 ensure that each IMG tag has an ALT attribute &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;4 keep all tags lowercase (even through I've used uppercase for clarity in this post...ok)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;5 avoid nesting elements unless its in a div. i.e. don't nest a &amp;lt;h1&amp;gt; in a &amp;lt;p&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;There you go, one css file and a simple design which displays the same for all of my target browsers and validates against XHTML and CSS.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;spa
