Index: feedapi_node/views/feedapi_node.views.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/feedapi/feedapi_node/views/Attic/feedapi_node.views.inc,v
retrieving revision 1.1.2.4
diff -u -r1.1.2.4 feedapi_node.views.inc
--- feedapi_node/views/feedapi_node.views.inc	23 Jan 2009 13:47:10 -0000	1.1.2.4
+++ feedapi_node/views/feedapi_node.views.inc	29 Jan 2009 18:20:36 -0000
@@ -82,6 +82,44 @@
       'handler' => 'views_handler_argument_numeric',
     ),
   );
+  
+  // Filter by parent feed title.
+  $data['node']['feed_title'] = array(
+    'title' => t('Parent Feed Title'),
+    'help' => t('The title of the parent feed.'),
+    'group' => t('FeedAPI Item'),
+    'real field' => 'title',
+    'field' => array(
+      'field' => 'title', 
+      'group' => t('FeedAPI Item'),
+      'handler' => 'views_handler_field_node',
+      'click sortable' => TRUE,
+     ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+    // Information for accepting a title as a filter
+    'filter' => array(
+      'handler' => 'feedapi_node_handler_filter_feed_title',
+    ),
+  );
 
   return $data;
 }
+
+/**
+ * Implementation of hook_views_handlers().
+ */
+function feedapi_node_views_handlers() {
+  return array(
+    'info' => array(
+      'path' => drupal_get_path('module', 'feedapi_node') . '/views/handlers',
+    ),
+    'handlers' => array(      
+      // filter handlers
+      'feedapi_node_handler_filter_feed_title' => array(
+        'parent' => 'views_handler_filter_string',
+      ),
+    ),
+  );
+}
Index: feedapi_node/views/handlers/feedapi_node_handler_filter_feed_title.inc
===================================================================
RCS file: feedapi_node/views/handlers/feedapi_node_handler_filter_feed_title.inc
diff -N feedapi_node/views/handlers/feedapi_node_handler_filter_feed_title.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ feedapi_node/views/handlers/feedapi_node_handler_filter_feed_title.inc	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,96 @@
+<?php
+// $Id$
+
+class feedapi_node_handler_filter_feed_title extends views_handler_filter_string {
+  /**
+   * Provide a select form for feed titles.
+   */
+  function value_form(&$form, &$form_state) {
+    $which = 'all';
+    if (!empty($form['operator'])) {
+      $source = ($form['operator']['#type'] == 'radios') ? 'radio:options[operator]' : 'edit-options-operator';
+    }
+    if (!empty($form_state['exposed'])) {
+      $identifier = $this->options['expose']['identifier'];
+
+      if (empty($this->options['expose']['use_operator']) || empty($this->options['expose']['operator'])) {
+        // exposed and locked.
+        $which = in_array($this->operator, $this->operator_values(1)) ? 'value' : 'none';
+      }
+      else {
+        $source = 'edit-' . form_clean_id($this->options['expose']['operator']);
+      }
+    }
+    
+    if ($which == 'all' || $which == 'value') {
+      $form['value'] = array(
+        '#type' => 'select',
+        '#title' => t('Value'),
+        '#default_value' => $this->value,
+        '#options' => feedapi_node_views_handler_get_feed_titles(),
+      );
+      if (!empty($form_state['exposed']) && !isset($form_state['input'][$identifier])) {
+        $form_state['input'][$identifier] = $this->value;
+      }
+
+      if ($which == 'all') {
+        $form['value'] += array(
+          '#process' => array('views_process_dependency'),
+          '#dependency' => array($source => $this->operator_values(1)),
+        );
+      }
+    }
+
+    if (!isset($form['value'])) {
+      // Ensure there is something in the 'value'.
+      $form['value'] = array(
+        '#type' => 'value',
+        '#value' => NULL
+      );
+    }
+  }
+  
+  function value_submit($form, &$form_state) {
+    if (!$form_state['values']['options']['expose']['optional']) {
+      if ($form_state['values']['options']['value'] == '' || $form_state['values']['options']['value'] == 'All') {
+        $list = $form['value']['#options'];
+        $first = array_shift($list);
+        if ($first === '') {
+          $first = array_shift($list);
+        }
+        $form_state['values']['options']['value'] = $first;
+        $this->options['value'] = $first;
+      }
+    }
+    else if ($form_state['values']['options']['value'] == '') {
+      $form_state['values']['options']['value'] = 'All';
+      $this->options['value'] = 'All';
+    }
+  }
+  
+  function exposed_translate(&$form, $type) {
+    if ($type == 'value' && !empty($this->options['expose']['optional']) && $form['#type'] == 'select' && empty($form['#multiple'])) {
+      $form['#options'] = array('All' => t('<Any>')) + $form['#options'];
+      $form['#default_value'] = 'All';
+    }
+    unset($form['#options']['']);
+  }
+
+}
+
+/**
+ *  Helper function for filtering by parent feed title.  Lists available parent feeds.
+ */
+function feedapi_node_views_handler_get_feed_titles() {
+  static $nodes;
+  if (!isset($nodes)) {
+    $nodes = array();
+    $result = db_query("SELECT * FROM {node} n INNER JOIN {feedapi} f ON n.nid = f.nid");
+    $nodes[''] = '';
+    while ($node = db_fetch_object($result)) {
+      $nodes[$node->title] = $node->title;
+    }
+  }
+  return $nodes;
+}
+
