Integrating Microsoft Office Visio 2003 with Microsoft SharePoint Products and Technologies

 

Mark Bukovec
Empire Down Development

September 2003

Applies to:
    Microsoft® Office Visio® 2003 Standard
    Microsoft Office Visio 2003 Professional
    Microsoft Office SharePoint™ Portal Server 2003
    Microsoft Windows® SharePoint Services

Summary:   Discover how Microsoft Office Visio 2003 integrates with Microsoft SharePoint Products and Technologies to help team members share Visio documents. SharePoint sites recognize Visio drawings as a native document type and provide menu items for seamlessly checking out documents and checking them back into the server. The Visio client is integrated with SharePoint Products and Technologies to allow access to document libraries using shared workspace sites. Also, the Visio drawing control can be displayed in a Web Part for use on a SharePoint site. Web Parts can use standard interfaces to communicate with each other. Users can enable connections between other Web Parts to a Visio Web Part, allowing the drawing contained in the Visio Web Part to be dynamically updated. (16 printed pages)

Contents

Sharing Visio Documents Using Windows SharePoint Services
Sharing Visio Documents within the Visio Client
Exposing the Microsoft Office Visio 2003 ActiveX Control as a Web Part
Scenarios for Implementing a Visio Web Part
Wrapping the Visio Drawing Control as a Web Part
Implementing Web Part Basics
Connecting Web Parts
Getting Data from a Web Service
Getting Started Tips for Implementing a Visio Web Part
Conclusion

Sharing Visio Documents Using Windows SharePoint Services

Microsoft Windows SharePoint Services provides workflow integration with Visio documents, making it easier to share Visio files between team members. From your SharePoint site, you can check out Visio files from any document library and edit these files using Visio. For example, you can click a Visio document in the Shared Documents Web Part and choose Edit in Microsoft Office Visio, as shown in Figure 1.

Figure 1. Checking out a Visio document from a SharePoint site

Choose this menu item to automatically check out the file and load it in Visio. After you make your changes and close the file, the updated file is automatically checked back into the document library. Note that this menu item is not available for XML-formatted Visio documents. You can also choose to check the files in and out manually using the same menu.

You can programmatically check in or out Visio files from a document library using the following methods available in the Visio Documents collection:

  • CanCheckIn. Checks the server to determine whether a document can be checked into a document library.
  • CanCheckOut. Checks the server to determine whether a document can be checked out from a document library.
  • CheckIn. Checks in a file from the local computer to the server.
  • CheckOut. Checks out a file from the local computer to the server.

The following C# code example demonstrates how to check out a file. The code opens the file, checks if the file can be checked out, and then checks it out if it can be checked out. If the file cannot be checked out, such as when another user has checked out the file, the example displays an error message.

private void CheckDocumentOut(string document)
{
    Visio.Documents documents = application.Documents;

    try
    {
        documents.Open(document);

        if (documents.CanCheckOut(document))
            documents.CheckOut(document);
        else
            MessageBox.Show("You are unable to check out this "
                + "document at this time.");
        }
    catch (Exception exception)
    {
        MessageBox.Show(exception.ToString());
    }
}

Note that this code assumes that you have a reference to the Visio Application object, from which you can get a reference to the Documents collection. To call the method, pass in a valid URL to the document, such as the following:

CheckDocumentOut("http://server_name/workspace_name/drawing.vsd")

Sharing Visio Documents within the Visio Client

The Visio client integrates with SharePoint Products and Technologies to allow access to document libraries using shared workspace sites. Shared workspace sites provide easy access from within Visio to documents shared on a SharePoint site, in addition to providing access to other site tasks. To view a shared workspace site:

  1. From Visio, click the Tools menu.
  2. Click Shared Workspace. The Shared Workspace task pane appears.

If your Visio document is already stored in a document library, the Shared Workspace task pane is displayed when you open the document. This is the case when using the Edit in Microsoft Office Visio feature described previously. If your Visio document is not stored in a document library, you can easily add it directly from within Visio.

To add a document to a workspace site from Visio

  1. From the Shared Workspace task pane, click the Members tab, as shown in Figure 2.

    Figure 2. Creating a document workspace in Visio

  2. In the Document Workspace name box, type the name you want for the document workspace site. By default, this is the name of the file.

  3. In the Location for new workspace list, choose the location for the new workspace or type the URL to the server if it does not appear in the list. For example: http://server_name/site_name/

  4. Click Create.

From the Shared Workspace task pane you have access to additional SharePoint site features:

  • Versioning   The Status tab allows you to make sure you have the latest version and to get updates from the server if need the latest version.
  • **Members list   **The Members tab displays team members associated with the shared workspace site and information such as whether a member is free or busy and his or her e-mail address.
  • **Task list   **The Tasks tab allows displays tasks assigned to you and allows you to create additional tasks.
  • **Documents list   **The Documents tab displays a list of documents in the shared workspace site and allows you to add new documents.
  • **Links list   **The Links tab displays hyperlinks useful to workspace members.
  • **Document properties   **The Document Information tab displays document properties such as when the file was created.

This functionality is similar to that provided by various Web Parts used with SharePoint Products and Technologies. For more information, refer to SharePoint Products and Technologies help documentation.

When you add a document to a shared workspace site, the document properties such as name and title can be viewed from the SharePoint site. Although you can programmatically check files in and out, as described previously, you cannot programmatically modify the document properties for a file stored on a SharePoint site.

Exposing the Microsoft Office Visio 2003 ActiveX Control as a Web Part

Web Parts are components of a Web Part Page that can be easily managed to define team workflow. A SharePoint site is composed of multiple Web Part Pages and Web Parts. Example Web Parts include the Shared Documents Web Part, which lists the files in a document library and provides menu items for checking files in and out of a document library.

The Microsoft Office Visio® 2003 ActiveX® Control, also known as the Visio drawing control, can be rendered in a Web Part. This allows a Visio document to appear on a page on a SharePoint site. However, a more compelling reason for implementing a Visio Web Part is that Web Parts can use standard interfaces to communicate with each other. Users can select from a menu to connect Web Parts that can exchange data, and these Web Parts can be developed completely independently of each other. For example, Figure 3 shows how you can create a Visio flowchart from data in an Excel spreadsheet. The user can change values in the datasheet view of a Web Part and the Visio drawing automatically updates. Alternatively, you can change the order of the shapes in the Visio drawing and the datasheet view of the Web Part updates.

Figure 3. Web Part to Web Part communication

Scenarios for Implementing a Visio Web Part

A Web Part containing the Visio drawing control can provide diagrams in the context of collaboration activities on a SharePoint site. Visio diagrams fit well into collaboration scenarios because they can represent data clearly to groups and be dynamically updated from group actions. For the end user, these capabilities provide enhanced mechanisms for more effective planning, collaboration and communication. Whether the Web Part is used to inform team members about project status, represent real time access to enterprise data, reallocate scarce resources, communicate changes to key business processes or keep senior management informed of key milestones and performance metrics, Visio 2003 extends the value organizations receive from their investment in the product beyond the desktop and elevates its role to a critical day-to-day productivity tool. In the end, this integrated use of Visio and SharePoint Products and Technologies can result in lower costs and faster completion of business objectives.

The following scenarios demonstrate solutions that you can implement using a Visio Web Part.

Visio Web Part for project management

The Visio drawing control wrapped in a Web Part allows team members to view summary information about project tasks and resources on a SharePoint site. Team members can use Microsoft Office Project Server 2003 to manage the intricate details of project planning. A team member can then view the same project information rolled up in a Visio timeline hosted in the Visio Web Part on the SharePoint site. With some custom solution code, the Visio timeline can use the Microsoft Project Data Service to update the database from the computer running Project Server with changes to milestones made in the Visio diagram. The Visio timeline can also use the Microsoft Project Data Service to display the latest project information stored in the database on the computer running Project Server. Two-way data integration allows team members to view and update the latest summary information for a Project plan in a dynamic Visio timeline diagram on a SharePoint site.

Visio Web Part for business intelligence

Because a developer can implement interfaces that enable Web Part-to-Web Part connections, the Visio drawing control can diagram data from another Web Part. For example, the Visio Web Part can consume customer sales data managed in a datasheet view of a Web Part to display a chart or hierarchical diagram. This allows the user to manage both the data and the visual representation of the data from a single SharePoint site.

Visio Web Part for process management

The Visio drawing control as a Web Part can help track processes on a SharePoint site. Microsoft Windows SharePoint Services stores metadata for each document in the document library. A developer can read the metadata associated with a document (such as status) and use that information to color-code the appropriate step in a document process workflow diagram displayed in the Visio Web Part. With custom code, a Web service, other Web Parts, or metadata can drive the Visio process workflow diagram from the SharePoint site itself.

Wrapping the Visio Drawing Control as a Web Part

Web Parts are custom ASP.NET server controls. However, unlike standard ASP.NET server controls, which are added to Web form pages by developers at design time, the site administrator adds Web Parts dynamically within the browser to a Web Part Page on a SharePoint site.

The basic task for integrating a Web Part with the Visio drawing control is for the Web Part to render the drawing control on the client side. The Web Part architecture, however, allows for much more powerful functionality than simply displaying a Visio drawing in the control on a Web Part Page. The following sections describe an implementation for the process management Web Part described previously. Each implementation step yields the following features:

  • By implementing the basic interface for a custom ASP .NET server control, the Web Part can track user state, which determines whether it should display the Visio drawing control.
  • By exposing custom properties, the Web Part can be tailored by the site administrator at runtime.
  • By implementing a standard connection interface, the Web Part can communicate with other Web Parts.
  • By implementing an extension assembly, Visio drawings in the drawing control Web Part can retrieve data from Web services.

As a Web Part, the Visio drawing control provides an ideal smart client for a Web service. The Visio drawing control can serve as a visualization display surface for data provided by a Web service, such as the Human Workflow Services (HWS) available from Microsoft BizTalk™ Server. HWS provides a Web service API which client applications can use to provide workflow capabilities to the end user. The Visio drawing control gives the corporate developer the ability to track workflow information to the end user graphically.

Figure 4 shows a Visio diagram in a Web Part that dynamically updates to reflect the workflow managed by the HWS Web Service.

Figure 4. A Web Part displaying HWS workflow

To extend a Web Part to display tracking data from the HWS Web service using the Visio drawing control, you must build an HWS integration component—a class library that essentially holds the logic that maps user events from the Visio drawing control to HWS Actions deployed on the server running BizTalk Server. The Visio drawing control rendered as a Web Part provides a rich feature set to allow users to create, display, and save Visio workflow diagrams to a SharePoint site. The Visio drawing control rendered as a Web Part also allows you to connect its data with other Web Parts on the page. In this scenario, the HWS integration component could enhance the core drawing functionality of the Visio drawing control to allow users to track and view the activity of a workflow as it happens for a team. You can also add functionality to the HWS integration component to provide custom workflow shapes and right-click actions.

Similar to the Visio drawing control, the HWS class library resides on the client computer. The HWS integration component communicates with the HWS Web service. For example, the integration component defines the custom right-click actions for shapes in the Visio workflow diagram for performing HWS actions such as Assign and Delegate. For more information about HWS actions, see Microsoft BizTalk Server 2004.

The component also contains the logic to display custom shapes to represent the status of a task, and also notify users of assignments using the My Tasks functionality of a SharePoint site. Each shape on the page has an HWS activity flow ID associated with it, that is stored in a custom user cell for the shape. When an end user adds a task to the workflow using the right-click menu for a Visio shape, the HWS activity flow ID is passed to the Web service to create tasks, update task information, and assign owners. The HWS Web service is a great example of how you can drive the Visio visualization surface from a Web service.

Implementing Web Part Basics

A basic implementation for a Web Part inherits from the Microsoft.SharePoint.WebPartPages.WebPart class and overrides the RenderWebPart method. Additionally, your Web Part project must contain the following:

  • A reference to the Microsoft.Sharepoint.dll assembly.
  • A Web Part class file and a matching .dwp file. A .dwp file is an XML file that references a Web Part's assembly, namespace, and class name, plus optional property settings for the Web Part.
  • A Manifest.xml file for the Web Part that contains XML elements describing setup information. The Manifest.xml file is used by the Stsadm.exe tool during installation of a Web Part.

For more details on the structure of a Web Part project, see A Developer's Introduction to Web Parts. Of particular interest is the RenderWebPart method, which is where your Web Part constructs the HTML that is rendered inside the Web Part frame. Writing code to emit HTML in RenderWebPart consists of calling methods of the HtmlTextWriter object that is passed to the RenderWebPart method. The following C# code example shows a basic implementation of RenderWebPart:

protected override void RenderWebPart(HtmlTextWriter output)
{
    if (rowConsumerConnected && !rowConsumerRowSent)
    {
        output.Write("<br><br><h3>" +
             "Please select a row in the connected Web Part.</h3>");
        return;
    }
}

This example checks two custom members of the Web Part class implementation to determine whether the Web Part is connected to another Web Part. Later in this article, we will show how these members are set, but for now the code simply shows the default state where no document has been selected. In this case, a message is displayed to the user instructing her to select a document. Note how the RenderWebPart implementation uses the passed-in HtmlTextWriter object to render XML using the object's Write method.

Defining Custom Web Part Properties

Web Parts share common properties, such as Title, Height, and AllowClose. These properties are displayed in a frame when the site administrator adds a new Web Part or modifies an existing one. Developers can add custom properties to Web Parts by adding standard .NET properties to the Web Part class implementation.

The Visio Web Part requires a DocumentLibrary property that must be set to a valid URL of a document library. This document library specifies where the Web Part can save drawings. The DocumentLibrary property is defined by the following C# code example:

[Browsable(true),Category("Miscellaneous"),
DefaultValue(defaultDocumentLibraryProperty),
WebPartStorage(Storage.Personal),
FriendlyName("Row connection drawing path"),
Description(@"Location to store Visio documents.
    Only used when WebPart is a Row Consumer.")]
public string DocumentLibrary
{
    get {
        return documentLibraryProperty;
    }

    set {
        documentLibraryProperty = value;
    }
}

This code defines how the property appears in the properties frame: defining a display name, a description, and with which category to group the property. The property is stored in a custom member of the Web Part class implementation, to be referenced later when the Web Part is connected.

Communicating with Web Parts

So far we have discussed how to render the Visio drawing control in a Web Part so that it can be displayed on a Web Part Page page. The real advantage, however, of creating a Visio Web Part is the ability to communicate with other components to get data for updating a drawing. The communication can go in both directions: updates to a Visio drawing can modify data in another component.

This section describes two different ways a Visio Web Part can receive data from other components:

  • By implementing a standard connection interface, the Web Part can communicate with other Web Parts.
  • By implementing an extension assembly, Visio drawings in the drawing control Web Part can retrieve data from Web services.

Connecting Web Parts

Users create connections between Web Parts on the fly during runtime. To enable Web Part to Web Part communication, your Web Part must override standard methods of the WebPart base class for each connected Web Part on a page. Additionally, a connectable Web Part must implement one of the standard connection interfaces. Most of the connection interfaces require you to declare event delegates.

In our process management Web Part example, the user selects a row in the Document Library Web Part. The Visio drawing control Web Part loads a workflow diagram associated with the selected document. The Visio drawing control Web Part needs to respond to the user selection in the Document Library Web Part. This is accomplished by implementing an interface in the Visio drawing control Web Part that consumes data provided by the Document Library Web Part.

The Document Library Web Part implements the IRowProvider interface. In this case, the "rows" correspond to the documents in the library, each row representing a single document. Because the Document Library Web Part is connected as a provider to another Web Part, radio buttons appear on the left column of each item in the document list. When a document is selected in the Document Library Web Part, an event occurs. To handle that row-selection event, the Visio drawing control Web Part implements the IRowConsumer interface.

The first step to implementing the IRowConsumer interface is to include it in our Web Part class definition as follows:

public class VisioWebPart : Microsoft.SharePoint.WebPartPages.WebPart,
    IRowConsumer

The remaining work for implementing an IRowConsumer Web Part involves declaring events and overriding methods. For more information about this, see the Microsoft SharePoint Products and Technologies Developer Center. The following example shows a subset of the overridden method implementations.

When a row is selected in the Document Library Web Part, the RowReady method is invoked in the Visio Web Part class. The RowReady method parses the event arguments that it receives to obtain the document URL, as shown in the following code:

public void RowReady(object sender, RowReadyEventArgs rowReadyArgs)
{
    if(rowReadyArgs.Rows != null)
    {
        rowConsumerRowSent = true;

        try
        {
            selectedDocumentExtension = (string)rowReadyArgs.Rows[0][0];
            selectedDocumentName = (string)rowReadyArgs.Rows[0][1];
            selectedDocumentModifiedBy = (string)rowReadyArgs.Rows[0][2];
            int selectedDocumentId = (int)rowReadyArgs.Rows[0][3];

            int indexToDelete = selectedDocumentName.LastIndexOf(".");
            string visioDocumentTemplate = selectedDocumentName.Substring(
                0, indexToDelete) + "_" + selectedDocumentId.ToString() +
                ".vsd";

            if (doesDocumentExist(visioDocumentTemplate))
            {
                documentToLoad = 
                    getVisioDocumentUrl(visioDocumentTemplate);
                documentTemplateName = documentToLoad;
            }
            else
            {
                documentToLoad = getDefaultVisioDocumentUrl();
                documentTemplateName = 
                    getVisioDocumentUrl(visioDocumentTemplate);
            }
        }
        catch (Exception)
        {
            // Handle exception (not shown).
        }
    }
}

From the RowReadyEventArgs passed into the event handler, the RowReady method can determine what document was selected. The example above uses this information to determine the file name of the associated Visio workflow diagram.

Also, note that the rowConsumerRowSent member is set to true. As previously, this member acts as a flag for the RenderWebPart method to determine whether to display the Visio drawing control in the Web Part frame. The following code shows how the Visio drawing control is rendered to the Web Part, setting the control's Src property to the file name determined by the Web Part's RowReady method:

output.Write("\n"
    + "<object classid=\"clsid:E4615FA3-23B0-4976-BD3E-D611DDBE330E\""
    + "id=\"axVisio\">\n"
    + "  <param name=\"HostID\" value=\"\">\n"
    + "  <param name=\"NegotiateMenus\" value=\"0\">\n"
    + "  <param name=\"NegotiateToolbars\" value=\"0\">\n"
    + "  <param name=\"PageSizingBehavior\" value=\"1\">\n"
    + "  <param name=\"Src\" value=\"" + documentToLoad + "\">\n"
    + "</object>\n"
    + "\n");

Getting Data from a Web Service

You could extend the Web Part example so that Visio drawings in the drawing control Web Part can retrieve data from a Web service. For example, you could allow the user to right-click a process shape in the workflow diagram. This right-click action would display a custom menu that allows you to assign the task associated with the process shape to a team member. Assigning and retrieving a resource assignment is handled by calling a Web service, which exposes methods for managing resources. Ideally, this extension would require minimal changes to the Visio Web Part itself.

You can implement this extension by creating another assembly that communicates with the Web service. This assembly would be a COM component, which would allow the Visio Web Part to instantiate it on the Web Part page using the OBJECT tag, similar to the way the Visio drawing control itself is instantiated in the "Connecting Web Parts" section.

The extension assembly would expose an Initialize method that is called by using client-side code such as ECMAScript, as defined by the specification of the European Computer Manufacturers Association, such as Microsoft Jscript® or JavaScript, which is also rendered to the page by the Visio Web Part. The Initialize method is called when the page is loaded, and passes in a reference to the Visio drawing control.

Now that the extension assembly has the reference to the Visio drawing control, the assembly can listen to mouse events on the drawing control using the AddAdvise method. This allows the assembly to determine when a shape is right-clicked. The assembly can call a Web service method to get resource information about the task associated with the shape. The assembly can then modify the drawing to add shapes to the workflow diagram that display task assignments and the status for each task.

For more information on handling mouse events in the Visio drawing control, see Programming with the Microsoft Office 2003 Visio ActiveX Control. This article also shows how to use the AddAdvise method to specify which events to listen for.

Getting Started Tips for Implementing a Visio Web Part

This section lists some tips for implementing a Visio Web Part. These suggestions make it easier for a site administrator to include your Web Part. They include some technical considerations when working within the Web Part infrastructure. These tips also make the Visio Web Part more useful to your team members.

Plan Web Part to Web Part communication

Choose carefully which Web Parts you want to integrate with your Visio Web Part. Don't try to generalize integration too much by implementing provider and consumer interfaces that you may not need. Choose one or two other Web Parts to support.

Some Web Parts are already implemented as row consumers but not row providers. Don't assume that every Web Part is both a row or list consumer and provider.

Expose custom Web Part properties

Consider exposing custom properties on the Web Part to lets an administrator configure the Web Part for his particular SharePoint site. For an example custom Web Part property, see "Defining Custom Web Part Properties." In this example, a DocumentLibrary property defines the URL of a document library. This document library specifies where the Visio Web Part can save drawings. This allows different teams to easily configure the Visio Web Part without having to modify and rebuild the Web Part code for each SharePoint site.

Use the SharePoint API to check out/in files

Don't use the methods available in the Visio Documents collection (see "Sharing Visio Documents Using Windows SharePoint Services") to check files in or out. These methods do not work in the context of the Visio drawing control.

Instead, use the APIs included with Microsoft SharePoint Products and Technologies for this functionality in your Web Part code. For example, the following C# code example shows how to use the CheckOut method to check all files from a document library:

SPSite site = SPControl.GetContextSite(Context);
SPWeb targetWeb = site.AllWebs["Site_Name/Subsite_Name"];

SPFolder docLibFolder = targetWeb.Folders["Shared Documents"];
SPFileCollection docLibFiles = docLibFolder.Files;

for (int i=0; i<docLibFiles.Count; i++)
{
    docLibFiles[i].CheckOut();
}

The SPControl object serves as the base server control from which other controls in the Microsoft.SharePoint.WebControls namespace are derived. This object allows us to get the SPSite object representing the SharePoint site, and from there, retrieve a reference to the Shared Documents folder. Then we can iterate over each file in the folder and check it out.

Use the Microsoft.SharePoint.CheckIn method from to check files back into the server. For more information about this, see the Microsoft SharePoint Products and Technologies Developer Center.

Install the Visio Drawing Control on all clients

Remember, the Visio drawing control must be installed on the user's computer to display properly; otherwise, it won't initialize. For more information, see Programming with the Microsoft Office 2003 Visio ActiveX Control.

Implement Save, Print, or Print Preview functionality in the Web Part

Consider implementing functionality that allows the user to save, print, or preview the document in the Visio drawing control. Remember that the drawing might be used for something other than display on the Web site.

For example, you can create an assembly that implements print preview functionality. In the RenderWebPart method implementation of your Visio Web Part, you can render JScript code that responds to user clicking a Print Preview button. The following example shows how to do this:

output.Write(@"
    function clickPrintPreview() {
    visioUtilityLib.PrintPreview();
    }");

In this case, visioUtilityLib is a reference to the utility assembly, instantiated using the OBJECT tag when the page is loaded. This client-side instantiation is similar to the extension assembly discussed previously that communicates with a Web Service.

The PrintPreview method is implemented in C# as follows:

public bool PrintPreview()
{
    if (null == drawingControl || null == sharePointUrl)
    {
        return false;
    }

    PrintDocument printDocument = new PrintDocument(); 
    PrintPreviewDialog printPreviewDialog = new PrintPreviewDialog();
    printDocument.PrintController = new PreviewPrintController();
    printDocument.PrintPage += 
        new PrintPageEventHandler(this.PrintPageEventHandler);
    printPreviewDialog.Document = printDocument;
    printPreviewDialog.ShowDialog();

    return true;
}

private void PrintPageEventHandler(object sender, PrintPageEventArgs ev)
{
    if (null == drawingControl)
    {
        return;
    }

    int handlevalue = 
        drawingControl.Document.Application.ActivePage.Picture.Handle;

    Metafile visioMetafile = new Metafile((IntPtr) handlevalue, false);
    ev.Graphics.DrawImage(visioMetafile, 0, 0 );
}

Visio Automation does not implement its own PrintPreview method. The approach above creates a new PrintDocument object and handles its PrintPage event in the PrintPageEventHandler method. The PrintPageEventHandler method uses the Visio Page object's Picture property to render the drawing as an enhanced metafile.

Conclusion

Microsoft Office Visio 2003 provides deep integration with Microsoft SharePoint Products and Technologies in the Visio user interface and in the Visio object model. The addition of shared workspace sites makes document management transparent for team members.

The introduction of the Visio drawing control enables developers to create Web Parts that expose the Visio drawing surface in SharePoint sites. Additionally, by implementing standard interfaces from the Microsoft.SharePoint namespace, a Visio Web Part can communicate with other Web Parts, allowing the drawing to be dynamically updated using data in another Web Part. Likewise, the communication can flow in the opposite direction, enabling other Web Parts to detect changes in the Visio drawing and update their data accordingly. Creating a Web Part with the Visio drawing control enhances collaboration within a SharePoint site by a providing a visual representation of team data.

About the author

Mark Bukovec is a freelance developer and technical writer. Previously, Mark worked at Microsoft for five years, most recently as a program manager with the COM+ group. You can contact Mark at empiredown@hotmail.com.