20 #include "table/strings.h" 
   33   if (result.
Failed()) 
return;
 
   40       if (found != NULL) 
return; 
 
   47     found = found->
Last();
 
   68   for (
Train *t = 
Train::Get(selection); t != NULL; t = chain ? t->
Next() : (t->HasArticulatedPart() ? t->GetNextArticulatedPart() : NULL)) {
 
   69     dragged_width += t->GetDisplayImageWidth(NULL);
 
   72   int drag_hlight_left = rtl ? 
max(px -dragged_width, 0) : px;
 
   73   int drag_hlight_right = rtl ? px : 
min(px + dragged_width, max_width);
 
   74   int drag_hlight_width = 
max(drag_hlight_right - drag_hlight_left, 0);
 
   76   if (drag_hlight_width > 0) {
 
   81   return drag_hlight_width;
 
  103   int max_width = right - left + 1;
 
  111   int px = rtl ? max_width + skip : -skip;
 
  112   bool sel_articulated = 
false;
 
  114   bool drag_at_end_of_train = (drag_dest == v->
index); 
 
  115   for (; v != NULL && (rtl ? px > 0 : px < max_width); v = v->
Next()) {
 
  116     if (dragging && !drag_at_end_of_train && drag_dest == v->index) {
 
  119       px += rtl ? -drag_hlight_width : drag_hlight_width;
 
  125     if (rtl ? px + width > 0 : px - width < max_width) {
 
  128       v->GetImage(dir, image_type, &seq);
 
  129       seq.
Draw(px + (rtl ? -offset.x : offset.x), height / 2 + offset.y, pal, (v->vehstatus & 
VS_CRASHED) != 0);
 
  132     if (!v->IsArticulatedPart()) sel_articulated = 
false;
 
  134     if (v->index == selection) {
 
  136       highlight_l = rtl ? px - width : px;
 
  137       highlight_r = rtl ? px - 1 : px + width - 1;
 
  138       sel_articulated = 
true;
 
  139     } 
else if ((_cursor.
vehchain && highlight_r != 0) || sel_articulated) {
 
  141         highlight_l -= width;
 
  143         highlight_r += width;
 
  147     px += rtl ? -width : width;
 
  150   if (dragging && drag_at_end_of_train) {
 
  155   if (highlight_l != highlight_r) {
 
  203     str = 
FreightWagonMult(item->
cargo) > 1 ? STR_VEHICLE_DETAILS_CARGO_FROM_MULT : STR_VEHICLE_DETAILS_CARGO_FROM;
 
  206     str = item->
cargo == 
INVALID_CARGO ? STR_LTBLUE_STRING : STR_VEHICLE_DETAILS_CARGO_EMPTY;
 
  225     DrawString(left, right, y, STR_VEHICLE_DETAILS_TRAIN_WAGON_VALUE);
 
  230     DrawString(left, right, y, STR_VEHICLE_DETAILS_TRAIN_ENGINE_BUILT_AND_VALUE);
 
  250     str = 
FreightWagonMult(item->
cargo) > 1 ? STR_VEHICLE_INFO_CAPACITY_MULT : STR_VEHICLE_INFO_CAPACITY;
 
  254     str = STR_VEHICLE_INFO_NO_CAPACITY;
 
  276     if (item == summary->
End()) {
 
  282       item->
source = INVALID_STATION;
 
  321       act_cargo[v->cargo_type] += v->cargo.StoredCount();
 
  322       max_cargo[v->cargo_type] += v->cargo_cap;
 
  329       if (max_cargo[i] > 0) num++; 
 
  363   int sprite_y_offset = line_height / 2;
 
  370     int x = rtl ? right : left;
 
  371     for (; v != NULL && vscroll_pos > -vscroll_cap; v = v->
GetNextVehicle()) {
 
  381         if (vscroll_pos <= 0 && vscroll_pos > -vscroll_cap) {
 
  384           if (e->
GetGRF() != NULL) {
 
  390           seq.
Draw(px + (rtl ? -offset.x : offset.x), y - line_height * vscroll_pos + sprite_y_offset + pitch, pal, (v->
vehstatus & 
VS_CRASHED) != 0);
 
  392         px += rtl ? -width : width;
 
  398       if (separate_sprite_row) {
 
  403       uint num_lines = 
max(1u, _cargo_summary.
Length());
 
  404       for (uint i = 0; i < num_lines; i++) {
 
  406         int data_left  = left + (rtl ? 0 : sprite_width);
 
  407         int data_right = right - (rtl ? sprite_width : 0);
 
  408         if (vscroll_pos <= 0 && vscroll_pos > -vscroll_cap) {
 
  409           int py = y - line_height * vscroll_pos + text_y_offset;
 
  410           if (i > 0 || separate_sprite_row) {
 
  415               if (i < _cargo_summary.
Length()) {
 
  418                 DrawString(data_left, data_right, py, STR_QUANTITY_N_A, TC_LIGHT_BLUE);
 
  427               if (i < _cargo_summary.
Length()) {
 
  431                 DrawString(data_left, data_right, py, STR_VEHICLE_INFO_NO_CAPACITY);
 
  435             default: NOT_REACHED();
 
  444     Money feeder_share = 0;
 
  446     for (
const Vehicle *u = v; u != NULL; u = u->
Next()) {
 
  447       act_cargo[u->cargo_type] += u->cargo.StoredCount();
 
  448       max_cargo[u->cargo_type] += u->cargo_cap;
 
  449       feeder_share             += u->cargo.FeederShare();
 
  453     DrawString(left, right, y + text_y_offset, STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY_TEXT);
 
  457       if (max_cargo[i] > 0 && --vscroll_pos < 0 && vscroll_pos > -vscroll_cap) {
 
  463         DrawString(left, right, y + text_y_offset, 
FreightWagonMult(i) > 1 ? STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY_MULT : STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY);
 
  468     DrawString(left, right, y + text_y_offset, STR_VEHICLE_INFO_FEEDER_CARGO_VALUE);