Atlanta .NET User Group – Monday Sep. 28, 2009 at 6:00 PM

Location: Microsoft’s Offices

6:00 Networking and Refreshments
6:30 Tutorial or Q&A Session – Windows Forms User Controls with the FlowLayoutPanel Control
7:00 Announcements
7:15 Technical Presentation

How to Sell Software Online as a Micro-ISV

Synopsis: Have you ever thought it would be nice to make a little money on the side selling an application or tool you’ve written but you just don’t know where to start? If so then this talk is for you! We’ll talk about:

  • Models – Ask for donations or sell licenses?
  • Picking a license – Closed or open source?
  • How to create and programmatically enforce licenses
  • Key generation and validation
  • Integrating with services like PayPal
  • Getting the word out (Advertising)
  • Using analytics
  • Registering with Microsoft
  • Taking advantage of Microsoft BizSpark

Bio: Doug Ware is the leader of the Atlanta .NET User Group and the founder of Elumenotion, a SharePoint Consulting and Training company located in Atlanta, Georgia.

Doug recently became a small independent software vendor (micro-ISV) with a CSS editing tool called Elumenotion SharePoint Skinner and he wants to share what he learned with you.

Meeting Location and Directions

Microsoft Corporation
1125 Sanctuary Pkwy.
Suite 300
Atlanta, GA 30004

Directions to Microsoft

Code for Provisioning Sites on WSS with Navigation

One thing we like to do on most of our projects is create a version control and deployment system that allows us to keep everyone on the team in sync. This is important because almost every team will have several people who are contributing content, design elements, and requirements who are not developers, in fact these people usually account for the majority. Just the same, we need a way to isolate the work of each to avoid lost productivity that comes about when people try to share an environment for a new project that is changing rapidly.

The thing that makes the process work is that one person, usually the architect (me), or a small team receives deliverables (Visual Studio bits, pages exported from SharePoint Designer, graphics, CSS, etc.) from each person and integrates it into a solution. Then when each person is ready, they run a script that recreates their environment from a set of solution packages. We expect each person to do this very regularly – each time they turn over something for integration. One or more of these packages will have feature(s) that are basically provisioning scripts to create sub-sites, configure security, and configure navigation. I must say it works pretty well and makes the project easy to run by both minimizing the aforementioned productivity losses and also running each deliverable through a funnel where we can continuously check the quality and adherence to requirements.

When we’re doing development on WSS instead of MOSS (which accounts for the vast majority of our work) the scripts are different because WSS lacks the Microsoft.SharePoint.Publishing assembly that has a large number of classes that make things pretty easy. Today I spent some time for the third or fourth time in the last couple of years relearning how it’s done with nothing but Microsoft.SharePoint. This time I made a more generalized solution and I am posting it here so I can find it later. J

void FeatureActivated(SPFeatureReceiverProperties properties)


//This is a site scoped feature, the root web is created in a cmd script.

SPSite site = (SPSite)properties.Feature.Parent;

SPWeb rootWeb = site.RootWeb;


//Make subsite as a Blank team site

SPWeb subWeb =

rootWeb.Webs.Add("SubWeb", "Sub Web",

"A meaningful description", 1033, "STS#1", false, false);


//Add the new site to the top navigation bar and the quick launch menu




void SetNavigation(SPWeb web)


//Share navigation with the parent web

web.Navigation.UseShared = true;


//Try to get the top navigation bar

SPNavigationNodeCollection topNavigationBar = null;

topNavigationBar = web.ParentWeb.Navigation.TopNavigationBar;


//If found, add the new web at the end

if (topNavigationBar != null)


SPNavigationNode topNode = CreateHomeNode(web, web.Title);





catch (SPException)





//Try to find the Sites node on the

//parent web’s quick launch

SPNavigationNode sitesNode =

GetNodeFromTitle("Sites", web.ParentWeb.Navigation.QuickLaunch);


//If found, add the new web at the end

if (sitesNode != null)


SPNavigationNode leftNode = CreateHomeNode(web, web.Title);





catch (SPException)







//Iterate a navigation node collection

//and return the node with a given title if any

SPNavigationNode GetNodeFromTitle(string title,

SPNavigationNodeCollection nodes)


for (int i = 0; i < nodes.Count; i++)


if (nodes[i].Title == title)


return nodes[i];






//Create a navigation node for a given web’s welcome page

SPNavigationNode CreateHomeNode(SPWeb web, string nodeTitle)


if (string.IsNullOrEmpty(nodeTitle))


nodeTitle = web.Title;


string welcomePage = web.RootFolder.WelcomePage;

if (string.IsNullOrEmpty(welcomePage))


welcomePage = "default.aspx";



web.ServerRelativeUrl + "/" + welcomePage);


Author: Doug Ware

SharePoint Skinner – Yet More New Features

First off, thanks to those of you who have provided feedback so far. I am pleased that you like the tool and your feedback helps make it better! Keep it coming! I want to hear all about your adventures with SharePoint CSS.

One thing a couple of you mentioned was that the new colors tab lacked the before and after colors that the first version had. So, I’ve added this feature to the new version and also provided the ability to sort either by the current or the original color palette!

As before, you can easily revert to an original color by clicking the color swatch.

Here is the default sort.

Here is the same palette ordered by the original color.

I will put up some videos and some themes created using the new version eventually, but before that I have one more set of features that I want to add before Elumenotion SharePoint Skinner can live up to the boast of ‘The Ultimate SharePoint Branding Tool’.

My Apologies – Worst Presentation Ever

I just got done with a Live Learning Web cast for AppDev on User Profiles and My Sites and it’s hard to imagine how it could possibly have been worse. I had serious machine issues for the first 30 minutes and couldn’t get my profile import configuration to save. I kept getting an error message about connecting to the database on the profile configuration screen. This was very strange as everything else seemed to be working – I’d expect the Shared Services Administration site to fail completely if the database server was borked.

After about 30 of the longest minutes of my life floundering in front of an Internet audience that I couldn’t see, I tried to switch VM’s by simultaneously suspending the problem VM and resuming another one from the same base image. BIG mistake as VMWare Workstation completely hung. I had to reboot my machine and rejoin the meeting whereupon I spent a couple minutes talking into a muted Microphone because Live Meeting naturally has your mic muted by default if you are the presenter. Thoroughly flustered and ashamed I managed to limp through the rest of the presentation on a machine with left over vestiges of a previous presentation with only one minor, but strange, security issue.

As soon as the meeting was over I resumed the problem VM so that I could find out the core issue and slightly redeem myself by sharing it with all of you. As soon as the VM resumed, I got a kernel fault and VMWare shut it down. I started the darn thing back up, went to the Configure Profile Import page and… the problem was gone. It worked like a charm.

So, then I opened up the LOGS folder and, low and behold, the log file for the time period in question was huge! What could possibly have been going on? Well, after running through everything this morning I needed to reboot the VM because I was having an issue with VMWare and mouse tracking after resizing the desktop on the host OS. When I rebooted, in my haste, I clicked "Install Updates and Shut Down". A quick look at my Windows Update history showed:

That’s right, a simple update to correct the reset license key issue from SP2 apparently was the culprit and a simple reboot fixed the problem!

How many rookie presenter mistakes did I make?

  1. Do not install any updates before a Webcast
  2. Don’t panic and start clicking around like a fool. Had I just taken a deep breath I might have figured this out.
  3. VMWare supports snapshots. I should have taken one before I did the run-through. If I had, I could have easily reverted to a known good state.

So, my lessons learned have nothing to do with SharePoint. I think I need a drink.


Getting Started with the New Version of Elumenotion SharePoint Skinner

Two years ago this week I released a simple little theme creation tool that was birthed quickly and out of necessity. I’ve been meaning to put out a new version for awhile now, but once I started, I couldn’t stop adding features and changing this around. Today I am pleased to announce the release of a major new version of Elumenotion SharePoint Skinner. I believe, and I hope you will agree, that the new version is the ultimate tool for branding SharePoint sites on both WSS and MOSS servers with CSS.

The new version exports plain old CSS as well as wsp files for both WSS style themes and MOSS publishing site style library features. All you have to do is deploy the packages and activate the features!

You can download the new installer from here: Skinner Setup.msi.

Getting Started

Simply download and install the msi program. The only thing you need on your machine is Windows, the .Net 2.0 framework, and Internet Explorer (preferably IE 7 or later). Skinner uses wspbuilder to package the exported features, css files and images into a web solution package. If you are using a 64 bit OS you must replace the cablib.dll with the 64 bit version which you can download from CabLib.dll for x64 systems (version: 10.5).

Once you’ve got that taken care of, launch the program, enter the address of the site you want to use as your basis and click Go.

Once the page loads, Skinner will slice and dice the html, styles, colors, and images.

The Inspector tool is also the editor. Every tab supports editing and creation of new style rules. Click the Inspector button to open it.

The HTML Tab

The first tab of the Inspector has a tree-view of the html document. You can explore the elements and their styles by navigating through the tree or by clicking the browser. The Inspector will decorate the current element with a blue border, and display the element’s HTML and, more importantly, show the selectors that affect the element and style properties inherited, embedded, or inline.

The Styles pane shows the properties of a given set of selectors as they exist in the current document. This is a major difference compared to the previous version where you had to specify a single style sheet as the basis for your edits. As seen below, the .ms-Toolbar rule has properties in effect from three style sheets, core.css, the Lacquer theme, and the current skinner project.

The Matching Styles Tab

The Matching Styles tab displays a filtered subset of the selectors in the current style sheets that match the page you are inspecting. When you select a selector, Skinner displays a list of matching elements, and they, in turn, both highlight the corresponding element on the page and sync to the HTML explorer tree-view.

The All Styles Tab

The All Styles Tab simply displays all of the styles in the current set of style sheets.

The My Edits Tab

The My Edits Tab displays every edit made in the current project and allows you to create new edits or remove existing edits.

The Colors Tab

The Colors Tab displays color swatches for every color in the current style sheets, filterable to the colors active on the current page. Clicking on the page will cause selection of the underlying color if possible. The following shows selection of #E3F0F2 from the global breadcrumb area.

You can change the color for only the styles affecting the current sheet or for all styles in the current set of style sheets.

The Images Tab

The Images Tab shows a filterable set of the images and previews for each. When you select an image, the inspector will highlight it in the browser and sync to HTML explorer and the Matching Styles tabs.

You can download any image and open it with the default program for the image type for editing. (I like Paint.Net) You can replace the selected image with a new image of your choice in all styles in which the original appears.

The Style Editor

You can open a style complete with all of its current properties and add it to your project or you can select just the properties you want to override to keep your new theme lean and mean. Either click Edit Image to copy everything or check the appropriate properties and click the link in the styles pane.

The Style Editor itself is easy to use and validates your CSS against the CSS 2.1 specification, making it easy to get the syntax correct and keep your syntax valid. You can enter the CSS directly and use a property builder.

Navigating Between Pages

You do not need to save your work when navigating between pages. Skinner will maintain your work and apply it each time you change pages automatically until you close the application.

Saving Your Work

Skinner now includes a proper document format. You can save your work at any time to a *.skinner file. Double clicking the file will open Skinner, navigate to the page you were on when you last saved, and apply your edits.

Exporting Your Work to SharePoint Server

When you are ready, use the Export Wizard to export your project as plain old CSS and images to a folder, as a WSP packaged Theme feature, or as a WSP packaged feature that deploys to the Style Library.

Note that if you create a Style Library feature, you must activate the Publishing Infrastructure before activating the features.

More to come, but for now, play with it and let me know what you think!

–Doug Ware

Author: Doug Ware