Esempio n. 1
0
 /**
  * @param FORM_RENDERER $renderer
  * @access private
  */
 protected function _draw_controls($renderer)
 {
     $renderer->start();
     $renderer->draw_text_line_row('title');
     $props = $renderer->make_list_properties();
     $props->show_descriptions = true;
     if ($this->visible('is_visible')) {
         $props->add_item($this->app->get_icon_with_text('{icons}indicators/invisible', Sixteen_px, 'Hidden'), Hidden, 'Only administrators can see this branch\'s contents.');
         $props->add_item($this->app->get_icon_with_text('{icons}buttons/view', Sixteen_px, 'Visible'), Visible, 'Jobs and changes can be added and removed.');
         $props->add_item($this->app->get_icon_with_text('{icons}indicators/locked', Sixteen_px, 'Locked'), Locked, 'Cannot add or remove jobs and changes (undoable).');
     } else {
         $props->add_item($this->app->get_icon_with_text('{icons}buttons/view', Sixteen_px, 'Unlocked'), Visible, 'Jobs and changes can be added and removed.');
         $props->add_item($this->app->get_icon_with_text('{icons}indicators/locked', Sixteen_px, 'Locked'), Locked, 'Cannot add or remove jobs and changes (undoable).');
     }
     $renderer->draw_radio_group_row('state', $props);
     /** @var PROJECT $project */
     $project = $this->_folder;
     /** @var PROJECT_RELEASE_QUERY $release_query */
     $release_query = $project->release_query();
     $release_query->restrict('rel.state = ' . Locked);
     /** @var RELEASE[] $releases */
     $releases = $release_query->objects();
     $props = $renderer->make_list_properties();
     $props->css_class = 'small-medium';
     $props->add_item('[None]', 0);
     foreach ($releases as $release) {
         $branch = $release->branch();
         $props->add_item($branch->title_as_plain_text() . $this->app->display_options->object_separator . $release->title_as_plain_text(), $release->id);
     }
     $renderer->draw_drop_down_row('parent_release_id', $props);
     $renderer->draw_text_box_row('description');
     $renderer->draw_submit_button_row();
     $this->_draw_history_item_controls($renderer);
     $renderer->finish();
 }
Esempio n. 2
0
 /**
  * @param FORM_RENDERER $renderer
  * @access private
  */
 protected function _draw_controls($renderer)
 {
     $renderer->start();
     $renderer->draw_text_line_row('title');
     $renderer->draw_password_row('password1');
     $renderer->draw_password_row('password2');
     $renderer->draw_text_line_row('real_first_name');
     $renderer->draw_text_line_row('real_last_name');
     $renderer->draw_text_line_row('email');
     $props = $renderer->make_list_properties();
     $props->show_descriptions = true;
     $props->add_item('Keep private', User_email_hidden, 'Do not display this email under any circumstances. Used only for sending subscriptions.');
     $props->add_item('Show scrambled', User_email_scrambled, 'Email is displayed, but scrambled (e.g. bob [at] network [dot] com)');
     $props->add_item('Show normally', User_email_visible, 'Email is displayed normally (open to screen-scraping; not recommended)');
     $renderer->draw_radio_group_row('email_visibility', $props);
     if ($this->_captcha_enabled()) {
         $this->_draw_captcha_controls($renderer);
     }
     $renderer->draw_submit_button_row();
     $layer = $renderer->start_layer_row('other_options', 'More Options', '%s more user account options');
     $renderer->draw_text_line_row('home_page_url');
     $renderer->draw_text_line_row('picture_url');
     $renderer->draw_icon_browser_row('icon_url');
     $renderer->draw_text_box_row('signature', 'short-medium');
     $renderer->draw_text_box_row('description', 'short-medium');
     $renderer->finish_layer_row($layer);
     $this->_draw_history_item_controls($renderer);
     $renderer->finish();
 }
 /**
  * Draws controls for history item notification.
  * @param FORM_RENDERER $renderer
  * @access private
  */
 protected function _draw_history_item_controls($renderer)
 {
     $description = 'Change history is stored automatically. %s history options.';
     $layer = $renderer->start_layer_row('history', 'History', $description, false, 'full-screen-optional');
     $props = $renderer->make_list_properties();
     $props->show_descriptions = true;
     $props->add_item('Default', History_item_default, 'Let the system decide whether to send notifications for this change.');
     $props->add_item('Publish', History_item_needs_send, 'Send notifications for this change.');
     $props->add_item('Do not publish', History_item_silent, 'Do not send notifications for this change');
     $renderer->draw_radio_group_row('publication_state', $props);
     $renderer->draw_text_line_row('history_item_title');
     $renderer->draw_text_box_row('history_item_description', 'short-medium');
     $renderer->draw_submit_button_row();
     $renderer->finish_layer_row($layer);
 }
 /**
  * @param FORM_RENDERER $renderer
  * @access private
  */
 protected function _draw_controls($renderer)
 {
     $renderer->labels_css_class = 'top';
     /** @var FOLDER $folder */
     $folder = $this->_object;
     if (!$folder->defines_security()) {
         $renderer->start();
         $renderer->draw_text_row('', 'Are you sure you want to create new permissions for ' . $folder->title_as_link() . '?');
         $parent_folder = $folder->parent_folder();
         $permissions_folder = $parent_folder->permissions_folder();
         $props = $renderer->make_list_properties();
         $props->add_item('Do not create any default permissions*', Security_copy_none);
         $props->add_item('Copy current permissions from ' . $permissions_folder->title_as_link(), Security_copy_current);
         $props->add_item('Grant all permissions for user ' . $this->login->title_as_link(), Security_create_admin);
         $renderer->draw_radio_group_row('copy_mode', $props);
         $buttons[] = $renderer->button_as_HTML('No', 'view_folder_permissions.php?id=' . $this->_object->id);
         $buttons[] = $renderer->submit_button_as_HTML();
         $renderer->draw_buttons_in_row($buttons);
         $permissions = $this->login->permissions();
         if ($permissions->value_for(Privilege_set_folder, Privilege_view) != Privilege_always_granted) {
             $renderer->draw_text_row('', $this->app->get_message('*In this case, you <span class="field">will not</span> be able to see this folder.', 'warning'), 'notes');
         } else {
             $renderer->draw_text_row('', '*Your user will still be allowed to see this folder.', 'notes');
         }
         $renderer->finish();
     } else {
         $renderer->start();
         $renderer->draw_text_row('', 'Are you sure you want to remove permissions for ' . $folder->title_as_link() . '?*');
         $buttons[] = $renderer->button_as_HTML('No', 'view_folder_permissions.php?id=' . $folder->id);
         $buttons[] = $renderer->submit_button_as_HTML();
         $renderer->draw_buttons_in_row($buttons);
         $renderer->draw_text_row('', '*Doing so will revert all permissions to those used by the parent folder.', 'notes');
         $renderer->finish();
     }
 }
Esempio n. 5
0
 /**
  * @param FORM_RENDERER $renderer
  * @access private
  */
 protected function _draw_controls($renderer)
 {
     $renderer->start();
     $options = new FORM_TEXT_CONTROL_OPTIONS();
     $options->on_change_script = 'on_title_changed (this)';
     $renderer->draw_text_line_row('title', $options);
     if ($this->visible('location')) {
         $props = $renderer->make_list_properties();
         $props->show_descriptions = true;
         $props->add_item('Local', Album_location_type_local, 'Store pictures on this server under URL Root; uploading is supported.');
         $props->add_item('Remote', Album_location_type_remote, 'Retrieve pictures from another server at URL Root; uploading is <b>not</b> supported.');
         $renderer->draw_radio_group_row('location', $props);
     }
     $options->on_change_script = 'on_url_root_changed (this)';
     $renderer->draw_text_line_row('url_root', $options);
     $item = $renderer->make_check_properties();
     $item->on_click_script = 'on_url_root_enabled_changed (this)';
     $renderer->draw_check_box_row('url_root_enabled', $item);
     $options->on_change_script = null;
     $renderer->start_block('Dates');
     $props = $renderer->make_list_properties();
     $props->on_click_script = 'on_day_mode_changed (this)';
     $props->show_descriptions = true;
     $props->add_item('One day', Album_is_single_day, 'For parties or sporting events.');
     $props->add_item('Several days', Album_is_span, 'For trips; both first and last day are fixed.');
     $props->add_item('Journal', Album_is_journal, 'First day is fixed; last day is always today\'s date.');
     $props->add_item('Free-form', Album_is_adjusted, 'Calculated automatically from pictures and journals.');
     $renderer->start_row('');
     echo $renderer->radio_group_as_html('date_style', $props);
     $renderer->finish_row();
     $renderer->draw_date_row('first_day');
     $renderer->draw_date_row('last_day');
     $renderer->draw_error_row('dates');
     $renderer->finish_block();
     $renderer->start_block('Settings');
     $props = $renderer->make_list_properties();
     $props->show_descriptions = true;
     $props->add_item('is_visible', 1);
     $props->add_item('show_times', 1);
     $props->add_item('is_organizational', 1);
     $item = $renderer->make_check_properties();
     $item->title = 'constrain_picture_size';
     $options = new FORM_TEXT_CONTROL_OPTIONS();
     $options->css_class = 'tiny';
     $picture_width_control = $renderer->text_line_as_HTML('max_picture_width', $options);
     $picture_height_control = $renderer->text_line_as_HTML('max_picture_height', $options);
     $item->text = ' ' . $picture_width_control . ' x ' . $picture_height_control;
     $item->on_click_script = 'on_pic_size_constraint_changed (this)';
     $item->css_class = 'text-line';
     $props->add_item_object($item);
     $renderer->draw_check_boxes_row('', $props);
     $renderer->start_row('Temperature');
     $props = $renderer->make_list_properties();
     $props->items_per_row = 2;
     $props->add_item('Celsius', 1);
     $props->add_item('Fahrenheit', 0);
     echo $renderer->radio_group_as_HTML('show_celsius', $props);
     $renderer->finish_row();
     $renderer->finish_block();
     $this->_draw_key_photo($renderer);
     $renderer->draw_text_box_row('summary');
     $renderer->draw_text_box_row('description');
     $renderer->draw_submit_button_row();
     $this->_draw_history_item_controls($renderer);
     $renderer->finish();
 }
Esempio 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();
 }
 /**
  * Display additional email options.
  * Allow descendants to use the standard email form rendering, while still adding new mailing options.
  * @param FORM_RENDERER $renderer
  * @access private
  */
 protected function _draw_options($renderer)
 {
     if ($this->visible('send_as_html')) {
         $props = $renderer->make_list_properties();
         $props->items_per_row = 2;
         $props->add_item('HTML', 1);
         $props->add_item('Plain text', 0);
         $renderer->draw_radio_group_row('send_as_html', $props);
     }
 }
 /**
  * Hook to allow descendants to use the default form layout, but add print options.
  * @param FORM_RENDERER $renderer
  * @access private
  */
 protected function _draw_print_options($renderer)
 {
     $props = $renderer->make_list_properties();
     $props->add_item('Don\'t show comments', Print_comments_off);
     $props->add_item('Show comments threaded', Print_comments_threaded);
     $props->add_item('Show comments flat', Print_comments_flat);
     $renderer->draw_radio_group_row('show_comments', $props);
     $renderer->draw_check_box_row('show_users');
 }
 /**
  * @param FORM_RENDERER $renderer
  * @access private
  */
 protected function _draw_controls($renderer)
 {
     $renderer->start();
     $renderer->draw_text_row('', 'Are you sure you want to purge ' . $this->_object->title_as_link() . '?');
     $props = $renderer->make_list_properties();
     $props->show_descriptions = true;
     $props->add_item('Publish branch only', History_item_silent, 'Generate a single notification indicating that the branch was purged.');
     $props->add_item('Publish all', History_item_needs_send, 'Generate individual notifications for affected jobs and changes.');
     $renderer->draw_radio_group_row('sub_history_item_publication_state', $props);
     $folder = $this->_object->parent_folder();
     $component_query = $folder->component_query();
     $other_comps = $component_query->objects_at_ids($this->_object->id, true);
     $props = $renderer->make_list_properties();
     $props->add_item('[None]', 0);
     foreach ($other_comps as $comp) {
         $props->add_item($comp->title_as_plain_text(), $comp->id);
     }
     $renderer->draw_drop_down_row('replacement_component_id', $props);
     $buttons[] = $renderer->button_as_HTML('No', $this->_object->home_page());
     $buttons[] = $renderer->submit_button_as_HTML();
     $renderer->draw_buttons_in_row($buttons);
     $renderer->draw_text_row('', '*Purging an branch removes all connections to it and permanently removes it from the database.', 'notes');
     $renderer->finish();
 }
Esempio n. 10
0
 /**
  * @param FORM_RENDERER $renderer
  * @access private
  */
 protected function _draw_controls($renderer)
 {
     $renderer->start();
     $renderer->draw_text_line_row('title');
     if ($this->visible('branch_id')) {
         $props = $renderer->make_list_properties();
         $props->css_class = 'small';
         foreach ($this->_branches as $branch) {
             $props->add_item($branch->title_as_plain_text(), $branch->id);
         }
         $renderer->draw_drop_down_row('branch_id', $props);
     }
     if (!$this->object_exists() || !$this->_object->shipped()) {
         $renderer->draw_date_row('time_testing_scheduled');
         $renderer->draw_date_row('time_scheduled');
     }
     $renderer->start_block('Status');
     if (!$this->object_exists() || $this->_object->planned()) {
         $props = $renderer->make_list_properties();
         $props->show_descriptions = true;
         if ($this->visible('is_visible')) {
             $props->add_item($this->app->resolve_icon_as_html('{icons}indicators/invisible', Sixteen_px, ' ') . ' Hidden', Hidden, 'Prevent searching or browsing by non-admin users.');
         }
         $props->add_item($this->app->resolve_icon_as_html('{icons}buttons/calendar', Sixteen_px, ' ') . ' Planned', Planned, 'Release is in development.');
         $props->add_item($this->app->resolve_icon_as_html('{app_icons}statuses/working', Sixteen_px, ' ') . ' Testing', Testing, 'Release is feature-complete and in testing.');
         $renderer->draw_radio_group_row('state', $props);
     } else {
         $props = $renderer->make_list_properties();
         $props->show_descriptions = true;
         if ($this->visible('is_visible')) {
             $props->add_item($this->app->resolve_icon_as_html('{icons}indicators/invisible', Sixteen_px, ' ') . ' Hidden', Hidden, 'Prevent searching or browsing by non-admin users.');
         }
         $props->add_item($this->app->resolve_icon_as_html('{icons}buttons/ship', Sixteen_px, ' ') . ' Shipped', Shipped, 'Jobs and changes can still be added and removed.');
         $props->add_item($this->app->resolve_icon_as_html('{icons}indicators/locked', Sixteen_px, ' ') . ' Locked', Locked, 'Changes and jobs cannot be added or removed.');
         $renderer->draw_radio_group_row('state', $props);
     }
     $renderer->finish_block();
     $renderer->draw_text_box_row('summary');
     $renderer->draw_text_box_row('description');
     $renderer->draw_submit_button_row();
     $this->_draw_history_item_controls($renderer);
     $renderer->finish();
 }
Esempio n. 11
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();
 }
 /**
  * @param FORM_RENDERER $renderer
  * @access private
  */
 protected function _draw_controls($renderer)
 {
     $renderer->start();
     $renderer->draw_text_row('', 'Are you sure you want to purge ' . $this->_object->title_as_link() . '?');
     $props = $renderer->make_list_properties();
     $props->show_descriptions = true;
     $props->add_item('Publish branch only', History_item_silent, 'Generate a single notification indicating that the release was purged.');
     $props->add_item('Publish all', History_item_needs_send, 'Generate individual notifications for affected jobs and changes.');
     $renderer->draw_radio_group_row('sub_history_item_publication_state', $props);
     $buttons[] = $renderer->button_as_HTML('No', $this->_object->home_page());
     $buttons[] = $renderer->submit_button_as_HTML();
     $renderer->draw_buttons_in_row($buttons);
     $renderer->draw_text_row('', '*Purging a release removes all connections to it and permanently removes it from the database.', 'info-box-bottom');
     $renderer->finish();
 }
 /**
  * @param FORM_RENDERER $renderer
  * @access private
  */
 protected function _draw_controls($renderer)
 {
     $renderer->start();
     $renderer->draw_text_row('', 'Are you sure you want to ship ' . $this->_object->title_as_link() . '?');
     $props = $renderer->make_list_properties();
     $props->show_descriptions = true;
     $props->add_item($this->app->get_icon_with_text('{app_icons}statuses/working', Sixteen_px, 'Release to testing'), Testing, 'Feature-complete internal release.');
     $props->add_item($this->app->get_icon_with_text('{icons}buttons/ship', Sixteen_px, 'Ship'), Shipped, 'Jobs and changes can still be added and removed.');
     $props->add_item($this->app->get_icon_with_text('{icons}indicators/locked', Sixteen_px, 'Lock'), Locked, 'Changes and jobs cannot be added or removed.');
     $renderer->draw_radio_group_row('state', $props);
     $props = $renderer->make_list_properties();
     $props->show_descriptions = true;
     $props->add_item('Publish release only', History_item_silent, 'Generate a single notification indicating that the release has shipped.');
     $props->add_item('Publish all', History_item_needs_send, 'Generate individual notifications for affected jobs and changes.');
     $renderer->draw_radio_group_row('sub_history_item_publication_state', $props);
     $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->start();
     $props = $renderer->make_list_properties();
     $names = $this->_object->test_names();
     if (!empty($names)) {
         reset($names);
         do {
             $props->add_item(current($names), current($names));
         } while (next($names) !== false);
     }
     $renderer->draw_radio_group_row('test_name', $props);
     $renderer->draw_submit_button_row();
     $renderer->finish();
 }
 /**
  * @param FORM_RENDERER $renderer
  * @access private
  */
 protected function _draw_controls($renderer)
 {
     $user_query = $this->app->user_query();
     $email = $this->value_for('email');
     if (!empty($email)) {
         $user = $user_query->object_at_email($email);
     }
     if (isset($user)) {
         $field = $this->field_at('new_email');
         $field->description = 'Linked to the email address for ' . $user->title_as_link();
     }
     $renderer->start();
     $options = new FORM_TEXT_CONTROL_OPTIONS();
     $options->css_class = 'medium';
     $renderer->draw_text_line_row('new_email', $options);
     $props = $renderer->make_list_properties();
     $props->on_click_script = 'on_min_hours_to_wait (this)';
     $props->add_item('Never', Subscriptions_disabled);
     $props->add_item('Immediately', 0);
     $props->add_item('Once an hour', 1);
     $props->add_item('Twice per day', 12);
     $props->add_item('Once per day', 24);
     $props->add_item('Every 2 days', 48);
     $props->add_item('Every 3 days', 72);
     $props->add_item('Once per week', 168);
     $props->add_item('Once per month', 720);
     $renderer->draw_drop_down_row('min_hours_to_wait', $props);
     $props = $renderer->make_list_properties();
     $props->add_item('HTML', 1);
     $props->add_item('Plain text', 0);
     $renderer->draw_radio_group_row('send_as_html', $props);
     $renderer->start_block('');
     $options->css_class = 'tiny';
     $props = $renderer->make_list_properties();
     $props->on_click_script = 'on_change_text_option (this)';
     $props->add_item('Send all available text.', 0);
     // TODO add ability to send CSS class 'text-line' here
     $item = $props->add_item('Send at most ', 1, '', true, $renderer->text_line_as_HTML('preferred_text_length', $options) . ' characters.');
     $item->css_class = 'text-line';
     $renderer->draw_radio_group_row('text_options', $props);
     $renderer->draw_error_row('preferred_text_length');
     $props = $renderer->make_list_properties();
     $props->on_click_script = 'on_group_objects (this)';
     $props->add_item('One item per message.', 0);
     $item = $props->add_item('Group items if there are more than ', 1, '', true, $renderer->text_line_as_HTML('max_individual_messages', $options) . ' at once.');
     $item->css_class = 'text-line';
     $renderer->draw_radio_group_row('group_objects', $props);
     $renderer->draw_error_row('max_individual_messages');
     $props = $renderer->make_list_properties();
     $props->on_click_script = 'on_split_objects (this)';
     $props->add_item('Send only one message.', 0);
     $item = $props->add_item('Send at most ', 1, '', true, $renderer->text_line_as_HTML('max_items_per_message', $options) . ' items per message.');
     $item->css_class = 'text-line';
     $renderer->draw_radio_group_row('split_objects', $props);
     $renderer->draw_error_row('max_items_per_message');
     $check_props = $renderer->make_check_properties();
     $check_props->on_click_script = 'on_show_history_items (this)';
     $renderer->draw_check_box_row('send_own_changes');
     $renderer->draw_check_box_row('show_history_items', $check_props);
     $renderer->draw_check_box_row('group_history_items');
     $renderer->draw_check_box_row('show_history_item_as_subject');
     $renderer->finish_block();
     $renderer->draw_submit_button_row();
     $renderer->finish();
 }
 /**
  * Draws the entry {@link PROJECT_ENTRY::$kind} selector controls.
  * @param FORM_RENDERER $renderer
  * @access private
  */
 protected function _draw_kind_controls($renderer)
 {
     /** @var $display_options PROJECT_APPLICATION_DISPLAY_OPTIONS */
     $display_options = $this->app->display_options;
     $kinds = $display_options->entry_kinds();
     if (sizeof($kinds)) {
         $props = $renderer->make_list_properties();
         $index = 0;
         foreach ($kinds as $kind) {
             $props->add_item($this->app->get_icon_with_text($kind->icon, Twenty_px, $kind->title), $index);
             $index += 1;
         }
         $renderer->draw_radio_group_row('kind', $props);
     }
 }