src/order_gui.cpp
branchNewGRF_ports
changeset 6720 35756db7e577
parent 6719 4cc327ad39d5
child 6725 23339968083f
equal deleted inserted replaced
6719:4cc327ad39d5 6720:35756db7e577
    22 #include "depot.h"
    22 #include "depot.h"
    23 #include "waypoint.h"
    23 #include "waypoint.h"
    24 #include "train.h"
    24 #include "train.h"
    25 #include "water_map.h"
    25 #include "water_map.h"
    26 #include "vehicle_gui.h"
    26 #include "vehicle_gui.h"
       
    27 #include "timetable.h"
    27 #include "cargotype.h"
    28 #include "cargotype.h"
    28 
    29 
    29 enum OrderWindowWidgets {
    30 enum OrderWindowWidgets {
    30 	ORDER_WIDGET_CLOSEBOX = 0,
    31 	ORDER_WIDGET_CLOSEBOX = 0,
    31 	ORDER_WIDGET_CAPTION,
    32 	ORDER_WIDGET_CAPTION,
       
    33 	ORDER_WIDGET_TIMETABLE_VIEW,
    32 	ORDER_WIDGET_ORDER_LIST,
    34 	ORDER_WIDGET_ORDER_LIST,
    33 	ORDER_WIDGET_SCROLLBAR,
    35 	ORDER_WIDGET_SCROLLBAR,
    34 	ORDER_WIDGET_SKIP,
    36 	ORDER_WIDGET_SKIP,
    35 	ORDER_WIDGET_DELETE,
    37 	ORDER_WIDGET_DELETE,
    36 	ORDER_WIDGET_NON_STOP,
    38 	ORDER_WIDGET_NON_STOP,
    42 	ORDER_WIDGET_SHARED_ORDER_LIST,
    44 	ORDER_WIDGET_SHARED_ORDER_LIST,
    43 	ORDER_WIDGET_RESIZE_BAR,
    45 	ORDER_WIDGET_RESIZE_BAR,
    44 	ORDER_WIDGET_RESIZE,
    46 	ORDER_WIDGET_RESIZE,
    45 };
    47 };
    46 
    48 
       
    49 /**
       
    50  * Return the memorised selected order.
       
    51  *
       
    52  * @param w current window
       
    53  * @return the memorised order if it is a vaild one
       
    54  *  else return the number of orders
       
    55  */
    47 static int OrderGetSel(const Window *w)
    56 static int OrderGetSel(const Window *w)
    48 {
    57 {
    49 	const Vehicle *v = GetVehicle(w->window_number);
    58 	const Vehicle *v = GetVehicle(w->window_number);
    50 	int num = WP(w,order_d).sel;
    59 	int num = WP(w,order_d).sel;
    51 
    60 
    52 	return (num >= 0 && num < v->num_orders) ? num : v->num_orders;
    61 	return (num >= 0 && num < v->num_orders) ? num : v->num_orders;
       
    62 }
       
    63 
       
    64 /**
       
    65  * Calculate the selected order.
       
    66  * The calculation is based on the relative (to the window) y click position and
       
    67  *  the position of the scrollbar.
       
    68  *
       
    69  * @param w current window
       
    70  * @param y Y-value of the click relative to the window origin
       
    71  * @param v current vehicle
       
    72  * @return the new selected order if the order is valid else return that
       
    73  *  an invalid one has been selected.
       
    74  */
       
    75 static int GetOrderFromOrderWndPt(Window *w, int y, const Vehicle *v)
       
    76 {
       
    77 	/*
       
    78 	 * Calculation description:
       
    79 	 * 15 = 14 (w->widget[ORDER_WIDGET_ORDER_LIST].top) + 1 (frame-line)
       
    80 	 * 10 = order text hight
       
    81 	 */
       
    82 	int sel = (y - 15) / 10;
       
    83 
       
    84 	if ((uint)sel >= w->vscroll.cap) return INVALID_ORDER;
       
    85 
       
    86 	sel += w->vscroll.pos;
       
    87 
       
    88 	return (sel <= v->num_orders && sel >= 0) ? sel : INVALID_ORDER;
    53 }
    89 }
    54 
    90 
    55 static StringID StationOrderStrings[] = {
    91 static StringID StationOrderStrings[] = {
    56 	STR_8806_GO_TO,
    92 	STR_8806_GO_TO,
    57 	STR_8807_GO_TO_TRANSFER,
    93 	STR_8807_GO_TO_TRANSFER,
    91 
   127 
    92 	order = GetVehicleOrder(v, sel);
   128 	order = GetVehicleOrder(v, sel);
    93 
   129 
    94 	if (v->owner == _local_player) {
   130 	if (v->owner == _local_player) {
    95 		/* skip */
   131 		/* skip */
    96 		SetWindowWidgetDisabledState(w, ORDER_WIDGET_SKIP, v->num_orders == 0);
   132 		SetWindowWidgetDisabledState(w, ORDER_WIDGET_SKIP, v->num_orders <= 1);
    97 
   133 
    98 		/* delete */
   134 		/* delete */
    99 		SetWindowWidgetDisabledState(w, ORDER_WIDGET_DELETE,
   135 		SetWindowWidgetDisabledState(w, ORDER_WIDGET_DELETE,
   100 				(uint)v->num_orders + ((shared_orders || v->num_orders != 0) ? 1 : 0) <= (uint)WP(w, order_d).sel);
   136 				(uint)v->num_orders + ((shared_orders || v->num_orders != 0) ? 1 : 0) <= (uint)WP(w, order_d).sel);
   101 
   137 
   138 				DisableWindowWidget(w, ORDER_WIDGET_FULL_LOAD);
   174 				DisableWindowWidget(w, ORDER_WIDGET_FULL_LOAD);
   139 				DisableWindowWidget(w, ORDER_WIDGET_UNLOAD);
   175 				DisableWindowWidget(w, ORDER_WIDGET_UNLOAD);
   140 		}
   176 		}
   141 	}
   177 	}
   142 
   178 
   143 	SetDParam(0, v->string_id);
   179 	SetDParam(0, v->index);
   144 	SetDParam(1, v->unitnumber);
       
   145 	DrawWindowWidgets(w);
   180 	DrawWindowWidgets(w);
   146 
   181 
   147 	y = 15;
   182 	y = 15;
   148 
   183 
   149 	i = w->vscroll.pos;
   184 	i = w->vscroll.pos;
   354 		if (WP(w,order_d).sel != -1) WP(w,order_d).sel++;
   389 		if (WP(w,order_d).sel != -1) WP(w,order_d).sel++;
   355 		ResetObjectToPlace();
   390 		ResetObjectToPlace();
   356 	}
   391 	}
   357 }
   392 }
   358 
   393 
       
   394 /**
       
   395  * Handle the click on the goto button.
       
   396  *
       
   397  * @param w current window
       
   398  * @param v current vehicle
       
   399  */
   359 static void OrderClick_Goto(Window *w, const Vehicle *v)
   400 static void OrderClick_Goto(Window *w, const Vehicle *v)
   360 {
   401 {
   361 	InvalidateWidget(w, ORDER_WIDGET_GOTO);
   402 	InvalidateWidget(w, ORDER_WIDGET_GOTO);
   362 	ToggleWidgetLoweredState(w, ORDER_WIDGET_GOTO);
   403 	ToggleWidgetLoweredState(w, ORDER_WIDGET_GOTO);
   363 	if (IsWindowWidgetLowered(w, ORDER_WIDGET_GOTO)) {
   404 	if (IsWindowWidgetLowered(w, ORDER_WIDGET_GOTO)) {
   366 	} else {
   407 	} else {
   367 		ResetObjectToPlace();
   408 		ResetObjectToPlace();
   368 	}
   409 	}
   369 }
   410 }
   370 
   411 
       
   412 /**
       
   413  * Handle the click on the full load button.
       
   414  *
       
   415  * @param w current window
       
   416  * @param v current vehicle
       
   417  */
   371 static void OrderClick_FullLoad(Window *w, const Vehicle *v)
   418 static void OrderClick_FullLoad(Window *w, const Vehicle *v)
   372 {
   419 {
   373 	DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), OFB_FULL_LOAD, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   420 	DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), OFB_FULL_LOAD, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   374 }
   421 }
   375 
   422 
       
   423 /**
       
   424  * Handle the click on the unload button.
       
   425  *
       
   426  * @param w current window
       
   427  * @param v current vehicle
       
   428  */
   376 static void OrderClick_Unload(Window *w, const Vehicle *v)
   429 static void OrderClick_Unload(Window *w, const Vehicle *v)
   377 {
   430 {
   378 	DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), OFB_UNLOAD,    NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   431 	DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), OFB_UNLOAD,    NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   379 }
   432 }
   380 
   433 
       
   434 /**
       
   435  * Handle the click on the nonstop button.
       
   436  *
       
   437  * @param w current window
       
   438  * @param v current vehicle
       
   439  */
   381 static void OrderClick_Nonstop(Window *w, const Vehicle *v)
   440 static void OrderClick_Nonstop(Window *w, const Vehicle *v)
   382 {
   441 {
   383 	DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), OFB_NON_STOP,  NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   442 	DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), OFB_NON_STOP,  NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   384 }
   443 }
   385 
   444 
       
   445 /**
       
   446  * Handle the click on the transfer button.
       
   447  *
       
   448  * @param w current window
       
   449  * @param v current vehicle
       
   450  */
   386 static void OrderClick_Transfer(Window* w, const Vehicle* v)
   451 static void OrderClick_Transfer(Window* w, const Vehicle* v)
   387 {
   452 {
   388 	DoCommandP(v->tile, v->index + (OrderGetSel(w) <<  16), OFB_TRANSFER, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   453 	DoCommandP(v->tile, v->index + (OrderGetSel(w) <<  16), OFB_TRANSFER, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   389 }
   454 }
   390 
   455 
       
   456 /**
       
   457  * Handle the click on the skip button.
       
   458  * If ctrl is pressed skip to selected order.
       
   459  *  Else skip to current order + 1
       
   460  *
       
   461  * @param w current window
       
   462  * @param v current vehicle
       
   463  */
   391 static void OrderClick_Skip(Window *w, const Vehicle *v)
   464 static void OrderClick_Skip(Window *w, const Vehicle *v)
   392 {
   465 {
   393 	DoCommandP(v->tile, v->index, 0, NULL, CMD_SKIP_ORDER);
   466 	/* Don't skip when there's nothing to skip */
   394 }
   467 	if (_ctrl_pressed && v->cur_order_index == OrderGetSel(w)) return;
   395 
   468 
       
   469 	DoCommandP(v->tile, v->index, _ctrl_pressed ? OrderGetSel(w) : ((v->cur_order_index + 1) % v->num_orders),
       
   470 			NULL, CMD_SKIP_TO_ORDER | CMD_MSG(_ctrl_pressed ? STR_CAN_T_SKIP_TO_ORDER : STR_CAN_T_SKIP_ORDER));
       
   471 }
       
   472 
       
   473 /**
       
   474  * Handle the click on the unload button.
       
   475  *
       
   476  * @param w current window
       
   477  * @param v current vehicle
       
   478  */
   396 static void OrderClick_Delete(Window *w, const Vehicle *v)
   479 static void OrderClick_Delete(Window *w, const Vehicle *v)
   397 {
   480 {
   398 	DoCommandP(v->tile, v->index, OrderGetSel(w), NULL, CMD_DELETE_ORDER | CMD_MSG(STR_8834_CAN_T_DELETE_THIS_ORDER));
   481 	DoCommandP(v->tile, v->index, OrderGetSel(w), NULL, CMD_DELETE_ORDER | CMD_MSG(STR_8834_CAN_T_DELETE_THIS_ORDER));
   399 }
   482 }
   400 
   483 
       
   484 /**
       
   485  * Handle the click on the refit button.
       
   486  * If ctrl is pressed cancel refitting.
       
   487  *  Else show the refit window.
       
   488  *
       
   489  * @param w current window
       
   490  * @param v current vehicle
       
   491  */
   401 static void OrderClick_Refit(Window *w, const Vehicle *v)
   492 static void OrderClick_Refit(Window *w, const Vehicle *v)
   402 {
   493 {
   403 	if (_ctrl_pressed) {
   494 	if (_ctrl_pressed) {
   404 		/* Cancel refitting */
   495 		/* Cancel refitting */
   405 		DoCommandP(v->tile, v->index, (WP(w,order_d).sel << 16) | (CT_NO_REFIT << 8) | CT_NO_REFIT, NULL, CMD_ORDER_REFIT);
   496 		DoCommandP(v->tile, v->index, (WP(w,order_d).sel << 16) | (CT_NO_REFIT << 8) | CT_NO_REFIT, NULL, CMD_ORDER_REFIT);
   408 	}
   499 	}
   409 }
   500 }
   410 
   501 
   411 typedef void OnButtonVehClick(Window *w, const Vehicle *v);
   502 typedef void OnButtonVehClick(Window *w, const Vehicle *v);
   412 
   503 
       
   504 /**
       
   505  * Keycode function mapping.
       
   506  *
       
   507  * @see _order_keycodes[]
       
   508  * @note Keep them allways in sync with _order_keycodes[]!
       
   509  */
   413 static OnButtonVehClick* const _order_button_proc[] = {
   510 static OnButtonVehClick* const _order_button_proc[] = {
   414 	OrderClick_Skip,
   511 	OrderClick_Skip,
   415 	OrderClick_Delete,
   512 	OrderClick_Delete,
   416 	OrderClick_Nonstop,
   513 	OrderClick_Nonstop,
   417 	OrderClick_Goto,
   514 	OrderClick_Goto,
   442 				assert(w->widget[ORDER_WIDGET_REFIT].right         == w->widget[ORDER_WIDGET_UNLOAD].right);
   539 				assert(w->widget[ORDER_WIDGET_REFIT].right         == w->widget[ORDER_WIDGET_UNLOAD].right);
   443 				assert(w->widget[ORDER_WIDGET_REFIT].top           == w->widget[ORDER_WIDGET_UNLOAD].top);
   540 				assert(w->widget[ORDER_WIDGET_REFIT].top           == w->widget[ORDER_WIDGET_UNLOAD].top);
   444 				assert(w->widget[ORDER_WIDGET_REFIT].bottom        == w->widget[ORDER_WIDGET_UNLOAD].bottom);
   541 				assert(w->widget[ORDER_WIDGET_REFIT].bottom        == w->widget[ORDER_WIDGET_UNLOAD].bottom);
   445 				assert(w->widget[ORDER_WIDGET_REFIT].display_flags == w->widget[ORDER_WIDGET_UNLOAD].display_flags);
   542 				assert(w->widget[ORDER_WIDGET_REFIT].display_flags == w->widget[ORDER_WIDGET_UNLOAD].display_flags);
   446 			}
   543 			}
       
   544 
       
   545 			if (_patches.timetabling) {
       
   546 				w->widget[ORDER_WIDGET_CAPTION].right -= 61;
       
   547 			} else {
       
   548 				HideWindowWidget(w, ORDER_WIDGET_TIMETABLE_VIEW);
       
   549 			}
       
   550 
   447 			break;
   551 			break;
   448 
   552 
   449 	case WE_PAINT:
   553 	case WE_PAINT:
   450 		DrawOrdersWindow(w);
   554 		DrawOrdersWindow(w);
   451 		break;
   555 		break;
   452 
   556 
   453 	case WE_CLICK: {
   557 	case WE_CLICK: {
   454 		Vehicle *v = GetVehicle(w->window_number);
   558 		const Vehicle *v = GetVehicle(w->window_number);
   455 		switch (e->we.click.widget) {
   559 		switch (e->we.click.widget) {
   456 		case ORDER_WIDGET_ORDER_LIST: {
   560 		case ORDER_WIDGET_ORDER_LIST: {
   457 			int sel = (e->we.click.pt.y - 15) / 10;
   561 			ResetObjectToPlace();
   458 
   562 
   459 			if ((uint)sel >= w->vscroll.cap) return;
   563 			int sel = GetOrderFromOrderWndPt(w, e->we.click.pt.y, v);
   460 
   564 
   461 			sel += w->vscroll.pos;
   565 			if (sel == INVALID_ORDER) {
       
   566 				/* This was a click on an empty part of the orders window, so
       
   567 				 * deselect the currently selected order. */
       
   568 				WP(w,order_d).sel = -1;
       
   569 				SetWindowDirty(w);
       
   570 				return;
       
   571 			}
   462 
   572 
   463 			if (_ctrl_pressed && sel < v->num_orders) {
   573 			if (_ctrl_pressed && sel < v->num_orders) {
   464 				const Order *ord = GetVehicleOrder(v, sel);
   574 				const Order *ord = GetVehicleOrder(v, sel);
   465 				TileIndex xy;
   575 				TileIndex xy;
   466 
   576 
   471 					default:               xy = 0; break;
   581 					default:               xy = 0; break;
   472 				}
   582 				}
   473 
   583 
   474 				if (xy != 0) ScrollMainWindowToTile(xy);
   584 				if (xy != 0) ScrollMainWindowToTile(xy);
   475 				return;
   585 				return;
   476 			}
   586 			} else {
   477 
   587 				if (sel == WP(w,order_d).sel) {
   478 			if (sel == WP(w,order_d).sel) sel = -1;
   588 					/* Deselect clicked order */
   479 			WP(w,order_d).sel = sel;
   589 					WP(w,order_d).sel = -1;
       
   590 				} else {
       
   591 					/* Select clicked order */
       
   592 					WP(w,order_d).sel = sel;
       
   593 
       
   594 					if (v->owner == _local_player) {
       
   595 						/* Activate drag and drop */
       
   596 						SetObjectToPlaceWnd(SPR_CURSOR_MOUSE, PAL_NONE, 4, w);
       
   597 					}
       
   598 				}
       
   599 			}
       
   600 
   480 			SetWindowDirty(w);
   601 			SetWindowDirty(w);
   481 		} break;
   602 		} break;
   482 
   603 
   483 		case ORDER_WIDGET_SKIP:
   604 		case ORDER_WIDGET_SKIP:
   484 			OrderClick_Skip(w, v);
   605 			OrderClick_Skip(w, v);
   508 			break;
   629 			break;
   509 
   630 
   510 		case ORDER_WIDGET_TRANSFER:
   631 		case ORDER_WIDGET_TRANSFER:
   511 			OrderClick_Transfer(w, v);
   632 			OrderClick_Transfer(w, v);
   512 			break;
   633 			break;
       
   634 
       
   635 		case ORDER_WIDGET_TIMETABLE_VIEW:
       
   636 			ShowTimetableWindow(v);
       
   637 			break;
       
   638 
   513 		case ORDER_WIDGET_SHARED_ORDER_LIST:
   639 		case ORDER_WIDGET_SHARED_ORDER_LIST:
   514 			ShowVehicleListWindow(v);
   640 			ShowVehicleListWindow(v);
   515 			break;
   641 			break;
   516 		}
   642 		}
   517 	} break;
   643 	} break;
       
   644 
       
   645 	case WE_DRAGDROP: {
       
   646 		const Vehicle *v = GetVehicle(w->window_number);
       
   647 
       
   648 		switch (e->we.click.widget) {
       
   649 			case ORDER_WIDGET_ORDER_LIST: {
       
   650 				int from_order = OrderGetSel(w);
       
   651 				int to_order = GetOrderFromOrderWndPt(w, e->we.dragdrop.pt.y, v);
       
   652 
       
   653 				if (!(from_order == to_order || from_order == INVALID_ORDER || from_order > v->num_orders || to_order == INVALID_ORDER || to_order > v->num_orders) &&
       
   654 						DoCommandP(v->tile, v->index, from_order | (to_order << 16), NULL, CMD_MOVE_ORDER | CMD_MSG(STR_CAN_T_MOVE_THIS_ORDER))) {
       
   655 					WP(w, order_d).sel = -1;
       
   656 				}
       
   657 
       
   658 				break;
       
   659 			}
       
   660 
       
   661 			case ORDER_WIDGET_DELETE:
       
   662 				OrderClick_Delete(w, v);
       
   663 				break;
       
   664 		}
       
   665 
       
   666 		ResetObjectToPlace();
       
   667 		break;
       
   668 	}
   518 
   669 
   519 	case WE_KEYPRESS: {
   670 	case WE_KEYPRESS: {
   520 		Vehicle *v = GetVehicle(w->window_number);
   671 		Vehicle *v = GetVehicle(w->window_number);
   521 		uint i;
   672 		uint i;
   522 
   673 
   587 		}
   738 		}
   588 	} break;
   739 	} break;
   589 	}
   740 	}
   590 }
   741 }
   591 
   742 
       
   743 /**
       
   744  * Widget definition for player train orders
       
   745  */
   592 static const Widget _orders_train_widgets[] = {
   746 static const Widget _orders_train_widgets[] = {
   593 {   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,                STR_018B_CLOSE_WINDOW},
   747 	{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,                STR_018B_CLOSE_WINDOW},               // ORDER_WIDGET_CLOSEBOX
   594 {    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   398,     0,    13, STR_8829_ORDERS,         STR_018C_WINDOW_TITLE_DRAG_THIS},
   748 	{    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   398,     0,    13, STR_8829_ORDERS,         STR_018C_WINDOW_TITLE_DRAG_THIS},     // ORDER_WIDGET_CAPTION
   595 {      WWT_PANEL,   RESIZE_RB,      14,     0,   386,    14,    75, 0x0,                     STR_8852_ORDERS_LIST_CLICK_ON_ORDER},
   749 	{ WWT_PUSHTXTBTN,   RESIZE_LR,      14,   338,   398,     0,    13, STR_TIMETABLE_VIEW,      STR_TIMETABLE_VIEW_TOOLTIP},          // ORDER_WIDGET_TIMETABLE_VIEW
   596 {  WWT_SCROLLBAR,   RESIZE_LRB,     14,   387,   398,    14,    75, 0x0,                     STR_0190_SCROLL_BAR_SCROLLS_LIST},
   750 
   597 { WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,    52,    76,    87, STR_8823_SKIP,           STR_8853_SKIP_THE_CURRENT_ORDER},
   751 	{      WWT_PANEL,   RESIZE_RB,      14,     0,   386,    14,    75, 0x0,                     STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, // ORDER_WIDGET_ORDER_LIST
   598 { WWT_PUSHTXTBTN,   RESIZE_TB,      14,    53,   105,    76,    87, STR_8824_DELETE,         STR_8854_DELETE_THE_HIGHLIGHTED},
   752 
   599 { WWT_PUSHTXTBTN,   RESIZE_TB,      14,   106,   158,    76,    87, STR_8825_NON_STOP,       STR_8855_MAKE_THE_HIGHLIGHTED_ORDER},
   753 	{  WWT_SCROLLBAR,   RESIZE_LRB,     14,   387,   398,    14,    75, 0x0,                     STR_0190_SCROLL_BAR_SCROLLS_LIST},    // ORDER_WIDGET_SCROLLBAR
   600 {    WWT_TEXTBTN,   RESIZE_TB,      14,   159,   211,    76,    87, STR_8826_GO_TO,          STR_8856_INSERT_A_NEW_ORDER_BEFORE},
   754 
   601 { WWT_PUSHTXTBTN,   RESIZE_TB,      14,   212,   264,    76,    87, STR_FULLLOAD_OR_SERVICE, STR_NULL},
   755 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,    52,    76,    87, STR_8823_SKIP,           STR_8853_SKIP_THE_CURRENT_ORDER},     // ORDER_WIDGET_SKIP
   602 { WWT_PUSHTXTBTN,   RESIZE_TB,      14,   265,   319,    76,    87, STR_8828_UNLOAD,         STR_8858_MAKE_THE_HIGHLIGHTED_ORDER},
   756 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,    53,   105,    76,    87, STR_8824_DELETE,         STR_8854_DELETE_THE_HIGHLIGHTED},     // ORDER_WIDGET_DELETE
   603 { WWT_PUSHTXTBTN,   RESIZE_TB,      14,   265,   319,    76,    87, STR_REFIT,               STR_REFIT_TIP},
   757 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   106,   158,    76,    87, STR_8825_NON_STOP,       STR_8855_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_NON_STOP
   604 { WWT_PUSHTXTBTN,   RESIZE_TB,      14,   320,   372,    76,    87, STR_886F_TRANSFER,       STR_886D_MAKE_THE_HIGHLIGHTED_ORDER},
   758 	{    WWT_TEXTBTN,   RESIZE_TB,      14,   159,   211,    76,    87, STR_8826_GO_TO,          STR_8856_INSERT_A_NEW_ORDER_BEFORE},  // ORDER_WIDGET_GOTO
   605 { WWT_PUSHIMGBTN,   RESIZE_TB,      14,   373,   386,    76,    87, SPR_SHARED_ORDERS_ICON,  STR_VEH_WITH_SHARED_ORDERS_LIST_TIP},
   759 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   212,   264,    76,    87, STR_FULLLOAD_OR_SERVICE, STR_NULL},                            // ORDER_WIDGET_FULL_LOAD
   606 {      WWT_PANEL,   RESIZE_RTB,     14,   387,   386,    76,    87, 0x0,                     STR_NULL},
   760 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   265,   319,    76,    87, STR_8828_UNLOAD,         STR_8858_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_UNLOAD
   607 {  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   387,   398,    76,    87, 0x0,                     STR_RESIZE_BUTTON},
   761 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   265,   319,    76,    87, STR_REFIT,               STR_REFIT_TIP},                       // ORDER_WIDGET_REFIT
   608 {   WIDGETS_END},
   762 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   320,   372,    76,    87, STR_886F_TRANSFER,       STR_886D_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_TRANSFER
       
   763 
       
   764 	{ WWT_PUSHIMGBTN,   RESIZE_TB,      14,   373,   386,    76,    87, SPR_SHARED_ORDERS_ICON,  STR_VEH_WITH_SHARED_ORDERS_LIST_TIP}, // ORDER_WIDGET_SHARED_ORDER_LIST
       
   765 
       
   766 	{      WWT_PANEL,   RESIZE_RTB,     14,   387,   386,    76,    87, 0x0,                     STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
       
   767 
       
   768 	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   387,   398,    76,    87, 0x0,                     STR_RESIZE_BUTTON},                   // ORDER_WIDGET_RESIZE
       
   769 	{   WIDGETS_END},
   609 };
   770 };
   610 
   771 
   611 static const WindowDesc _orders_train_desc = {
   772 static const WindowDesc _orders_train_desc = {
   612 	WDP_AUTO, WDP_AUTO, 399, 88,
   773 	WDP_AUTO, WDP_AUTO, 399, 88,
   613 	WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW,
   774 	WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW,
   614 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE,
   775 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE,
   615 	_orders_train_widgets,
   776 	_orders_train_widgets,
   616 	OrdersWndProc
   777 	OrdersWndProc
   617 };
   778 };
   618 
   779 
       
   780 /**
       
   781  * Widget definition for player orders (!train)
       
   782  */
   619 static const Widget _orders_widgets[] = {
   783 static const Widget _orders_widgets[] = {
   620 {   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,                STR_018B_CLOSE_WINDOW},
   784 	{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,                STR_018B_CLOSE_WINDOW},               // ORDER_WIDGET_CLOSEBOX
   621 {    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   409,     0,    13, STR_8829_ORDERS,         STR_018C_WINDOW_TITLE_DRAG_THIS},
   785 	{    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   409,     0,    13, STR_8829_ORDERS,         STR_018C_WINDOW_TITLE_DRAG_THIS},     // ORDER_WIDGET_CAPTION
   622 {      WWT_PANEL,   RESIZE_RB,      14,     0,   397,    14,    75, 0x0,                     STR_8852_ORDERS_LIST_CLICK_ON_ORDER},
   786 	{ WWT_PUSHTXTBTN,   RESIZE_LR,      14,   349,   409,     0,    13, STR_TIMETABLE_VIEW,      STR_TIMETABLE_VIEW_TOOLTIP},          // ORDER_WIDGET_TIMETABLE_VIEW
   623 {  WWT_SCROLLBAR,   RESIZE_LRB,     14,   398,   409,    14,    75, 0x0,                     STR_0190_SCROLL_BAR_SCROLLS_LIST},
   787 
   624 { WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,    63,    76,    87, STR_8823_SKIP,           STR_8853_SKIP_THE_CURRENT_ORDER},
   788 	{      WWT_PANEL,   RESIZE_RB,      14,     0,   397,    14,    75, 0x0,                     STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, // ORDER_WIDGET_ORDER_LIST
   625 { WWT_PUSHTXTBTN,   RESIZE_TB,      14,    64,   128,    76,    87, STR_8824_DELETE,         STR_8854_DELETE_THE_HIGHLIGHTED},
   789 
   626 {      WWT_EMPTY,   RESIZE_TB,      14,     0,     0,    76,    87, 0x0,                     0x0},
   790 	{  WWT_SCROLLBAR,   RESIZE_LRB,     14,   398,   409,    14,    75, 0x0,                     STR_0190_SCROLL_BAR_SCROLLS_LIST},    // ORDER_WIDGET_SCROLLBAR
   627 {    WWT_TEXTBTN,   RESIZE_TB,      14,   129,   192,    76,    87, STR_8826_GO_TO,          STR_8856_INSERT_A_NEW_ORDER_BEFORE},
   791 
   628 { WWT_PUSHTXTBTN,   RESIZE_TB,      14,   193,   256,    76,    87, STR_FULLLOAD_OR_SERVICE, STR_NULL},
   792 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,    63,    76,    87, STR_8823_SKIP,           STR_8853_SKIP_THE_CURRENT_ORDER},     // ORDER_WIDGET_SKIP
   629 { WWT_PUSHTXTBTN,   RESIZE_TB,      14,   257,   319,    76,    87, STR_8828_UNLOAD,         STR_8858_MAKE_THE_HIGHLIGHTED_ORDER},
   793 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,    64,   128,    76,    87, STR_8824_DELETE,         STR_8854_DELETE_THE_HIGHLIGHTED},     // ORDER_WIDGET_DELETE
   630 { WWT_PUSHTXTBTN,   RESIZE_TB,      14,   257,   319,    76,    87, STR_REFIT,               STR_REFIT_TIP},
   794 	{      WWT_EMPTY,   RESIZE_TB,      14,     0,     0,    76,    87, 0x0,                     0x0},                                 // ORDER_WIDGET_NON_STOP
   631 { WWT_PUSHTXTBTN,   RESIZE_TB,      14,   320,   383,    76,    87, STR_886F_TRANSFER,       STR_886D_MAKE_THE_HIGHLIGHTED_ORDER},
   795 	{    WWT_TEXTBTN,   RESIZE_TB,      14,   129,   192,    76,    87, STR_8826_GO_TO,          STR_8856_INSERT_A_NEW_ORDER_BEFORE},  // ORDER_WIDGET_GOTO
   632 { WWT_PUSHIMGBTN,   RESIZE_TB,      14,   384,   397,    76,    87, SPR_SHARED_ORDERS_ICON,  STR_VEH_WITH_SHARED_ORDERS_LIST_TIP},
   796 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   193,   256,    76,    87, STR_FULLLOAD_OR_SERVICE, STR_NULL},                            // ORDER_WIDGET_FULL_LOAD
   633 {      WWT_PANEL,   RESIZE_RTB,     14,   397,   396,    76,    87, 0x0,                     STR_NULL},
   797 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   257,   319,    76,    87, STR_8828_UNLOAD,         STR_8858_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_UNLOAD
   634 {  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   398,   409,    76,    87, 0x0,                     STR_RESIZE_BUTTON},
   798 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   257,   319,    76,    87, STR_REFIT,               STR_REFIT_TIP},                       // ORDER_WIDGET_REFIT
   635 {   WIDGETS_END},
   799 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   320,   383,    76,    87, STR_886F_TRANSFER,       STR_886D_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_TRANSFER
       
   800 
       
   801 	{ WWT_PUSHIMGBTN,   RESIZE_TB,      14,   384,   397,    76,    87, SPR_SHARED_ORDERS_ICON,  STR_VEH_WITH_SHARED_ORDERS_LIST_TIP}, // ORDER_WIDGET_SHARED_ORDER_LIST
       
   802 
       
   803 	{      WWT_PANEL,   RESIZE_RTB,     14,   397,   396,    76,    87, 0x0,                     STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
       
   804 
       
   805 	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   398,   409,    76,    87, 0x0,                     STR_RESIZE_BUTTON},                   // ORDER_WIDGET_RESIZE
       
   806 	{   WIDGETS_END},
   636 };
   807 };
   637 
   808 
   638 static const WindowDesc _orders_desc = {
   809 static const WindowDesc _orders_desc = {
   639 	WDP_AUTO, WDP_AUTO, 410, 88,
   810 	WDP_AUTO, WDP_AUTO, 410, 88,
   640 	WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW,
   811 	WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW,
   641 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE,
   812 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE,
   642 	_orders_widgets,
   813 	_orders_widgets,
   643 	OrdersWndProc
   814 	OrdersWndProc
   644 };
   815 };
   645 
   816 
       
   817 /**
       
   818  * Widget definition for competitor orders
       
   819  */
   646 static const Widget _other_orders_widgets[] = {
   820 static const Widget _other_orders_widgets[] = {
   647 {   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,        STR_018B_CLOSE_WINDOW},
   821 	{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,           STR_018B_CLOSE_WINDOW},               // ORDER_WIDGET_CLOSEBOX
   648 {    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   331,     0,    13, STR_A00B_ORDERS, STR_018C_WINDOW_TITLE_DRAG_THIS},
   822 	{    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   331,     0,    13, STR_A00B_ORDERS,    STR_018C_WINDOW_TITLE_DRAG_THIS},     // ORDER_WIDGET_CAPTION
   649 {      WWT_PANEL,   RESIZE_RB,      14,     0,   319,    14,    75, 0x0,             STR_8852_ORDERS_LIST_CLICK_ON_ORDER},
   823 	{ WWT_PUSHTXTBTN,   RESIZE_LR,      14,   271,   331,     0,    13, STR_TIMETABLE_VIEW, STR_TIMETABLE_VIEW_TOOLTIP},          // ORDER_WIDGET_TIMETABLE_VIEW
   650 {  WWT_SCROLLBAR,   RESIZE_LRB,     14,   320,   331,    14,    75, 0x0,             STR_0190_SCROLL_BAR_SCROLLS_LIST},
   824 
   651 {      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,             STR_NULL},
   825 	{      WWT_PANEL,   RESIZE_RB,      14,     0,   319,    14,    75, 0x0,                STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, // ORDER_WIDGET_ORDER_LIST
   652 {      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,             STR_NULL},
   826 
   653 {      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,             STR_NULL},
   827 	{  WWT_SCROLLBAR,   RESIZE_LRB,     14,   320,   331,    14,    75, 0x0,                STR_0190_SCROLL_BAR_SCROLLS_LIST},    // ORDER_WIDGET_SCROLLBAR
   654 {      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,             STR_NULL},
   828 
   655 {      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,             STR_NULL},
   829 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_SKIP
   656 {      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,             STR_NULL},
   830 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_DELETE
   657 {      WWT_PANEL,   RESIZE_RTB,     14,     0,   319,    76,    87, 0x0,             STR_NULL},
   831 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_NON_STOP
   658 {  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   320,   331,    76,    87, 0x0,             STR_RESIZE_BUTTON},
   832 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_GOTO
   659 {   WIDGETS_END},
   833 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_FULL_LOAD
       
   834 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_UNLOAD
       
   835 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_REFIT
       
   836 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_TRANSFER
       
   837 
       
   838 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_SHARED_ORDER_LIST
       
   839 
       
   840 	{      WWT_PANEL,   RESIZE_RTB,     14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
       
   841 
       
   842 	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   320,   331,    76,    87, 0x0,                STR_RESIZE_BUTTON},                   // ORDER_WIDGET_RESIZE
       
   843 	{   WIDGETS_END},
   660 };
   844 };
   661 
   845 
   662 static const WindowDesc _other_orders_desc = {
   846 static const WindowDesc _other_orders_desc = {
   663 	WDP_AUTO, WDP_AUTO, 332, 88,
   847 	WDP_AUTO, WDP_AUTO, 332, 88,
   664 	WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW,
   848 	WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW,