Subversion Repositories DevTools

Rev

Rev 1295 | Blame | Compare with Previous | Last modification | View Log | RSS feed

###############################################################################
# Codestriker: Copyright (c) 2001, 2002 David Sitsky.  All rights reserved.
# sits@users.sourceforge.net
#
# This program is free software; you can redistribute it and modify it under
# the terms of the GPL.

# Action object for displaying a list of comments.

package Codestriker::Action::ViewTopicComments;

use strict;

use Codestriker::Http::Template;
use Codestriker::Http::Render;
use Codestriker::Model::Comment;
use Codestriker::Model::File;

# If the input is valid, list the appropriate comments for a topic.
sub process($$$) {
    my ($type, $http_input, $http_response) = @_;

    my $query = $http_response->get_query();

    # Check that the appropriate fields have been filled in.
    my $topicid = $http_input->get('topic');
    my $email = $http_input->get('email');
    my $mode = $http_input->get('mode');
    my $fview = $http_input->get('fview');
    my $tabwidth = $http_input->get('tabwidth');
    my $feedback = $http_input->get('feedback');
    my $show_context = $http_input->get('scontext');
    my $show_comments_from_user = $http_input->get('sauthor');
    
    # Retrieve the filter parameters from the metrics, if any.
    my %metric_filter = ();
    foreach my $comment_state_metric (@{$Codestriker::comment_state_metrics}) {
        my $name = "comment_state_metric_" . $comment_state_metric->{name};
        my $value = $http_input->get($name);
        if (defined $value && $value ne "__any__") {
            $metric_filter{$comment_state_metric->{name}} = $value;
        }
    }

    # Retrieve the comment details for this topic.
    my @comments =
        Codestriker::Model::Comment->read_filtered($topicid,
                                                   $show_comments_from_user,
                                                   \%metric_filter);

    # Retrieve the appropriate topic details.           
    my $topic = Codestriker::Model::Topic->new($topicid);     

    # Display the data, with each topic title linked to the view topic screen.
    $http_response->generate_header(topic=>$topic,
                                    comments=>\@comments,
                                    topic_title=>"Topic Comments: $topic->{title}",
                                    email=>$email, fview=>$fview,
                                    tabwidth=>$tabwidth,
                                    reload=>0, cache=>0);

    # Create the hash for the template variables.
    my $vars = {};
    $vars->{'feedback'} = $feedback;

    # Obtain a new URL builder object.
    my $url_builder = Codestriker::Http::UrlBuilder->new($query);

    Codestriker::Action::ViewTopic::ProcessTopicHeader($vars, $topic,
                                                       $url_builder);

    # Get the list of users that have put comments in against the
    # comment, and filter if needed.
    my @usersThatHaveComments =
        Codestriker::Model::Comment->read_authors($topicid);
    @usersThatHaveComments = map 
            { Codestriker->filter_email($_) } 
            @usersThatHaveComments;        
    
    # Filter the email address out, in the object.
    foreach my $comment (@comments) {
        $comment->{author} = Codestriker->filter_email($comment->{author});
    }
                                             
    # Go through all the comments and make them into an appropriate form for
    # displaying.
    my $last_filenumber = -999;
    my $last_fileline = -999;
    my $index = 0;
    for (my $i = 0; $i <= $#comments; $i++) {
        my $comment = $comments[$i];

        if ($comment->{fileline} != $last_fileline ||
            $comment->{filenumber} != $last_filenumber) {
            my $new_file =
                $url_builder->view_file_url($topicid, $comment->{filenumber},
                                            $comment->{filenew},
                                            $comment->{fileline}, $mode, 0);
                                            
            $comment->{view_file} = "javascript: myOpen('$new_file','CVS')";
            my $parallel = 
                $url_builder->view_file_url($topicid, $comment->{filenumber},
                                            $comment->{filenew},
                                            $comment->{fileline}, $mode, 1);
            $comment->{view_parallel} =
                "javascript: myOpen('$parallel','CVS')";
            $comment->{edit_url} =
                "javascript: eo('" . $comment->{filenumber} . "','" .
                $comment->{fileline} . "','" . $comment->{filenew} . "')";
            $comment->{anchor} = $comment->{filenumber} . "|" .
                $comment->{fileline} . "|" . $comment->{filenew};

            $last_fileline = $comment->{fileline};
            $last_filenumber = $comment->{filenumber};
        }

        if ($show_context ne "" && $show_context > 0 &&
            $comment->{filenumber} != -1 && $comment->{fileline} != -1) {
                my $delta = Codestriker::Model::Delta->get_delta($topicid, 
                                $comment->{filenumber}, 
                                $comment->{fileline} , 
                                $comment->{filenew});

                $comment->{context} = Codestriker::Http::Render->get_context(
                                                $comment->{fileline} , 
                                                $show_context, 1,
                                                $delta->{old_linenumber},
                                                $delta->{new_linenumber},
                                                $delta->{text}, 
                                                $comment->{filenew});
       }
    }

    # Store the parameters to the template.
    $vars->{'email'} = $email;
    $vars->{'comments'} = \@comments;
    $vars->{'users'} = \@usersThatHaveComments;
    $vars->{'tabwidth'} = $tabwidth;
    
    # Push in the current filter combo box selections so the window remembers
    # what the user has currently set.
    $vars->{'scontext'} = $show_context;
    $vars->{'sauthor'} = $http_input->get('sauthor');
    $vars->{'metrics_selection'} = \%metric_filter;

    # Store the metrics configuration into the template so it knows
    # how to render the dropdowns.
    my @metrics = ();
    foreach my $metric_config (@{ $Codestriker::comment_state_metrics }) {
        my $metric_data = {};
        $metric_data->{name} = $metric_config->{name};
        $metric_data->{values} = $metric_config->{values};
        push @metrics, $metric_data;
    }
    $vars->{'metrics'} = \@metrics;

    # Store the topic status     
    $vars->{'default_state'} = $topic->{topic_state};     
    $vars->{'topic_states'} = \@Codestriker::topic_states; 

    # Send the data to the template for rendering.
    my $template = Codestriker::Http::Template->new("viewtopiccomments");
    $template->process($vars);

    $http_response->generate_footer();

    # Fire the topic listener to indicate that the user has viewed the topic.
    Codestriker::TopicListeners::Manager::topic_viewed($email, $topic);
}

1;