<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:clearspace="http://www.jivesoftware.com/xmlns/clearspace/rss" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>Blog Posts From Jivespace Community Blog Tagged With widgets</title>
    <link>http://www.jivesoftware.com/jivespace/blogs/jivespace</link>
    <description>Jivespace Developer Community Blog</description>
    <pubDate>Fri, 23 Jan 2009 16:48:23 GMT</pubDate>
    <generator>Jive SBS 3.0.8 (http://jivesoftware.com/products/clearspace/)</generator>
    <dc:date>2009-01-23T16:48:23Z</dc:date>
    <item>
      <title>Creating account spaces, part II: Widgets</title>
      <link>http://www.jivesoftware.com/jivespace/blogs/jivespace/2009/01/23/creating-account-spaces-part-ii-widgets</link>
      <description>&lt;!-- [DocumentBodyStart:ef10417a-6f90-4ca1-b272-906c8dfcdc28] --&gt;&lt;div class='jive-rendered-content'&gt;&lt;p&gt;Last episode I explained how we create the secure spaces and setup permissions (see &lt;a class="jive-link-blog-small" href="http://www.jivesoftware.com/jivespace/blogs/jivespace/2009/01/08/how-do-the-account-spaces-get-created-anyway-is-it-private"&gt;How do the account spaces get created anyway? Is it private?&lt;/a&gt;). This post deals with the default widgets that come with a newly created community, and how we had to customize this functionality to meet our requirements.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a href="http://www.jivesoftware.com/jivespace/servlet/JiveServlet/showImage/38-1648-9086/defaultLayout.png"&gt;&lt;img alt="defaultLayout.png" class="jive-image-thumbnail jive-image" height="453" src="http://www.jivesoftware.com/jivespace/servlet/JiveServlet/downloadImage/38-1648-9086/620-453/defaultLayout.png" width="620"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;I. How it's done out of the box&lt;/h2&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;To do this, let's first take a look at how it would be done out of the box:&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Create a new community&lt;/li&gt;&lt;li&gt;Then get re-directed to the newly created community&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Here, community.ftl will call CommunityAction's getWidgetLayout via:&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;!--[CodeBlockStart:697a916e-28ff-4088-88a4-6bd3f7e9fa55]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code"&gt;&amp;lt;#if widgetLayout?exists&amp;gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;div id="jive-body-main"&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;div id="jive-widget-content"&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;div id="thread.watch.notify" class="jive-info-box" style="display:none"&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/div&amp;gt;

&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;#include "/template/global/include/form-message.ftl" /&amp;gt;

&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;#include "${widgetLayout.freemarkerTemplate}" /&amp;gt;

&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/div&amp;gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;/div&amp;gt;
&amp;lt;/#if&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:697a916e-28ff-4088-88a4-6bd3f7e9fa55]--&gt;&lt;div&gt; &lt;/div&gt;&lt;p&gt;And within getWidgetLayout() you'll see that if we haven't customized a community and a layout doesn't exist yet, we'll just copy the default:&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;!--[CodeBlockStart:19bf3437-8246-4034-81b7-0697099123c6]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code jive-java"&gt;&lt;font color="navy"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; WidgetLayout getWidgetLayout() &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;try&lt;/b&gt;&lt;/font&gt; &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (!isHasCustomized()) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="darkgreen"&gt;// if no draft widget frames exist, then no default layout exists&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (widgetManager.getWidgetFrames(getCommunity()).size() == 0) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; copyDefaultLayout();
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;}&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .....
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:19bf3437-8246-4034-81b7-0697099123c6]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;And to copy the default, we do this:&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;!--[CodeBlockStart:8b2e23ae-f5ac-4aee-8e65-20941757e64b]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code jive-java"&gt;&lt;font color="darkgreen"&gt;/**
* Copy the default layout (large left, small right) to the current community.
*/&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;protected&lt;/b&gt;&lt;/font&gt; &lt;font color="navy"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; copyDefaultLayout() &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WidgetManager widgetManagerUnproxied = (widgetManager &lt;font color="navy"&gt;&lt;b&gt;instanceof&lt;/b&gt;&lt;/font&gt; WidgetManagerProxy) ? ((WidgetManagerProxy)widgetManager).getUnproxiedObject() : widgetManager;
&amp;nbsp;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;try&lt;/b&gt;&lt;/font&gt; &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WidgetLayoutDescriptor wld = widgetManagerUnproxied.getWidgetLayoutByName(TwoColumnLargeLeftColumnLayout.class.getName());
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WidgetLayout wl = widgetManagerUnproxied.getWidgetLayout(wld);
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; widgetManagerUnproxied.addWidgetLayout(getCommunity(), wl);
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .....&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:8b2e23ae-f5ac-4aee-8e65-20941757e64b]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;And at that point, you'll have the default layout with no widgets, and so further down the line you'll see a call to getWidgetFrames, and similarly to above it will copy the default:&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;!--[CodeBlockStart:f337817a-c3b9-4092-9d22-30c19c7508e2]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code jive-java"&gt;&lt;font color="navy"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; Map&amp;lt;Integer, List&amp;lt;WidgetFrame&amp;gt;&amp;gt; getWidgetFrames() &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (!isHasCustomized()) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (widgetManager.getWidgetFrames(getCommunity()).size() == 0) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; copyDefaultFrames();
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;}&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .....
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:f337817a-c3b9-4092-9d22-30c19c7508e2]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;which will add the default widgets:&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;!--[CodeBlockStart:eca1b9f9-8997-4e2a-a10f-9c5e8175254b]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code jive-java"&gt;&lt;font color="darkgreen"&gt;/**
&amp;#160;&amp;#160;&amp;#160;&amp;#160; * Copy the default widget frames to the current community:
&amp;#160;&amp;#160;&amp;#160;&amp;#160; *&amp;#160; &amp;lt;ul&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; *&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;li&amp;gt;Left: Sub-Spaces&amp;lt;/li&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; *&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;li&amp;gt;Left: Projects&amp;lt;/li&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; *&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;li&amp;gt;Left: Recent Activity&amp;lt;/li&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; *&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;li&amp;gt;Right: Actions&amp;lt;/li&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; *&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;li&amp;gt;Right: Top Members&amp;lt;/li&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; *&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;li&amp;gt;Right: Tag Cloud&amp;lt;/li&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; *&amp;#160; &amp;lt;/ul&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; */&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;protected&lt;/b&gt;&lt;/font&gt; &lt;font color="navy"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; copyDefaultFrames() &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;try&lt;/b&gt;&lt;/font&gt; &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WidgetManager widgetManagerUnproxied = (widgetManager &lt;font color="navy"&gt;&lt;b&gt;instanceof&lt;/b&gt;&lt;/font&gt; WidgetManagerProxy) ? ((WidgetManagerProxy)widgetManager).getUnproxiedObject() : widgetManager;
&amp;nbsp;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="darkgreen"&gt;// column 1&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; row = 0;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (widgetManagerUnproxied.getWidgetByName(SubCommunitiesWidget.class.getName()) != &lt;font color="navy"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/font&gt;) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; widgetManagerUnproxied.addWidgetFrame(WidgetUtils.createWidgetFrameBean(getCommunity(), SubCommunitiesWidget.class.getName(), 1, row++));
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;}&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (isProjectsEnabled()) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (widgetManagerUnproxied.getWidgetByName(CommunityProjectsWidget.class.getName()) != &lt;font color="navy"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/font&gt;) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; widgetManagerUnproxied.addWidgetFrame(WidgetUtils.createWidgetFrameBean(getCommunity(), CommunityProjectsWidget.class.getName(), 1, row++));
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;}&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;}&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (widgetManagerUnproxied.getWidgetByName(RecentContentWidget.class.getName()) != &lt;font color="navy"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/font&gt;) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; widgetManagerUnproxied.addWidgetFrame(WidgetUtils.createWidgetFrameBean(getCommunity(), RecentContentWidget.class.getName(), 1, row));
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;}&lt;/font&gt;
&amp;nbsp;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="darkgreen"&gt;// column 2, start row back at 0&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; row = 0;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (widgetManagerUnproxied.getWidgetByName(CommunityActionsWidget.class.getName()) != &lt;font color="navy"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/font&gt;) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; widgetManagerUnproxied.addWidgetFrame(WidgetUtils.createWidgetFrameBean(getCommunity(), CommunityActionsWidget.class.getName(), 2, row++));
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;}&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (widgetManagerUnproxied.getWidgetByName(TopMembersWidget.class.getName()) != &lt;font color="navy"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/font&gt;) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; widgetManagerUnproxied.addWidgetFrame(WidgetUtils.createWidgetFrameBean(getCommunity(), TopMembersWidget.class.getName(), 2, row++));
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;}&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (widgetManagerUnproxied.getWidgetByName(TagCloudWidget.class.getName()) != &lt;font color="navy"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/font&gt;) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; widgetManagerUnproxied.addWidgetFrame(WidgetUtils.createWidgetFrameBean(getCommunity(), TagCloudWidget.class.getName(), 2, row));
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;}&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;}&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ......
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:eca1b9f9-8997-4e2a-a10f-9c5e8175254b]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;II. How do the objects interact, and how are they displayed?&lt;/h2&gt;&lt;p&gt;Sometimes these widget layouts, widget layout descriptors, widgets, widget frames, etc can get kind of confusing. I hope this illustration and ftl explanation can help paint a better picture, and deepen the understanding.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;As an overview, you have the layout (red - WidgetLayout), the layout descriptor (blue - WidgetLayoutDescriptor) which tells how to display the widgets (green - WidgetFrames, contain widgets). A bit more technical tidbits from the database side of things, the container in jiveWidgetFrame is essentially the column, and the frameIndex is essentially the row. See more here:&lt;a class="jive-link-external-small" href="http://www.jivesoftware.com/builds/docs/clearspace/latest/DatabaseSchemaGuide.html#jiveWidgetFrame"&gt;http://www.jivesoftware.com/builds/docs/clearspace/latest/DatabaseSchemaGuide.html#jiveWidgetFrame&lt;/a&gt;&lt;/p&gt;&lt;p style="text-align: center; "&gt;&lt;a href="http://www.jivesoftware.com/jivespace/servlet/JiveServlet/showImage/38-1648-9087/defaultLayout_explain_b.png"&gt;&lt;img alt="defaultLayout_explain_b.png" class="jive-image-thumbnail jive-image" height="453" src="http://www.jivesoftware.com/jivespace/servlet/JiveServlet/downloadImage/38-1648-9087/620-453/defaultLayout_explain_b.png" width="620"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;We saw above how it will grab the widget layout, but I didn't show it returning from that method. This can be seen as the red box in the picture above (the layout)&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;!--[CodeBlockStart:01ad5ed6-d091-4d2a-a2ed-6a0668e291e9]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code"&gt;&amp;lt;#if widgetLayout?exists&amp;gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;div id="jive-body-main"&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;div id="jive-widget-content"&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;div id="thread.watch.notify" class="jive-info-box" style="display:none"&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/div&amp;gt;

&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;#include "/template/global/include/form-message.ftl" /&amp;gt;

&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;#include "${widgetLayout.freemarkerTemplate}" /&amp;gt;

&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/div&amp;gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;/div&amp;gt;
&amp;lt;/#if&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:01ad5ed6-d091-4d2a-a2ed-6a0668e291e9]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;!--[CodeBlockStart:99c06847-7793-470a-a44c-627fa5f5aac4]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code jive-java"&gt;&lt;font color="navy"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; WidgetLayout getWidgetLayout() &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;try&lt;/b&gt;&lt;/font&gt; &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (!isHasCustomized()) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="darkgreen"&gt;// if no draft widget frames exist, then no default layout exists&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (widgetManager.getWidgetFrames(getCommunity()).size() == 0) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; copyDefaultLayout();
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;}&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; widgetManager.getWidgetLayout(getCommunity());
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:99c06847-7793-470a-a44c-627fa5f5aac4]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;After returning the layout, we look to the layout FTL (which for this particular layout is ls.ftl) and CommunityAction for what happens next (this is the blue box above, the layout descriptor). Each different layout FTL asks for the widget frames associated with it, and will have them available via the CommunityAction. For our example, it looks for the widget frames in the left container, and then the right container.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;This loads the widgets in the left container (green A)...&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;!--[CodeBlockStart:94ca521e-7351-408d-93d9-005b1cd78583]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code"&gt;&amp;lt;div id="jive-body-layout-ls"&amp;gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;div class="jive-body-layout-l"&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;div id="jive-widget-container_1" class="jive-widget-container jive-widget-container-large"&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;#if widgetFrames?exists &amp;amp;&amp;amp; widgetFrames.containsKey(1?int)&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;#list widgetFrames.get(1?int) as widgetFrame&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;#if widgets?exists&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;@jive.editWidgetFrame widgetFrame=widgetFrame /&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;#else&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;@jive.displayWidgetFrame widgetFrame=widgetFrame size=enums["com.jivesoftware.community.widget.Widget$ContainerSize"].LARGE /&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/#if&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/#list&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/#if&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/div&amp;gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:94ca521e-7351-408d-93d9-005b1cd78583]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;....and the rest of the file loads the widgets in the right container (green B)&lt;/p&gt;&lt;!--[CodeBlockStart:6a0e9df0-6322-4c1f-8d61-2da89d463f7e]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;div class="jive-body-layout-s"&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;div id="jive-widget-container_2" class="jive-widget-container jive-widget-container-small"&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;#if widgetFrames?exists &amp;amp;&amp;amp; widgetFrames.containsKey(2?int)&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;#list widgetFrames.get(2?int) as widgetFrame&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;#if widgets?exists&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;@jive.editWidgetFrame widgetFrame=widgetFrame /&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;#else&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;@jive.displayWidgetFrame widgetFrame=widgetFrame size=enums["com.jivesoftware.community.widget.Widget$ContainerSize"].SMALL /&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/#if&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/#list&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/#if&amp;gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/div&amp;gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:6a0e9df0-6322-4c1f-8d61-2da89d463f7e]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;They widgetFrames are available from this call to the widgetManager in CommunityAction.getWidgetFrames():&lt;/p&gt;&lt;!--[CodeBlockStart:f196a493-1dac-40cd-ba71-b8d7d5eeccce]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code jive-java"&gt;&lt;font color="navy"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; widgetManager.getPublishedWidgetFrames(getCommunity());
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:f196a493-1dac-40cd-ba71-b8d7d5eeccce]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;And that's it! The widgets are displayed.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;III. How we customized this&lt;/h2&gt;&lt;p&gt;As you've seen, it's all initiated by NOT having anything setup the first time you are directed to the community.ftl file. So, we needed to ensure that there was a widget layout, and within that widget layout there are widget frames. So, during our secure space creation we need to hook into this ourselves. Have a look at how we're doing it:&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;1. Get a list of all the widgets in the system&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;!--[CodeBlockStart:8343616c-9c39-4205-8d35-c311acb426cc]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code jive-java"&gt;Map&amp;lt;WidgetDescriptor, Widget&amp;gt; widgets = widgetManager.getAvailableWidgets();
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:8343616c-9c39-4205-8d35-c311acb426cc]--&gt;&lt;p&gt;2. Identify the two widgets we want to add initially, and loop through all the available widgets and hold onto them&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;!--[CodeBlockStart:47810e15-31f9-4923-8d89-df6fea0b2d21]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code jive-java"&gt;Widget actionWidget = &lt;font color="navy"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/font&gt;;
Widget openCasesWidget = &lt;font color="navy"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/font&gt;;
&lt;font color="navy"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt;(Iterator&amp;lt;WidgetDescriptor&amp;gt; it = widgets.keySet().iterator(); it.hasNext(); ) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; WidgetDescriptor descriptor = it.next();
&amp;#160;&amp;#160;&amp;#160;&amp;#160; Widget widget = widgets.get(descriptor);
&amp;nbsp;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;(descriptor.getClassName().equalsIgnoreCase(&lt;font color="red"&gt;"com.jivesoftware.community.widget.impl.CommunityActionsWidget"&lt;/font&gt;)) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; actionWidget = widget;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;}&lt;/font&gt; &lt;font color="navy"&gt;&lt;b&gt;else&lt;/b&gt;&lt;/font&gt; &lt;font color="navy"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;(descriptor.getClassName().equalsIgnoreCase(&lt;font color="red"&gt;"com.jivesoftware.community.portal.widgets.OpenCasesWidget"&lt;/font&gt;)) &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; openCasesWidget = widget;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="navy"&gt;}&lt;/font&gt;
&lt;font color="navy"&gt;}&lt;/font&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:47810e15-31f9-4923-8d89-df6fea0b2d21]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;3. Then, as we saw above, we need to get the widget layout desired and add it to the newly created secure community&lt;/p&gt;&lt;!--[CodeBlockStart:6b712755-dca9-4742-907c-ee3a60f3d32f]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code jive-java"&gt;&lt;font color="navy"&gt;&lt;b&gt;try&lt;/b&gt;&lt;/font&gt; &lt;font color="navy"&gt;{&lt;/font&gt;
&amp;#160; WidgetLayoutDescriptor wld = getWidgetLayoutByName(TwoColumnLargeLeftColumnLayout.class.getName());
&amp;#160; WidgetLayout wl = widgetManager.getWidgetLayout(wld);
&amp;#160; widgetManager.addWidgetLayout(community, wl);
&amp;#160; widgetManager.publishWidgetLayout(community);
&lt;font color="navy"&gt;}&lt;/font&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:6b712755-dca9-4742-907c-ee3a60f3d32f]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;4. Finally, setup our OpenCasesWidget (custom built by us) and the Actions widget. They are mapped to the correct lay out by the matching up of parentObjectType and ParentObjectID.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;!--[CodeBlockStart:f391f774-a4f7-44f4-ac45-fdacb4e7e177]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code jive-java"&gt;&lt;font color="darkgreen"&gt;//load the widgets&lt;/font&gt;
WidgetFrameBean widgetBean = &lt;font color="navy"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; WidgetFrameBean();
widgetBean.setWidgetID(openCasesWidget.getID());
widgetBean.setContainerID(1);
widgetBean.setParentObjectID(community.getID());
widgetBean.setParentObjectType(JiveConstants.COMMUNITY);
widgetBean.setPublished(&lt;font color="navy"&gt;&lt;b&gt;true&lt;/b&gt;&lt;/font&gt;);
widgetManager.addWidgetFrame(widgetBean);
&amp;nbsp;
WidgetFrameBean actionWidgetBean = &lt;font color="navy"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; WidgetFrameBean();
actionWidgetBean.setWidgetID(actionWidget.getID());
actionWidgetBean.setContainerID(2);
actionWidgetBean.setParentObjectID(community.getID());
actionWidgetBean.setParentObjectType(JiveConstants.COMMUNITY);
actionWidgetBean.setPublished(&lt;font color="navy"&gt;&lt;b&gt;true&lt;/b&gt;&lt;/font&gt;);
widgetManager.addWidgetFrame(actionWidgetBean);
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:f391f774-a4f7-44f4-ac45-fdacb4e7e177]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;5. All done!&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;That is how we are creating the communities &lt;em&gt;and&lt;/em&gt; customizing their overview tabs. Hope this has been helpful!&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Let me know if there are any questions on the above functionality &lt;img height="16px" src="http://www.jivesoftware.com/community/images/emoticons/happy.gif" width="16px"/&gt;&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:ef10417a-6f90-4ca1-b272-906c8dfcdc28] --&gt;</description>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/jivespace/tags">widgets</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/jivespace/tags">customize</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/jivespace/tags">supportal</category>
      <pubDate>Fri, 23 Jan 2009 16:52:22 GMT</pubDate>
      <author>communities@jivesoftware.com</author>
      <guid>http://www.jivesoftware.com/jivespace/blogs/jivespace/2009/01/23/creating-account-spaces-part-ii-widgets</guid>
      <dc:date>2009-01-23T16:52:22Z</dc:date>
      <clearspace:dateToText>10 months, 2 days ago</clearspace:dateToText>
      <clearspace:replyCount>4</clearspace:replyCount>
      <clearspace:objectType>0</clearspace:objectType>
      <wfw:comment>http://www.jivesoftware.com/jivespace/blogs/jivespace/comment/creating-account-spaces-part-ii-widgets</wfw:comment>
      <wfw:commentRss>http://www.jivesoftware.com/jivespace/blogs/jivespace/feeds/comments?blogPost=1648</wfw:commentRss>
    </item>
    <item>
      <title>Customization Part 3: Widgets</title>
      <link>http://www.jivesoftware.com/jivespace/blogs/jivespace/2008/06/30/customization-part-3-widgets</link>
      <description>&lt;!-- [DocumentBodyStart:6e3f171f-c2aa-4bdf-9904-01b586a9b32a] --&gt;&lt;div class='jive-rendered-content'&gt;&lt;p&gt;This post is the third in a series of blog posts about customizing for Clearspace 2.x. The previous posts covered general information about &lt;a class="jive-link-external-small" href="http://www.jivesoftware.com/community/blogs/clearspace/2008/06/24/customizations-in-clearspace-2x-part-one/"&gt;Customizations in Clearspace 2.x&lt;/a&gt; and &lt;a class="jive-link-external-small" href="http://www.jivesoftware.com/community/blogs/clearspace/2008/06/26/customization-part-2-upgrading-themes-and-ftl-files/"&gt;upgrading themes and FTL files&lt;/a&gt;. This post continues the series with more information about widgets.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Widgets can be used much more broadly in version 2 than previously, so most of your widget-specific upgrade changes are related to this broader support. In version 1 a system or space administrator could use widgets only to assemble a space or community overview page. In version 2 both administrators and users can customize page layouts in several areas. Widgets can be used on the Clearspace instance home page (which has been rendered from main.ftl), a user's personal home page, a community/space overview page, a project overview page.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Note that unless your widget is extremely simple, you're likely to also need to keep in mind API changes and FreeMarker changes. For example, version 2 requires that widgets acquire references to Clearspace manager beans using Spring. The rest of widget development model&amp;nbsp; -- artifacts involved, how you deploy them, and so on&amp;nbsp; -- is unchanged from version 1.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;When upgrading a widget (or developing a new one on version 2), you use the @WidgetTypeMarker annotation to specify which of the display contexts your widget is allowed in. Deciding which contexts to allow is an important part of your widget's design. For example, you might decide that a widget that takes a very individual-oriented set of property values (such as the Tag widget, which displays content associated with a particular tag) isn't useful in high-level contexts such as the instance or space home pages (where the broad set of people viewing might want views on a large variety of tags).&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;The @WidgetTypeMarker annotation supports values from the WidgetType enumeration. Here's an example that includes all of those values:&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;!--[CodeBlockStart:2c4b632c-7450-4c05-88f3-936cddccd2a1]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code"&gt;@WidgetTypeMarker({WidgetType.HOMEPAGE, WidgetType.PERSONALIZEDHOMEPAGE, 
&amp;nbsp;&amp;nbsp;&amp;nbsp; WidgetType.COMMUNITY, WidgetType.PROJECT})
@PropertyNames("myProperty")
public class MyWidget extends BaseWidget {
&amp;nbsp;&amp;nbsp;&amp;nbsp; // Implementation code omitted.
}&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:2c4b632c-7450-4c05-88f3-936cddccd2a1]--&gt;&lt;p&gt;In order to reduce the tight coupling between the widget views (which are typically built using FreeMarker) and the rest of the Clearspace application, the widget context that was previously populated with a reference to the current context via a JiveContext instance has been modified so that the widget view no longer has access to that instance. That means that you'll need to provide everything that your widget view needs through the properties that the widget interface requires. Typically you'll create a widget class that extends BaseWidget and then you'll override this method:&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;!--[CodeBlockStart:1663749f-aa9b-4d8d-a804-53e5dc0bfdfd]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code"&gt;protected Map&amp;lt;String, Object&amp;gt; loadProperties(WidgetContext widgetContext, ContainerSize size)
&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:1663749f-aa9b-4d8d-a804-53e5dc0bfdfd]--&gt;&lt;p&gt;So in the previous version of Clearspace, you might have had something like this in the FTL file that's your widget's view:&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;!--[CodeBlockStart:90bc0d89-3c32-4a4a-b177-f19d004f98b8]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code"&gt;${widgetContext.jiveContext.communityManager.rootCommunity.ID?c}&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:90bc0d89-3c32-4a4a-b177-f19d004f98b8]--&gt;&lt;p&gt;Because the JiveContext instance has been removed from the WidgetContext class, you'll need to provide your view with the properties it needs explicitly in your widget. Here's an example:&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;!--[CodeBlockStart:9d206e87-eda5-4e75-b066-be78a67c3f2a]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code"&gt;public class MyWidget extends BaseWidget {

&amp;nbsp;&amp;nbsp;&amp;nbsp; // Declare a property variable and setter for injection by Spring.
&amp;nbsp;&amp;nbsp;&amp;nbsp; private CommunityManager communityManager;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setCommunityManager(CommunityManager cm) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.communityManager = cm;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; protected Map&amp;lt;String, Object&amp;gt; loadProperties(WidgetContext widgetContext, 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ContainerSize size)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Map&amp;lt;String, Object&amp;gt; properties = super.loadProperties(widgetContext, size);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Implementation code omitted.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; properties.put("rootCommunityID", communityManager.getRootCommunity().getID());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return properties;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:9d206e87-eda5-4e75-b066-be78a67c3f2a]--&gt;&lt;p&gt;Finally, because you can create a widget that exists in multiple parts of the application (the homepage, a personalized homepage, a community, a project), you'll sometimes want to change the behavior of your widget based on where the widget is being rendered. You can determine the render context of your widget by checking the type of the WidgetContext class that you're given in the loadProperties method. Here's some example code that shows how you can determine what context the widget is in:&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;!--[CodeBlockStart:cb20e02c-72f9-433a-ae03-dc56c1dacc43]--&gt;&lt;pre class="jive-pre"&gt;&lt;code class="jive-code"&gt;public class MyWidget extends BaseWidget {
&amp;nbsp;&amp;nbsp;&amp;nbsp; protected Map&amp;lt;String, Object&amp;gt; loadProperties(WidgetContext widgetContext, ContainerSize size) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Map&amp;lt;String, Object&amp;gt; properties = super.loadProperties(widgetContext, size);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (widgetContext.getWidgetType() == WidgetType.COMMUNITY) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CommunityWidgetContext cwc = (CommunityWidgetContext)widgetContext;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Do something specific for the community
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (widgetContext.getWidgetType() == WidgetType.HOMEPAGE) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HomepageWidgetContext hwc = (HomepageWidgetContext)widgetContext;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Do something specific for the homepage
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (widgetContext.getWidgetType() == WidgetType.PERSONALIZEDHOMEPAGE) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PersonalizedHomepageWidgetContext phwc = 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (PersonalizedHomepageWidgetContext)widgetContext;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Do something specific for the personalized homepage&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (widgetContext.getWidgetType() == WidgetType.PROJECT) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProjectWidgetContext wwc = (ProjectWidgetContext)widgetContext;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Do something specific for the project
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; properties.put("rootCommunityID", communityManager.getRootCommunity().getID());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return properties;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}&lt;/code&gt;&lt;/pre&gt;&lt;!--[CodeBlockEnd:cb20e02c-72f9-433a-ae03-dc56c1dacc43]--&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;The information above along with more details can be found in the &lt;a class="jive-link-external-small" href="http://www.jivesoftware.com/community/docs/DOC-2060/"&gt;Upgrading Extensions to 2.0 documentation&lt;/a&gt;.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;You can also &lt;a class="jive-link-external-small" href="http://www.jivesoftware.com/community/blogs/podcasts/2008/06/05/more-widget-development-in-clearspace-20"&gt;watch a video and download a presentation&lt;/a&gt; to learn more about how to write new widgets for Clearspace 2.0 from Aaron Johnson, Engineering Manager at Jive.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:6e3f171f-c2aa-4bdf-9904-01b586a9b32a] --&gt;</description>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/jivespace/tags">clearspace</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/jivespace/tags">widget</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/jivespace/tags">widget</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/jivespace/tags">widgets</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/jivespace/tags">2.0</category>
      <pubDate>Mon, 30 Jun 2008 15:12:39 GMT</pubDate>
      <author>communities@jivesoftware.com</author>
      <guid>http://www.jivesoftware.com/jivespace/blogs/jivespace/2008/06/30/customization-part-3-widgets</guid>
      <dc:date>2008-06-30T15:12:39Z</dc:date>
      <clearspace:dateToText>1 year, 4 months ago</clearspace:dateToText>
      <clearspace:objectType>0</clearspace:objectType>
      <wfw:comment>http://www.jivesoftware.com/jivespace/blogs/jivespace/comment/customization-part-3-widgets</wfw:comment>
      <wfw:commentRss>http://www.jivesoftware.com/jivespace/blogs/jivespace/feeds/comments?blogPost=1545</wfw:commentRss>
    </item>
    <item>
      <title>New Widgets</title>
      <link>http://www.jivesoftware.com/jivespace/blogs/jivespace/2008/01/11/new-widgets</link>
      <description>&lt;!-- [DocumentBodyStart:1eccedd1-4ad9-4185-97ba-41bc3bed1e89] --&gt;&lt;div class='jive-rendered-content'&gt;&lt;p&gt;In a future release of Clearspace we're talking about adding a personalized homepage feature, much like My.Yahoo.com or Google.com/ig, where users can add Clearspace widgets like 'Recent Content' or 'Top Members' to their homepage. A lot of the widgets that we debuted in the 'customize a community' feature (have you seen the &lt;a class="jive-link-external-small" href="http://www.jivesoftware.com/products/clearspace/features/drag-drop-video.jsp"&gt;video&lt;/a&gt;?) will be available for users on the homepage, but we'd like to hear from you: assuming you had a customizable homepage and you could use Clearspace like you use My.Yahoo.com or Google.com/ig, what widgets (Clearspace related or unrelated) would make your day?&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:1eccedd1-4ad9-4185-97ba-41bc3bed1e89] --&gt;</description>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/jivespace/tags">clearspace</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/jivespace/tags">widgets</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/jivespace/tags">personalization</category>
      <pubDate>Fri, 11 Jan 2008 00:49:02 GMT</pubDate>
      <author>aaron@jivesoftware.com</author>
      <guid>http://www.jivesoftware.com/jivespace/blogs/jivespace/2008/01/11/new-widgets</guid>
      <dc:date>2008-01-11T00:49:02Z</dc:date>
      <clearspace:dateToText>1 year, 10 months ago</clearspace:dateToText>
      <clearspace:replyCount>10</clearspace:replyCount>
      <clearspace:objectType>0</clearspace:objectType>
      <wfw:comment>http://www.jivesoftware.com/jivespace/blogs/jivespace/comment/new-widgets</wfw:comment>
      <wfw:commentRss>http://www.jivesoftware.com/jivespace/blogs/jivespace/feeds/comments?blogPost=1360</wfw:commentRss>
    </item>
    <item>
      <title>Spruce Up Your UI with Your Own Widget</title>
      <link>http://www.jivesoftware.com/jivespace/blogs/jivespace/2007/11/21/spruce-up-your-ui-with-your-own-widget</link>
      <description>&lt;!-- [DocumentBodyStart:9752f3af-3121-4463-a0d3-d1bb0a7fdf1d] --&gt;&lt;div class='jive-rendered-content'&gt;&lt;p&gt;We were really pleased at how popular widgets were from the start. It seems as if everyone has an idea for something they want to "widgetize." So it's great that they're so easy to build.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;If you haven't checked out widget development in Clearspace, now's a great time to do it. Version 1.8 improves on widgets' debut by adding support for including them in plugins. Now you can build a widget and get that handy autodeployment support you already get with macros, actions, and the like.&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;If you &lt;em&gt;have&lt;/em&gt; looked at building widgets, then you know that the version 1.8 changes make them easier to deploy, but they were easy to build from the start. For an introductory tutorial on building widgets, check out&amp;nbsp; &lt;strike&gt;#&lt;/strike&gt;. And be sure to download the &lt;strike&gt;#&lt;/strike&gt; for a sample.&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:9752f3af-3121-4463-a0d3-d1bb0a7fdf1d] --&gt;</description>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/jivespace/tags">clearspace</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/jivespace/tags">plugins</category>
      <category domain="http://www.jivesoftware.com/jivespace/blogs/jivespace/tags">widgets</category>
      <pubDate>Wed, 21 Nov 2007 15:42:59 GMT</pubDate>
      <author>steve@jivesoftware.com</author>
      <guid>http://www.jivesoftware.com/jivespace/blogs/jivespace/2007/11/21/spruce-up-your-ui-with-your-own-widget</guid>
      <dc:date>2007-11-21T15:42:59Z</dc:date>
      <clearspace:dateToText>2 years, 1 day ago</clearspace:dateToText>
      <clearspace:objectType>0</clearspace:objectType>
      <wfw:comment>http://www.jivesoftware.com/jivespace/blogs/jivespace/comment/spruce-up-your-ui-with-your-own-widget</wfw:comment>
      <wfw:commentRss>http://www.jivesoftware.com/jivespace/blogs/jivespace/feeds/comments?blogPost=1311</wfw:commentRss>
    </item>
  </channel>
</rss>

