Index: workflow.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/workflow/workflow.module,v
retrieving revision 1.84
diff -u -r1.84 workflow.module
--- workflow.module	24 Sep 2009 23:02:50 -0000	1.84
+++ workflow.module	28 Oct 2009 14:41:27 -0000
@@ -501,6 +501,10 @@
       _workflow_write_history($node, $sid, $comment);
     }
     $result = module_invoke_all('workflow', 'transition post', $old_sid, $sid, $node);
+    // Rules integration
+    if (module_exists('rules')) {
+      rules_invoke_event('workflow_comment_added', $node, $old_sid, $sid);
+    }
     return;
   }
 
@@ -547,6 +551,11 @@
 
   // Clear any references in the scheduled listing.
   db_query('DELETE FROM {workflow_scheduled_transition} WHERE nid = %d', $node->nid);
+  
+  // Rules integration
+  if (module_exists('rules')) {
+    rules_invoke_event('workflow_state_changed', $node, $old_sid, $sid);
+  }
 }
 
 /**
Index: workflow.rules_forms.inc
===================================================================
RCS file: workflow.rules_forms.inc
diff -N workflow.rules_forms.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ workflow.rules_forms.inc	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,64 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Contains configuration forms for workflow rules integration.
+ */
+
+/**
+ * Configuration form for check transition condition.
+ */
+function workflow_check_transition_form($settings, &$form) {
+  $options = array();
+  $options['ANY'] = t('Any state');
+  foreach (workflow_get_all() as $wid => $workflow) {
+    $options[$workflow] = array();
+    foreach (workflow_get_states($wid) as $sid => $state) {
+      $options[$workflow][$sid] = $state;
+    }
+  }
+  $form['settings']['from_state'] = array(
+    '#type' => 'select',
+    '#title' => t('From State'),
+    '#options' => $options,
+    '#multiple'=> TRUE,
+    '#default_value' => isset($settings['from_state']) ? $settings['from_state'] : array(),
+    '#required' => TRUE,
+  );
+  $form['settings']['to_state'] = array(
+    '#type' => 'select',
+    '#title' => t('To State'),
+    '#options' => $options,
+    '#multiple'=> TRUE,
+    '#default_value' => isset($settings['to_state']) ? $settings['to_state'] : array(),
+    '#required' => TRUE,
+  );
+}
+
+/**
+ * Label callback for check transition condition.
+ */
+function workflow_check_transition_label($settings, $argument_labels) {
+    if (in_array('ANY', $settings['from_state'])) $settings['from_state'] = array('ANY');
+    if (in_array('ANY', $settings['to_state'])) $settings['to_state'] = array('ANY');
+    $from = array();
+    $to = array();
+   foreach ($settings['from_state'] as $state) {
+    if ($state != 'ANY') {
+        $fromtemp = workflow_get_state($state);
+        $from[] = $fromtemp['state']; 
+    } else {
+        $from[] = t('Any state');
+    }
+  }
+  foreach ($settings['to_state'] as $state) {
+    if ($state != 'ANY') {
+        $totemp = workflow_get_state($state);
+        $to[] = $totemp['state']; 
+    } else {
+        $to[] = t('Any state');
+    }
+  }
+  return t('Check workflow transition from @from to @to', array('@from' => implode(', ',$from), '@to' => implode(', ',$to)));
+}
Index: workflow.rules.inc
===================================================================
RCS file: workflow.rules.inc
diff -N workflow.rules.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ workflow.rules.inc	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,98 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Rules integration for the Workflow module
+ */
+
+/**
+ * Implementation of hook_rules_event_info().
+ */
+function workflow_rules_event_info() {
+  $events = array(
+    'workflow_state_changed' => array(
+      'label' => t('Workflow state has changed'),
+      'module' => 'Workflow',
+      'arguments' =>  workflow_events_workflow_arguments(),
+    ),
+    'workflow_comment_added' => array(
+      'label' => t('Workflow comment was added'),
+      'module' => 'Workflow',
+      'arguments' =>  workflow_events_workflow_arguments(),
+      'description' => t('New workflow comment was added, but the workflow state did not change.'),
+    ),
+  );
+  return $events;
+}
+
+/**
+ * Returns arguments for a workflow event.
+ */
+function workflow_events_workflow_arguments() {
+  return array(
+    'node' => array('type' => 'node', 'label' => t('Updated content')),
+    'old_state' => array('type' => 'workflow_state', 'label' => t('Old workflow state')),
+    'new_state' => array('type' => 'workflow_state', 'label' => t('New workflow state')),
+    'author' => array('type' => 'user', 'label' => t('Content author'), 'handler' => 'rules_events_argument_node_author'),
+  ) + rules_events_global_user_argument();
+}
+
+/**
+ * Implementation of hook_condition_info().
+ */
+function workflow_rules_condition_info() {
+  return array(
+    'workflow_check_transition' => array(
+      'label' => t('Check workflow transition'),
+      'arguments' => array(
+        'old_state' => array('type' => 'workflow_state', 'label' => t('Old workflow state')),
+        'new_state' => array('type' => 'workflow_state', 'label' => t('New workflow state')),
+      ),
+      'help' => t('Evaluates to TRUE, if the workflow being updated is moved from state A to state B'),
+      'module' => 'Workflow',
+    ),
+  );
+}
+
+/**
+ * Condition implementation: check state transition. 
+ */
+function workflow_check_transition($old_state, $new_state, $settings) {
+  if (in_array('ANY', $settings['from_state'])) {
+    if (in_array('ANY', $settings['to_state'])) {
+      return TRUE;
+    }
+    return in_array($new_state, $settings['to_state']);
+  }
+  if (in_array('ANY', $settings['to_state'])) {
+    return in_array($old_state, $settings['from_state']);
+  }
+  return  in_array($old_state, $settings['from_state']) &&  in_array($new_state, $settings['to_state']);
+}
+
+/**
+ * Implementation of hook_rules_action_info_alter().
+ */
+function workflow_rules_action_info_alter(&$actions) {
+  $actions['rules_core_workflow_select_next_state_action']['module'] = 'Workflow';
+  $actions['rules_core_workflow_select_given_state_action']['module'] = 'Workflow';
+}
+
+/**
+ * Implementation of hook_rules_data_type_info().
+ */
+function workflow_rules_data_type_info() {
+  return array(
+    'workflow_state' => array(
+      'label' => t('Workflow state'),
+      'class' => 'rules_data_type',
+      'savable' => FALSE,
+      'identifiable' => TRUE,
+      'uses_input_form' => FALSE,
+      'token type' => FALSE, 
+      'module' => 'Workflow',
+    ),
+  );
+}
+
