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 adding a comment to a topic line.

package Codestriker::Action::EditComment;

use strict;
use Codestriker::Model::Topic;
use Codestriker::Http::Render;

# Create an appropriate form for adding a comment to a topic.
sub process($$$) {
    my ($type, $http_input, $http_response) = @_;

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

    # Retrieve the appropriate input fields.
    my $line = $http_input->get('line');
    my $fn = $http_input->get('fn');
    my $new = $http_input->get('new');
    my $topicid = $http_input->get('topic');
    my $context = $http_input->get('context');
    my $email = $http_input->get('email');
    my $mode = $http_input->get('mode');
    my $tabwidth = $http_input->get('tabwidth');
    my $anchor = $http_input->get('a');
    my $fview = $http_input->get('fview');

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

    # Retrieve the comment details for this topic.
    my @comments = $topic->read_comments();

    # Retrieve line-by-line versions of the description.
    my @document_description = split /\n/, $topic->{description};

    # Display the header of this page.
    $http_response->generate_header(topic=>$topic,
                                    topic_title=>"Edit Comment: $topic->{title}",
                                    email=>$email, 
                                    mode=>$mode,
                                    tabwidth=>$tabwidth,
                                    repository=>$Codestriker::repository_name_map->{$topic->{repository}}, 
                                    reload=>0, cache=>0);

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

    Codestriker::Action::ViewTopic::ProcessTopicHeader($vars, $topic,
                                                       $url_builder, $fview,
                                                       $tabwidth, 1, 0);

    my $view_topic_url = $url_builder->view_url($topicid, $line, $mode);
    my $view_comments_url = $url_builder->view_comments_url($topicid);
    
    $vars->{'view_topic_url'} = $view_topic_url;
    $vars->{'view_comments_url'} = $view_comments_url;
    $vars->{'doc_url'} = $url_builder->doc_url();

    # Retrieve the context in question.  Allow the user to increase it
    # or decrease it appropriately.
    my $inc_context = ($context <= 0) ? 1 : $context*2;
    my $dec_context = ($context <= 0) ? 0 : int($context/2);
    my $inc_context_url =
        $url_builder->edit_url($fn, $line, $new, $topicid,
                               $inc_context, $anchor, "");
    my $dec_context_url =
        $url_builder->edit_url($fn, $line, $new, $topicid,
                               $dec_context, $anchor, "");
    $vars->{'inc_context_url'} = $inc_context_url;
    $vars->{'dec_context_url'} = $dec_context_url;
    $vars->{'context'} = "";
    if ($line != -1) {
        # Retrieve the context for a comment made against a specific line.
        my $delta = Codestriker::Model::Delta->get_delta($topicid, $fn,
                                                         $line, $new);
        
    $vars->{'context'} =
        $query->pre(
            Codestriker::Http::Render->get_context($line, 
                                                   $context, 1,
                                                   $delta->{old_linenumber},
                                                   $delta->{new_linenumber},
                                                   $delta->{text},
                                                   $new)) .
                                                       $query->p . "\n";
    }

    # Display the comments which have been made for this line number
    # in chronological order.
    my @display_comments = ();
    for (my $i = 0; $i <= $#comments; $i++) {
        if ($comments[$i]{fileline} == $line &&
            $comments[$i]{filenumber} == $fn &&
            $comments[$i]{filenew} == $new) {
            my $display_comment = {};
            my $author = $comments[$i]{author};
            $display_comment->{author} = Codestriker->filter_email($author);
            $display_comment->{date} = $comments[$i]{date};
            $display_comment->{data} = $comments[$i]{data};
            $display_comment->{metrics} = $comments[$i]{metrics};
            $display_comment->{line} = "";
            $display_comment->{lineurl} = "";
            $display_comment->{linename} = "";
            $display_comment->{line} = "";
            $display_comment->{lineurl} = "";
            $display_comment->{linename} = "";
            push @display_comments, $display_comment;
        }
    }
    $vars->{'comments'} = \@display_comments;

    # Store the metrics associated with this comment, if any.  Store the
    # metrics configuration, in addition to the current values set for this
    # comment state, if any.
    my @metrics = ();
    my $current_metrics_for_comment;
    if ($#display_comments > -1) {
        $current_metrics_for_comment = $display_comments[0]->{metrics};
    }
    foreach my $metric_config (@{ $Codestriker::comment_state_metrics }) {
        my $metric_data = {};
        $metric_data->{name} = $metric_config->{name};
        $metric_data->{values} = $metric_config->{values};
        $metric_data->{default_value} = $metric_config->{default_value};
        $metric_data->{current_value} =
            $current_metrics_for_comment->{$metric_config->{name}};
        push @metrics, $metric_data;
    }
    $vars->{'metrics'} = \@metrics;

    # Populate the form values.
    $vars->{'line'} = $line;
    $vars->{'topic'} = $topicid;
    $vars->{'mode'} = $mode;
    $vars->{'anchor'} = $anchor;
    $vars->{'email'} = $email;
    $vars->{'fn'} = $fn;
    $vars->{'new'} = $new;

    # Add the "other" reviewers, which is all the reviewers without the
    # address set in $email.
    my @reviewers = split ', ', $topic->{reviewers};
    @reviewers = grep !/^$email$/, @reviewers;
    $vars->{'reviewers'} = \@reviewers;

    # Display the output via the template.
    my $template = Codestriker::Http::Template->new("editcomment");
    $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;