/**
     * Draw a confirmation message for this action.
     * @param FORM_RENDERER $renderer
     * @access private
     */
    protected function _draw_message($renderer)
    {
        $renderer->start_row();
        ?>
<p>Are you sure you want to delete <?php 
        echo $this->object_list->description();
        ?>
?</p>
<?php 
        $renderer->finish_row();
        $buttons[] = $renderer->button_as_HTML('No', "view_explorer.php?id={$this->_folder->id}");
        $buttons[] = $renderer->submit_button_as_HTML();
        $renderer->draw_buttons_in_row($buttons);
        ?>
    <p class="info-box-bottom">
      *Deleting an object marks it as 'invisible', but does not delete the object.
      The object can always be restored in its entirety until it is purged.
      If you purge the object, it and all contained content (entries, comments, etc.)
      is removed from the database.
    </p>
<?php 
    }
Ejemplo n.º 2
0
    /**
     * @param FORM_RENDERER $renderer
     * @access private
     */
    protected function _draw_key_photo($renderer)
    {
        if ($this->object_exists()) {
            $main_picture_id = $this->value_for('main_picture_id');
            if ($main_picture_id) {
                /** @var $pic_query FOLDER_DRAFTABLE_ENTRY_QUERY */
                $pic_query = $this->_object->entry_query();
                $pic_query->set_type('picture');
                /** @var $main_picture PICTURE */
                $main_picture = $pic_query->object_at_id($main_picture_id);
            }
            $key_photo_field = $this->field_at('main_picture_id');
            $renderer->start_block($key_photo_field->caption);
            $renderer->start_row();
            if (isset($main_picture)) {
                $f = $main_picture->date->formatter();
                $f->clear_flags();
                $title = $main_picture->title_as_plain_text() . " (" . $this->_object->format_date($main_picture->date, $f) . ")";
                $image_source = $main_picture->full_thumbnail_name();
                ?>
        <p>
          <img src="<?php 
                echo $image_source;
                ?>
" alt="<?php 
                echo $title;
                ?>
">
        </p>
<?php 
            } else {
                ?>
        <p>[None]</p>
<?php 
            }
            ?>
      <p class="info-box-bottom">To change or set the key photo, select "Make Key Photo" from a picture's command menu.</p>
  <?php 
            $renderer->finish_row();
            $renderer->finish_block();
        }
    }
 /**
  * @param FORM_RENDERER $renderer
  * @access private
  */
 protected function _draw_controls($renderer)
 {
     $renderer->labels_css_class = 'top';
     $size = 0;
     if ($this->object_exists()) {
         $ids = $this->_object->subscribed_ids_for($this->_sub_type, $this->_type);
         if (!empty($ids)) {
             $query = $this->_make_query();
             $query->restrict_to_ids($ids);
             $size = $query->size();
         }
     }
     if ($size) {
         $grid = $this->_make_grid();
         $grid->set_page_size($size);
         $grid->set_query($query);
         $grid->items_are_selectable = true;
         $grid->items_are_selected = true;
         $ctrl_name = $this->js_name('ids');
         $renderer->width = '';
         $renderer->start();
         if ($size > 0) {
             $buttons[] = $renderer->javascript_button_as_HTML('Select All', "select_all ({$ctrl_name})", '{icons}buttons/select');
             $buttons[] = $renderer->javascript_button_as_HTML('Clear All', "select_none ({$ctrl_name})", '{icons}buttons/close');
             $buttons[] = $renderer->submit_button_as_HTML();
             $renderer->draw_buttons_in_row($buttons);
             $renderer->draw_error_row('ids');
         }
         $renderer->start_row();
         $grid->display();
         $renderer->finish_row();
         if ($size > 0) {
             $renderer->draw_buttons_in_row($buttons);
         }
         $renderer->finish();
     } else {
         echo '<div class="error">You are not subscribed to any ' . strtolower($this->_type_info->plural_title) . '.</div>';
     }
 }
 /**
  * @param FORM_RENDERER $renderer
  * @access private
  */
 protected function _draw_attachment_selector($renderer)
 {
     $attachments = $this->_attachments();
     if (sizeof($attachments)) {
         $props = $renderer->make_list_properties();
         $props->css_class = 'small';
         foreach ($attachments as $att) {
             $props->add_item($att->title_as_plain_text(), $att->file_name);
         }
         $attachment_control = $renderer->drop_down_as_html('attachments', $props);
         $props = $renderer->make_list_properties();
         $props->add_item('None', 'none');
         $props->add_item('Left', 'left');
         $props->add_item('Left (alone)', 'left-column');
         $props->add_item('Center', 'center');
         $props->add_item('Right', 'right');
         $props->add_item('Right (alone)', 'right-column');
         $props->css_class = 'small';
         $alignments = $renderer->drop_down_as_html('alignments', $props);
         $props = $renderer->make_list_properties();
         $props->add_item('Thumbnail', 'thumbnail');
         $props->add_item('25%', '25');
         $props->add_item('50%', '50');
         $props->add_item('75%', '75');
         $props->add_item('Full-size', '100');
         $props->css_class = 'small';
         $sizes = $renderer->drop_down_as_html('sizes', $props);
         $props = $renderer->make_list_properties();
         $props->add_item('No text', 'none');
         $props->add_item('Caption', 'caption');
         $props->add_item('Tooltip', 'tooltip');
         $props->add_item('Both', 'both');
         $props->css_class = 'small';
         $caption_modes = $renderer->drop_down_as_html('caption_modes', $props);
         $renderer->start_row('Attachments');
         echo $attachment_control;
         echo $alignments;
         echo $sizes;
         echo $caption_modes;
         echo $renderer->javascript_button_as_html('Add', 'on_insert_attachment ()');
         $renderer->finish_row();
     }
 }
Ejemplo n.º 5
0
 /**
  * @param FORM_RENDERER $renderer
  * @access private
  */
 protected function _draw_controls($renderer)
 {
     /** @var UPLOADED_FILE_SET $file_set */
     $file_set = $this->value_for('upload_file');
     /** @var ALBUM $folder */
     $folder = $this->_folder;
     $upload_allowed = $folder->uploads_allowed();
     $upload_found = isset($file_set) && $file_set->is_valid();
     $is_uploading = $this->value_for('use_upload');
     $this->set_enabled('file_name', !$is_uploading);
     $this->set_enabled('overwrite', $is_uploading);
     $this->set_enabled('upload_file', $is_uploading);
     if (!$upload_allowed || $upload_found) {
         $renderer->draw_hidden('use_upload');
     }
     if ($upload_found) {
         $renderer->draw_hidden('overwrite');
     }
     $renderer->start();
     $renderer->draw_text_line_row('title');
     if (!$this->object_exists()) {
         $renderer->start_block('Day');
         $props = $renderer->make_list_properties();
         $props->on_click_script = 'on_date_changed (this)';
         if (isset($this->_exif_date)) {
             $caption = 'Use <span class="field">' . $this->_exif_date->format() . '</span> (snapshot date)';
         } else {
             $caption = 'Use date stored by a digital camera';
         }
         $props->add_item($caption, 1);
         $props->add_item('Use the date below', 0);
         $renderer->start_row();
         echo $renderer->radio_group_as_html('read_exif', $props);
         $renderer->finish_row();
         $renderer->draw_date_row('day');
         $renderer->draw_error_row('read_exif');
         $renderer->draw_error_row('day');
         $renderer->finish_block();
     } else {
         $renderer->draw_date_row('day');
     }
     $renderer->draw_text_box_row('description', 'short-medium');
     if ($upload_allowed) {
         if (!$upload_found) {
             $options = new FORM_TEXT_CONTROL_OPTIONS();
             $renderer->start_block('Picture');
             if ($this->object_exists()) {
                 /** @var PICTURE $pic */
                 $pic = $this->_object;
                 echo '<img class="pullquote right align-right" src="' . $pic->full_thumbnail_name() . '" alt="Picture">';
             }
             $props = $renderer->make_list_properties();
             $props->on_click_script = 'file_option_changed (this)';
             $props->add_item($this->app->resolve_icon_as_html('{icons}buttons/upload', Sixteen_px, 'Upload') . ' Upload the picture below', 1);
             $renderer->start_row();
             echo $renderer->radio_group_as_html('use_upload', $props);
             $renderer->finish_row();
             $renderer->start_row();
             $options->on_change_script = 'upload_file_changed (this)';
             echo $renderer->file_as_html('upload_file', $options);
             echo $renderer->check_box_as_html('overwrite');
             $renderer->finish_row();
             $renderer->draw_error_row('upload_file');
             $props->clear_items();
             $props->add_item('Show the picture from the URL below', 0);
             $renderer->start_row();
             echo $renderer->radio_group_as_html('use_upload', $props);
             $renderer->finish_row();
             $renderer->start_row();
             $options->on_change_script = 'file_name_changed (this)';
             echo $renderer->text_line_as_html('file_name', $options);
             $renderer->finish_row();
             $renderer->draw_error_row('file_name');
             $this->_draw_thumbnail_options($renderer, '');
             $renderer->finish_block();
         } else {
             $renderer->draw_file_row('upload_file');
             $this->_draw_thumbnail_options($renderer, ' ');
         }
     } else {
         $renderer->start_row();
         if ($this->object_exists()) {
             /** @var PICTURE $pic */
             $pic = $this->_object;
             echo '<img class="pullquote right align-right" src="' . $pic->full_thumbnail_name() . '" alt="Picture">';
         }
         $renderer->finish_row();
         $renderer->draw_text_line_row('file_name');
         $this->_draw_thumbnail_options($renderer, ' ');
     }
     $renderer->draw_check_box_row('is_visible');
     $renderer->draw_submit_button_row();
     $this->_draw_history_item_controls($renderer);
     $renderer->finish();
 }
Ejemplo n.º 6
0
 /**
  * Draw the controls for the form.
  * @param FORM_RENDERER $renderer
  * @access private
  */
 protected function _draw_controls($renderer)
 {
     $renderer->default_control_height = '75px';
     $renderer->start();
     $props = $renderer->make_list_properties();
     $props->add_item('bool1', 1);
     $props->add_item('bool2', 1);
     $props->items_per_row = 4;
     $renderer->draw_check_boxes_row('Options', $props);
     $renderer->start_row('Text', 'text-line');
     $text_props = new FORM_TEXT_CONTROL_OPTIONS();
     $text_props->css_class = 'small';
     echo $renderer->date_as_html('date');
     echo ' ';
     echo $renderer->text_line_as_html('name', $text_props);
     $renderer->finish_row();
     $renderer->draw_text_box_row('description');
     $renderer->start_block('');
     $props = $renderer->make_list_properties();
     $props->show_descriptions = true;
     $props->css_class = 'small';
     $props->add_item('Option One', 0, 'Description for option one.');
     $props->add_item('Option Two', 1, 'Description for option two.');
     $renderer->draw_radio_group_row('select', $props);
     $field = $this->field_at('select');
     $renderer->start_row('Menus', 'text-line');
     echo $renderer->drop_down_as_html('select', $props);
     echo ' ';
     $field->required = true;
     echo $renderer->drop_down_as_html('select', $props);
     $renderer->finish_row();
     $renderer->start_row('Lists');
     $field->required = false;
     echo $renderer->list_box_as_html('select', $props);
     echo ' ';
     $field->required = true;
     echo $renderer->list_box_as_html('select', $props);
     $renderer->finish_row();
     $renderer->finish_block();
     $renderer->draw_submit_button_row();
     $renderer->finish();
 }
Ejemplo n.º 7
0
    /**
     * @param FORM_RENDERER $renderer
     * @access private
     */
    protected function _draw_controls($renderer)
    {
        $renderer->labels_css_class = 'top';
        $renderer->start();
        $renderer->start_row();
        ?>
  <p>Are you sure you want to delete <?php 
        if ($this->show_object_as_link) {
            echo $this->_object->title_as_link();
        } else {
            echo $this->_object->title_as_html();
        }
        ?>
?</p>
<?php 
        $renderer->finish_row();
        $buttons[] = $renderer->button_as_HTML('No', $this->_object->home_page());
        $buttons[] = $renderer->submit_button_as_HTML();
        $renderer->draw_buttons_in_row($buttons);
        $renderer->finish();
    }
 /**
  * @param FORM_RENDERER $renderer
  * @access private
  */
 protected function _draw_controls($renderer)
 {
     $renderer->labels_css_class = 'top';
     if ($this->object_exists()) {
         $selected_folder_ids = $this->_object->subscribed_ids_for(Subscribe_folder);
     }
     $user = $this->_object->user();
     // Try to get the user associated with this subscriber
     if (!isset($user)) {
         $user = $this->app->anon_user();
     }
     $folder_query = $user->folder_query();
     $folders = $folder_query->tree($this->app->root_folder_id);
     $selected_folders = $folder_query->objects_at_ids($selected_folder_ids);
     /* Make a copy (not a reference). */
     $tree = $this->app->make_tree_renderer();
     include_once 'webcore/gui/folder_tree_node_info.php';
     $tree_node_info = new FOLDER_TREE_NODE_INFO($this->app);
     $tree_node_info->nodes_are_links = false;
     include_once 'webcore/gui/selector_tree_decorator.php';
     $decorator = new MULTI_SELECTOR_TREE_DECORATOR($tree, $selected_folder_ids);
     $decorator->control_name = 'ids';
     $decorator->form_name = $this->name;
     $decorator->auto_toggle_children = true;
     $tree->node_info = $tree_node_info;
     $tree->decorator = $decorator;
     $tree->set_visible_nodes($selected_folders);
     $ctrl_name = $this->js_name('ids');
     $renderer->start();
     if (sizeof($folders) > 0) {
         $buttons[] = $renderer->javascript_button_as_HTML('Select All', "select_all ({$ctrl_name})", '{icons}buttons/select');
         $buttons[] = $renderer->javascript_button_as_HTML('Clear All', "select_none ({$ctrl_name})", '{icons}buttons/close');
         $renderer->start_row();
         $renderer->draw_buttons($buttons);
         $renderer->finish_row();
         $renderer->draw_error_row('ids');
     }
     $renderer->start_row();
     $tree->display($folders);
     $renderer->finish_row();
     $renderer->draw_submit_button_row();
     $renderer->finish();
 }
 /**
  * @param FORM_RENDERER $renderer
  * @access private
  */
 protected function _draw_controls($renderer)
 {
     $query = $this->_folder->subscriber_query();
     $renderer->labels_css_class = 'top';
     $renderer->start();
     $folder_type_info = $this->app->type_info_for('FOLDER');
     $renderer->draw_text_row('', 'The following emails will be notified when changes are made to this ' . $folder_type_info->singular_title . '.');
     $class_name = $this->app->final_class_name('SUBSCRIBER_GRID', 'webcore/gui/subscriber_grid.php');
     /** @var $grid SUBSCRIBER_GRID */
     $grid = new $class_name($this->app, $this);
     $num_rows = max($query->size(), 1);
     $grid->set_page_size($num_rows);
     $grid->set_query($query);
     $renderer->start_row();
     $grid->display();
     $renderer->finish_row();
     if ($query->size() > 0) {
         $buttons[] = $renderer->submit_button_as_HTML();
         $renderer->draw_buttons_in_row($buttons);
     }
     $renderer->finish();
 }
Ejemplo n.º 10
0
 /**
  * Allows descendents to draw options in the standard form.
  * Called from {@link _draw_controls()}.
  * @param FORM_RENDERER $renderer
  * @access private
  */
 protected function _draw_options($renderer)
 {
     if ($this->visible('remove_resources')) {
         $renderer->start_row(' ');
         echo $renderer->check_box_as_html('remove_resources');
         $renderer->finish_row();
     }
 }
 /**
  * @param FORM $form
  * @param FORM_RENDERER $renderer
  * @access private
  */
 protected function _draw_date_fields($form, $renderer)
 {
     $renderer->draw_check_box_row('not_weather_type');
     $props = $renderer->make_list_properties();
     $props->items_per_row = 7;
     $i = 0;
     $icons = $this->app->display_options->weather_icons();
     foreach ($icons as $icon) {
         $i += 1;
         $props->add_item($icon->icon_as_html(Twenty_px), $i);
     }
     $renderer->draw_check_group_row('weather_type', $props);
     $renderer->start_row(' ');
     $options = new FORM_TEXT_CONTROL_OPTIONS();
     $options->css_class = 'tiny';
     echo 'Warmer than ' . $renderer->text_line_as_html('warmer_than', $options);
     echo '&deg; and cooler than ' . $renderer->text_line_as_html('colder_than', $options) . '&deg';
     $renderer->finish_row();
     parent::_draw_date_fields($form, $renderer);
 }
Ejemplo n.º 12
0
 /**
  * @param FORM $form
  * @param FORM_RENDERER $renderer
  * @access private
  */
 protected function _draw_folder_selector($form, $renderer)
 {
     $props = $renderer->make_list_properties();
     $props->add_item('Context or none', Search_user_context_none);
     $props->add_item('Selected folder(s)', Search_user_constant);
     $props->add_item('NOT selected folder(s)', Search_user_not_constant);
     /** @var $id_values int[] */
     $id_values = $form->value_for('folder_ids');
     $selected_folder_ids = array();
     if (sizeof($id_values)) {
         foreach ($id_values as $id) {
             if ($id) {
                 $selected_folder_ids[$id] = $id;
             }
         }
     }
     $visible = $form->value_for('folder_search_type') != Search_user_context_none || sizeof($selected_folder_ids) > 0;
     $layer = $renderer->start_layer_row('folders', 'Folder(s)', 'Toggle folder options.', $visible);
     $renderer->start_row(' ');
     echo $renderer->drop_down_as_html('folder_search_type', $props);
     echo ' ';
     $renderer->finish_row();
     $renderer->start_row(' ');
     $folder_query = $this->login->folder_query();
     $folder_query->clear_results();
     $folders = $folder_query->root_tree($this->app->root_folder_id);
     $selected_folders = $folder_query->objects_at_ids($selected_folder_ids);
     /* Make a copy (not a reference). */
     $tree = $this->app->make_tree_renderer();
     include_once 'webcore/gui/folder_tree_node_info.php';
     $tree_node_info = new FOLDER_TREE_NODE_INFO($this->app);
     include_once 'webcore/gui/selector_tree_decorator.php';
     $decorator = new MULTI_SELECTOR_TREE_DECORATOR($tree, $selected_folder_ids);
     $decorator->control_name = 'folder_ids';
     $decorator->form_name = $form->name;
     $decorator->auto_toggle_children = true;
     $tree->node_info = $tree_node_info;
     $tree->decorator = $decorator;
     $tree->set_visible_nodes($selected_folders);
     $tree->display($folders);
     $renderer->finish_row();
     $renderer->finish_layer_row($layer);
 }
 /**
  * Draw the permission with icon and title.
  * Adds the icon to the title. This is done when drawn so that the icon
  * calculation is not done if the form is only being submitted.
  * @param PRIVILEGE_MAP $map Information about the privilege.
  * @param PERMISSIONS_FORMATTER $formatter Use this to get formatting information.
  * @param FORM_RENDERER $renderer
  * @param FORM_LIST_PROPERTIES $props
  * @access private
  */
 protected function _draw_tri_permission($map, $formatter, $renderer, $props)
 {
     $id = $map->id();
     $field = $this->field_at($id);
     $field->caption = $this->context->get_icon_with_text($formatter->icon_url_for($map), Sixteen_px, $formatter->title_for($map));
     $renderer->start_row();
     echo $renderer->drop_down_as_HTML($id, $props);
     echo $renderer->label_as_html($id);
     $renderer->finish_row();
 }
 /**
  * Draw a confirmation message for this action.
  * @param FORM_RENDERER $renderer
  * @access private
  */
 protected function _draw_message($renderer)
 {
     $renderer->start_row();
     $renderer->draw_text_row('', 'Are you sure you want to purge ' . $this->object_list->description() . '?*');
     if ($this->visible('remove_resources')) {
         $renderer->start_row(' ');
         echo $renderer->check_box_as_html('remove_resources');
         $renderer->finish_row();
     }
     $renderer->draw_text_row('', '*Purging an object permanently removes it and all contained content (entries, comments, etc.) from the database.', 'notes');
     $renderer->finish_row();
     $buttons[] = $renderer->button_as_HTML('No', "view_explorer.php?id={$this->_folder->id}");
     $buttons[] = $renderer->submit_button_as_HTML();
     $renderer->draw_buttons_in_row($buttons);
 }
 /**
  * Draw a confirmation message for this action.
  * @param FORM_RENDERER $renderer
  * @access private
  */
 protected function _draw_message($renderer)
 {
     if ($this->copy) {
         $renderer->draw_text_row('', 'Are you sure you want to copy ' . $this->object_list->description() . '?');
     } else {
         $renderer->draw_text_row('', 'Are you sure you want to move ' . $this->object_list->description() . '?');
     }
     if ($this->object_list->has_folders() && $this->visible('maintain_permissions')) {
         $renderer->start_row();
         echo $renderer->check_box_as_html('maintain_permissions');
         $renderer->finish_row();
     }
     if ($this->object_list->has_entries() && $this->visible('copy_as_draft')) {
         $renderer->start_row();
         echo $renderer->check_box_as_html('copy_as_draft');
         $renderer->finish_row();
     }
     /* Make a copy (not a reference). */
     $tree = $this->app->make_tree_renderer();
     include_once 'webcore/gui/folder_tree_node_info.php';
     $tree_node_info = new EXPLORER_FOLDER_TREE_NODE_INFO($this->context);
     $tree_node_info->set_visible_node($this->_folder);
     $tree_node_info->set_selected_node($this->_folder);
     $tree_node_info->nodes_are_links = false;
     include_once 'webcore/gui/selector_tree_decorator.php';
     $decorator = new SELECTOR_TREE_DECORATOR($tree);
     $decorator->control_name = 'selected_folder_id';
     $tree->node_info = $tree_node_info;
     $tree->decorator = $decorator;
     $folder_query = $this->app->login->folder_query();
     $folders = $folder_query->tree();
     $renderer->start_row('Target');
     $tree->display($folders);
     $renderer->finish_row();
     $renderer->draw_error_row('selected_folder_id');
     $buttons[] = $renderer->button_as_HTML('No', "view_explorer.php?id={$this->_folder->id}");
     $buttons[] = $renderer->submit_button_as_HTML();
     $renderer->draw_buttons_in_row($buttons);
 }
    /**
     * @param FORM_RENDERER $renderer
     * @access private
     */
    protected function _draw_controls($renderer)
    {
        $renderer->width = '65%';
        $renderer->start();
        $renderer->start_row();
        ?>
    <p>Are you sure you want to remove <?php 
        echo $this->_user->title_as_link();
        ?>
      from <?php 
        echo $this->_object->title_as_link();
        ?>
?</p>
<?php 
        $renderer->finish_row();
        $buttons[] = $renderer->button_as_HTML('No', $this->_object->home_page());
        $buttons[] = $renderer->submit_button_as_HTML();
        $renderer->draw_buttons_in_row($buttons);
        $renderer->finish();
    }
Ejemplo n.º 17
0
 /**
  * @param FORM_RENDERER $renderer
  * @access private
  */
 protected function _draw_controls($renderer)
 {
     $renderer->start();
     $renderer->draw_text_line_row('title');
     $renderer->draw_date_row('day');
     /** @var ALBUM_APPLICATION_DISPLAY_OPTIONS $album_display_options */
     $album_display_options = $this->app->display_options;
     /** @var PROPERTY_VALUE[] $icons */
     $icons = $album_display_options->weather_icons();
     if (sizeof($icons)) {
         $props = $renderer->make_list_properties();
         $props->items_per_row = 7;
         $i = 0;
         foreach ($icons as $icon) {
             $i += 1;
             $props->add_item($icon->icon_as_html(Thirty_px), $i);
         }
         $renderer->draw_radio_group_row('weather_type', $props);
     }
     $renderer->draw_text_box_row('weather');
     $options = new FORM_TEXT_CONTROL_OPTIONS();
     $options->css_class = 'tiny';
     $renderer->start_row('Temps', 'text-line');
     echo $renderer->text_line_as_html('lo_temp', $options) . '&deg;C to ';
     echo $renderer->text_line_as_html('hi_temp', $options) . '&deg;C ';
     $renderer->finish_row();
     $renderer->draw_error_row('lo_temp');
     $renderer->draw_error_row('hi_temp');
     $renderer->draw_error_row('temps');
     $renderer->draw_text_box_row('description', 'tall');
     $renderer->draw_check_box_row('is_visible');
     $renderer->draw_submit_button_row();
     $this->_draw_history_item_controls($renderer);
     $renderer->finish();
 }
Ejemplo n.º 18
0
 /**
  * @param FORM_RENDERER $renderer
  * @access private
  */
 protected function _draw_controls($renderer)
 {
     $renderer->start();
     if ($this->object_exists()) {
         /** @var ATTACHMENT $attachment */
         $attachment = $this->_object;
         $img = $attachment->icon_as_html(Thirty_two_px);
         if ($attachment->is_image) {
             $thumb = $attachment->thumbnail_as_html();
             if ($thumb) {
                 $img = $thumb;
             }
         }
         $renderer->start_row('Current file');
         echo '<div class="info-box-top"><p>' . $this->_object->original_file_name . '</p>';
         echo '<p>' . $this->_object->mime_type . ' (' . file_size_as_text($this->_object->size) . ')</p></div>';
         echo '<p>' . $img . '</p>';
         $renderer->finish_row();
         $renderer->draw_text_line_row('title');
         $renderer->draw_check_box_row('is_visible');
         $renderer->draw_text_box_row('description');
         if ($this->login->is_allowed(Privilege_set_attachment, Privilege_upload, $this->_folder)) {
             $renderer->start_block('Options');
             $renderer->draw_text_row(' ', 'Replacing the file for the attachment is optional; you can regenerate the thumbnail from the current image by clicking "Save" below.', 'notes');
             $this->_draw_file_controls($renderer);
             $renderer->finish_block();
         }
     } else {
         if ($this->login->is_allowed(Privilege_set_attachment, Privilege_upload, $this->_folder)) {
             $this->_draw_file_controls($renderer);
         }
         $renderer->draw_text_line_row('title');
         $renderer->draw_check_box_row('is_visible');
         $renderer->draw_text_box_row('description');
     }
     $renderer->draw_submit_button_row();
     $this->_draw_history_item_controls($renderer);
     $renderer->finish();
 }
 /**
  * Draw the selector's for branch properties.
  * If the branch or release is locked, the values should be displayed as read-only.
  * @param BRANCH $branch
  * @param FORM_RENDERER $renderer
  * @param boolean $visible Is this branch enabled for this project entry?
  * @param RELEASE $release Release in this branch (may be empty).
  * @access private
  */
 protected function _draw_branch_info_controls($branch, $renderer, $visible, $release)
 {
     if ($this->_branch_is_locked($branch, $release)) {
         $renderer->draw_hidden("branch_{$branch->id}_release_id");
         if (isset($release)) {
             $title = $release->title_as_link();
             if ($release->locked()) {
                 $title = $this->context->get_icon_with_text('{icons}indicators/locked', Sixteen_px, $title);
             }
             $renderer->draw_text_row('Release', $title);
         } else {
             $renderer->draw_text_row('Release', 'Not released');
         }
         $renderer->draw_error_row("branch_{$branch->id}_release_id");
     } else {
         $props = $renderer->make_list_properties();
         $props->css_class = 'medium';
         $props->add_item('[Next release]', 0);
         $release_query = $branch->pending_release_query(Release_not_locked);
         /** @var $releases RELEASE[] */
         $releases = $release_query->objects();
         $planned_release = null;
         if (sizeof($releases)) {
             foreach ($releases as $release) {
                 /** @var $nd DATE_TIME */
                 $nd = $release->time_next_deadline;
                 if ($nd->is_valid()) {
                     $df = $nd->formatter();
                     $df->set_type_and_clear_flags(Date_time_format_short_date);
                     $status = $nd->format($df);
                 } else {
                     $status = $release->state_as_string();
                 }
                 $title = $release->title_as_plain_text() . ' (' . $status . ')';
                 $props->add_item($title, $release->id);
                 if ($release->planned() && !isset($planned_release)) {
                     $planned_release = $release;
                 }
             }
         }
         if (!$this->value_for("branch_{$branch->id}_release_id")) {
             /* If the branch isn't selected or the object is new, then set the
                first planned release as the default instead of '[Next release]'. */
             if ((!$this->object_exists() || !$visible || $this->cloning()) && isset($planned_release)) {
                 $this->set_value("branch_{$branch->id}_release_id", $planned_release->id);
             }
         }
         $renderer->draw_drop_down_row("branch_{$branch->id}_release_id", $props);
     }
     $renderer->start_row(' ');
     $props = $renderer->make_list_properties();
     $props->add_item('Use for non-branch-specific lists.', $branch->id, '', $visible);
     echo $renderer->radio_group_as_html('main_branch_id', $props);
     $renderer->finish_row();
 }