<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Workflow</title>
        <link>http://geekswithblogs.net/marcel/category/3895.aspx</link>
        <description>Workflow</description>
        <language>en-US</language>
        <copyright>Marcin Celej</copyright>
        <managingEditor>marcin.celej@gmail.com</managingEditor>
        <generator>Subtext Version 0.0.0.0</generator>
        <item>
            <title>Windows Workflow Foundation - custom action that creates Outlook task</title>
            <link>http://geekswithblogs.net/marcel/archive/2006/02/08/68739.aspx</link>
            <description>&lt;P&gt;In my job I created workflow engine and many workflows based on it. I will not show you the engine I developed but I'd like to start set of articles on Windows Workflow Foundation - MS workflow engine. It's still in its beta version but it looks extremely interesting to me and I believe it should be point of main interest to many developers.&lt;/P&gt;
&lt;P&gt;Let's start from real-live requirements that we will try to target in WWF:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Create an Outlook task, passing some parameters to it (e.g. task subject). 
&lt;LI&gt;Wait for the created task to finish (end user checks the task in Outlook as completed)&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;How to achieve this:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Create WWF 'Sequential Workflow Library' project. The project by default contains one custom activity which looks like this in VS designer:&lt;BR&gt;&lt;BR&gt;&lt;IMG src="/images/geekswithblogs_net/marcel/3862/o_WWF-outlook-task-design.PNG"&gt; &lt;BR&gt;
&lt;LI&gt;Change the activity name and its base type from CompositeActivity to Activity. 
&lt;LI&gt;Add a property to the activity that will hold the Outlook task subject. It can be added through the activity designer so you don't need to write anything. 
&lt;LI&gt;Write the activity logic in its Execute method. After this the CreateOutlookTask activity may look like this: 
&lt;P&gt;&lt;PRE style="BORDER-RIGHT: gray 1px solid; BORDER-TOP: gray 1px solid; BORDER-LEFT: gray 1px solid; BORDER-BOTTOM: gray 1px solid"&gt;[&lt;SPAN style="COLOR: teal"&gt;ToolboxItemAttribute&lt;/SPAN&gt;(&lt;SPAN style="COLOR: blue"&gt;typeof&lt;/SPAN&gt;(ActivityToolboxItem))]
&lt;SPAN style="COLOR: blue"&gt;public partial class&lt;/SPAN&gt; CreateOutlookTask : Activity
{
  &lt;SPAN style="COLOR: blue"&gt;public static &lt;/SPAN&gt;DependencyProperty SubjectProperty = DependencyProperty.Register(
    "Subject", typeof(System.String), &lt;SPAN style="COLOR: blue"&gt;typeof&lt;/SPAN&gt;(CreateOutlookTask));
  [&lt;SPAN style="COLOR: teal"&gt;DesignerSerializationVisibilityAttribute&lt;/SPAN&gt;(DesignerSerializationVisibility.Visible)]
  [&lt;SPAN style="COLOR: teal"&gt;ValidationVisibilityAttribute&lt;/SPAN&gt;(ValidationVisibility.Optional)]
  [&lt;SPAN style="COLOR: teal"&gt;BrowsableAttribute&lt;/SPAN&gt;(true)]
  &lt;SPAN style="COLOR: blue"&gt;public string&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;&lt;STRONG&gt;Subject&lt;/STRONG&gt;&lt;/SPAN&gt;
  {
    &lt;SPAN style="COLOR: blue"&gt;get&lt;/SPAN&gt; { return ((string)(base.GetValue(Workflow.CreateOutlookTask.SubjectProperty))); }
    &lt;SPAN style="COLOR: blue"&gt;set&lt;/SPAN&gt; { base.SetValue(Workflow.CreateOutlookTask.SubjectProperty, value); }
  }
  &lt;SPAN style="COLOR: blue"&gt;protected override&lt;/SPAN&gt; Status &lt;SPAN style="COLOR: red"&gt;&lt;STRONG&gt;Execute&lt;/STRONG&gt;&lt;/SPAN&gt;(ActivityExecutionContext context)
  {
    Application outlook = new ApplicationClass();
    TaskItem task = (TaskItem)outlook.CreateItem(OlItemType.olTaskItem);
    task.Status = OlTaskStatus.olTaskNotStarted;
    task.Subject = this.Subject;
    task.Save();
    &lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt; Status.Closed;
  }
}&lt;/PRE&gt;
&lt;P&gt;&lt;/P&gt;
&lt;LI&gt;Now we can add a Workflow to our project and to drop the OutlookTaskActivity on the designer surface. It will look like this:&lt;BR&gt;&lt;BR&gt;&lt;IMG src="/images/geekswithblogs_net/marcel/3862/o_WWF-outlook-workflow-design.PNG"&gt;&lt;BR&gt;
&lt;LI&gt;Set the task Subject property in VS designer (see above) and we are ready to run the Workflow. 
&lt;LI&gt;Let's run the Workflow:&lt;BR&gt;&lt;BR&gt;&lt;PRE style="BORDER-RIGHT: gray 1px solid; BORDER-TOP: gray 1px solid; BORDER-LEFT: gray 1px solid; BORDER-BOTTOM: gray 1px solid"&gt;&lt;SPAN style="COLOR: teal"&gt;WorkflowRuntime&lt;/SPAN&gt; workflowRuntime = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: teal"&gt;WorkflowRuntime&lt;/SPAN&gt;();
workflowRuntime.StartRuntime();
workflowRuntime.StartWorkflow(&lt;SPAN style="COLOR: blue"&gt;typeof&lt;/SPAN&gt;(&lt;SPAN style="COLOR: teal"&gt;OutlookWorkflow&lt;/SPAN&gt;));
&lt;/PRE&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;As a result of the above steps we receive an outlook task created from workflow. As you can see such things can be achieved in WWF easily (I believe it is very important to easily extend any workflow).&lt;/P&gt;
&lt;P&gt;Next time I will show you how to create another&amp;nbsp;activity that waits for the Outlook task to be completed and continues the workflow.&lt;/P&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=68739"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=68739" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/marcel/aggbug/68739.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Marcin Celej</dc:creator>
            <guid>http://geekswithblogs.net/marcel/archive/2006/02/08/68739.aspx</guid>
            <pubDate>Thu, 09 Feb 2006 07:16:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/marcel/comments/68739.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/marcel/archive/2006/02/08/68739.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/marcel/comments/commentRss/68739.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/marcel/services/trackbacks/68739.aspx</trackback:ping>
        </item>
    </channel>
</rss>