src/order_gui.cpp
branchNewGRF_ports
changeset 10184 fcf5fb2548eb
parent 6878 7d1ff2f621c7
child 10192 195d7f6dcf71
equal deleted inserted replaced
10179:eec5a7dcbf61 10184:fcf5fb2548eb
     6 #include "openttd.h"
     6 #include "openttd.h"
     7 #include "road_map.h"
     7 #include "road_map.h"
     8 #include "station_map.h"
     8 #include "station_map.h"
     9 #include "gui.h"
     9 #include "gui.h"
    10 #include "window_gui.h"
    10 #include "window_gui.h"
    11 #include "station.h"
    11 #include "station_base.h"
    12 #include "town.h"
    12 #include "town.h"
    13 #include "command_func.h"
    13 #include "command_func.h"
    14 #include "viewport_func.h"
    14 #include "viewport_func.h"
    15 #include "gfx_func.h"
    15 #include "gfx_func.h"
    16 #include "depot.h"
    16 #include "depot.h"
    18 #include "train.h"
    18 #include "train.h"
    19 #include "water_map.h"
    19 #include "water_map.h"
    20 #include "vehicle_gui.h"
    20 #include "vehicle_gui.h"
    21 #include "timetable.h"
    21 #include "timetable.h"
    22 #include "cargotype.h"
    22 #include "cargotype.h"
    23 #include "order.h"
       
    24 #include "strings_func.h"
    23 #include "strings_func.h"
    25 #include "window_func.h"
    24 #include "window_func.h"
    26 #include "vehicle_func.h"
    25 #include "vehicle_func.h"
    27 #include "settings_type.h"
    26 #include "settings_type.h"
    28 #include "player_func.h"
    27 #include "player_func.h"
       
    28 #include "newgrf_cargo.h"
       
    29 #include "widgets/dropdown_func.h"
    29 
    30 
    30 #include "table/sprites.h"
    31 #include "table/sprites.h"
    31 #include "table/strings.h"
    32 #include "table/strings.h"
    32 
    33 
    33 enum OrderWindowWidgets {
    34 enum OrderWindowWidgets {
    42 	ORDER_WIDGET_GOTO,
    43 	ORDER_WIDGET_GOTO,
    43 	ORDER_WIDGET_FULL_LOAD,
    44 	ORDER_WIDGET_FULL_LOAD,
    44 	ORDER_WIDGET_UNLOAD,
    45 	ORDER_WIDGET_UNLOAD,
    45 	ORDER_WIDGET_REFIT,
    46 	ORDER_WIDGET_REFIT,
    46 	ORDER_WIDGET_TRANSFER,
    47 	ORDER_WIDGET_TRANSFER,
       
    48 	ORDER_WIDGET_SERVICE,
       
    49 	ORDER_WIDGET_RESIZE_BAR,
    47 	ORDER_WIDGET_SHARED_ORDER_LIST,
    50 	ORDER_WIDGET_SHARED_ORDER_LIST,
    48 	ORDER_WIDGET_RESIZE_BAR,
       
    49 	ORDER_WIDGET_RESIZE,
    51 	ORDER_WIDGET_RESIZE,
    50 };
    52 };
    51 
    53 
    52 /**
    54 /**
    53  * Return the memorised selected order.
    55  * Return the memorised selected order.
    89 	sel += w->vscroll.pos;
    91 	sel += w->vscroll.pos;
    90 
    92 
    91 	return (sel <= v->num_orders && sel >= 0) ? sel : INVALID_ORDER;
    93 	return (sel <= v->num_orders && sel >= 0) ? sel : INVALID_ORDER;
    92 }
    94 }
    93 
    95 
    94 static StringID StationOrderStrings[] = {
    96 /** Order load types that could be given to station orders. */
    95 	STR_8806_GO_TO,
    97 static const StringID _station_load_types[][5] = {
    96 	STR_GO_TO_TRANSFER,
    98 	{
    97 	STR_8807_GO_TO_UNLOAD,
    99 		STR_EMPTY,
    98 	STR_GO_TO_TRANSFER_UNLOAD,
   100 		STR_ORDER_UNLOAD,
    99 	STR_8808_GO_TO_LOAD,
   101 		STR_ORDER_FULL_LOAD,
   100 	STR_GO_TO_TRANSFER_LOAD,
   102 		STR_ORDER_FULL_LOAD_ANY,
   101 	STR_NULL,
   103 		STR_ORDER_NO_LOAD,
   102 	STR_NULL,
   104 	}, {
   103 	STR_880A_GO_NON_STOP_TO,
   105 		STR_ORDER_TRANSFER,
   104 	STR_GO_TO_NON_STOP_TRANSFER,
   106 		STR_ORDER_TRANSFER_UNLOAD,
   105 	STR_880B_GO_NON_STOP_TO_UNLOAD,
   107 		STR_ORDER_TRANSFER_FULL_LOAD,
   106 	STR_GO_TO_NON_STOP_TRANSFER_UNLOAD,
   108 		STR_ORDER_TRANSFER_FULL_LOAD_ANY,
   107 	STR_880C_GO_NON_STOP_TO_LOAD,
   109 		INVALID_STRING_ID,
   108 	STR_GO_TO_NON_STOP_TRANSFER_LOAD,
   110 	}
   109 	STR_NULL
       
   110 };
   111 };
   111 
   112 
   112 static void DrawOrdersWindow(Window *w)
   113 static void DrawOrdersWindow(Window *w)
   113 {
   114 {
   114 	const Vehicle *v;
   115 	const Vehicle *v = GetVehicle(w->window_number);
   115 	const Order *order;
   116 	bool shared_orders = v->IsOrderListShared();
   116 	StringID str;
       
   117 	int sel;
       
   118 	int y, i;
       
   119 	bool shared_orders;
       
   120 
       
   121 	v = GetVehicle(w->window_number);
       
   122 
       
   123 	shared_orders = v->IsOrderListShared();
       
   124 
   117 
   125 	SetVScrollCount(w, v->num_orders + 1);
   118 	SetVScrollCount(w, v->num_orders + 1);
   126 
   119 
   127 	sel = OrderGetSel(w);
   120 	int sel = OrderGetSel(w);
   128 	SetDParam(2, STR_8827_FULL_LOAD);
   121 	const Order *order = GetVehicleOrder(v, sel);
   129 
       
   130 	order = GetVehicleOrder(v, sel);
       
   131 
   122 
   132 	if (v->owner == _local_player) {
   123 	if (v->owner == _local_player) {
   133 		/* skip */
   124 		/* skip */
   134 		w->SetWidgetDisabledState(ORDER_WIDGET_SKIP, v->num_orders <= 1);
   125 		w->SetWidgetDisabledState(ORDER_WIDGET_SKIP, v->num_orders <= 1);
   135 
   126 
   143 		w->SetWidgetDisabledState(ORDER_WIDGET_UNLOAD,    order == NULL); // unload
   134 		w->SetWidgetDisabledState(ORDER_WIDGET_UNLOAD,    order == NULL); // unload
   144 		w->SetWidgetDisabledState(ORDER_WIDGET_TRANSFER,  order == NULL); // transfer
   135 		w->SetWidgetDisabledState(ORDER_WIDGET_TRANSFER,  order == NULL); // transfer
   145 		/* Disable list of vehicles with the same shared orders if there is no list */
   136 		/* Disable list of vehicles with the same shared orders if there is no list */
   146 		w->SetWidgetDisabledState(ORDER_WIDGET_SHARED_ORDER_LIST, !shared_orders || v->orders == NULL);
   137 		w->SetWidgetDisabledState(ORDER_WIDGET_SHARED_ORDER_LIST, !shared_orders || v->orders == NULL);
   147 		w->SetWidgetDisabledState(ORDER_WIDGET_REFIT,     order == NULL); // Refit
   138 		w->SetWidgetDisabledState(ORDER_WIDGET_REFIT,     order == NULL); // Refit
       
   139 		w->SetWidgetDisabledState(ORDER_WIDGET_SERVICE,   order == NULL); // Refit
   148 		w->HideWidget(ORDER_WIDGET_REFIT); // Refit
   140 		w->HideWidget(ORDER_WIDGET_REFIT); // Refit
       
   141 		w->HideWidget(ORDER_WIDGET_SERVICE); // Service
   149 	} else {
   142 	} else {
   150 		w->DisableWidget(ORDER_WIDGET_TRANSFER);
   143 		w->DisableWidget(ORDER_WIDGET_TRANSFER);
   151 	}
   144 		w->DisableWidget(ORDER_WIDGET_FULL_LOAD);
   152 
   145 	}
   153 	w->ShowWidget(ORDER_WIDGET_UNLOAD); // Unload
   146 
       
   147 	w->ShowWidget(ORDER_WIDGET_UNLOAD);
       
   148 	w->ShowWidget(ORDER_WIDGET_TRANSFER);
   154 
   149 
   155 	if (order != NULL) {
   150 	if (order != NULL) {
   156 		switch (order->type) {
   151 		switch (order->GetType()) {
   157 			case OT_GOTO_STATION:
   152 			case OT_GOTO_STATION:
   158 				if (!GetStation(order->dest)->IsBuoy()) break;
   153 				if (!GetStation(order->GetDestination())->IsBuoy()) break;
   159 				/* Fall-through */
   154 				/* Fall-through */
   160 
   155 
   161 			case OT_GOTO_WAYPOINT:
   156 			case OT_GOTO_WAYPOINT:
   162 				w->DisableWidget(ORDER_WIDGET_FULL_LOAD);
   157 				w->DisableWidget(ORDER_WIDGET_FULL_LOAD);
   163 				w->DisableWidget(ORDER_WIDGET_UNLOAD);
   158 				w->DisableWidget(ORDER_WIDGET_UNLOAD);
   164 				w->DisableWidget(ORDER_WIDGET_TRANSFER);
   159 				w->DisableWidget(ORDER_WIDGET_TRANSFER);
   165 				break;
   160 				break;
   166 
   161 
   167 			case OT_GOTO_DEPOT:
   162 			case OT_GOTO_DEPOT:
   168 				w->DisableWidget(ORDER_WIDGET_TRANSFER);
   163 				w->DisableWidget(ORDER_WIDGET_FULL_LOAD);
   169 
   164 
   170 				/* Remove unload and replace it with refit */
   165 				/* Remove unload and replace it with refit */
   171 				w->HideWidget(ORDER_WIDGET_UNLOAD);
   166 				w->HideWidget(ORDER_WIDGET_UNLOAD);
   172 				w->ShowWidget(ORDER_WIDGET_REFIT);
   167 				w->ShowWidget(ORDER_WIDGET_REFIT);
   173 				SetDParam(2,STR_SERVICE);
   168 				w->HideWidget(ORDER_WIDGET_TRANSFER);
       
   169 				w->ShowWidget(ORDER_WIDGET_SERVICE);
   174 				break;
   170 				break;
   175 
   171 
   176 			default: // every other orders
   172 			default: // every other orders
   177 				w->DisableWidget(ORDER_WIDGET_NON_STOP);
   173 				w->DisableWidget(ORDER_WIDGET_NON_STOP);
   178 				w->DisableWidget(ORDER_WIDGET_FULL_LOAD);
   174 				w->DisableWidget(ORDER_WIDGET_FULL_LOAD);
   181 	}
   177 	}
   182 
   178 
   183 	SetDParam(0, v->index);
   179 	SetDParam(0, v->index);
   184 	DrawWindowWidgets(w);
   180 	DrawWindowWidgets(w);
   185 
   181 
   186 	y = 15;
   182 	int y = 15;
   187 
   183 
   188 	i = w->vscroll.pos;
   184 	int i = w->vscroll.pos;
   189 	order = GetVehicleOrder(v, i);
   185 	order = GetVehicleOrder(v, i);
       
   186 	StringID str;
   190 	while (order != NULL) {
   187 	while (order != NULL) {
   191 		str = (v->cur_order_index == i) ? STR_8805 : STR_8804;
   188 		str = (v->cur_order_index == i) ? STR_8805 : STR_8804;
   192 		SetDParam(3, STR_EMPTY);
   189 		SetDParam(3, STR_EMPTY);
   193 
   190 
   194 		if (i - w->vscroll.pos < w->vscroll.cap) {
   191 		if (i - w->vscroll.pos < w->vscroll.cap) {
   195 			SetDParam(1, 6);
   192 			SetDParam(1, 6);
   196 
   193 
   197 			switch (order->type) {
   194 			switch (order->GetType()) {
   198 				case OT_DUMMY:
   195 				case OT_DUMMY:
   199 					SetDParam(1, STR_INVALID_ORDER);
   196 					SetDParam(1, STR_INVALID_ORDER);
   200 					SetDParam(2, order->dest);
   197 					SetDParam(2, order->GetDestination());
   201 					break;
   198 					break;
   202 
   199 
   203 				case OT_GOTO_STATION:
   200 				case OT_GOTO_STATION: {
   204 					SetDParam(1, StationOrderStrings[order->flags]);
   201 					OrderLoadFlags load = order->GetLoadType();
   205 					SetDParam(2, order->dest);
   202 					OrderUnloadFlags unload = order->GetUnloadType();
   206 					break;
   203 
       
   204 					SetDParam(1, STR_GO_TO_STATION);
       
   205 					SetDParam(2, STR_ORDER_GO_TO + (v->type == VEH_TRAIN ? order->GetNonStopType() : 0));
       
   206 					SetDParam(3, order->GetDestination());
       
   207 					/* Yes, this is ugly, but... once the savegame bump is done, it'll look a lot better! */
       
   208 					SetDParam(4, _station_load_types[unload & OUFB_TRANSFER][((load & 1) | (load >> 1)) + ((unload & ~(OUFB_NO_UNLOAD | OUFB_TRANSFER)) >> 1)]);
       
   209 				} break;
   207 
   210 
   208 				case OT_GOTO_DEPOT: {
   211 				case OT_GOTO_DEPOT: {
   209 					StringID s = STR_NULL;
   212 					StringID s = STR_NULL;
   210 
   213 
   211 					if (v->type == VEH_AIRCRAFT) {
   214 					if (v->type == VEH_AIRCRAFT) {
   212 						s = STR_GO_TO_AIRPORT_HANGAR;
   215 						s = STR_GO_TO_AIRPORT_HANGAR;
   213 						SetDParam(2, order->dest);
   216 						SetDParam(2, order->GetDestination());
   214 					} else {
   217 					} else {
   215 						SetDParam(2, GetDepot(order->dest)->town_index);
   218 						SetDParam(2, GetDepot(order->GetDestination())->town_index);
   216 
   219 
   217 						switch (v->type) {
   220 						switch (v->type) {
   218 							case VEH_TRAIN: s = (order->flags & OFB_NON_STOP) ? STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT : STR_GO_TO_TRAIN_DEPOT; break;
   221 							case VEH_TRAIN: s = (order->GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS) ? STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT : STR_GO_TO_TRAIN_DEPOT; break;
   219 							case VEH_ROAD:  s = STR_GO_TO_ROADVEH_DEPOT; break;
   222 							case VEH_ROAD:  s = STR_GO_TO_ROADVEH_DEPOT; break;
   220 							case VEH_SHIP:  s = STR_GO_TO_SHIP_DEPOT; break;
   223 							case VEH_SHIP:  s = STR_GO_TO_SHIP_DEPOT; break;
   221 							default: break;
   224 							default: break;
   222 						}
   225 						}
   223 					}
   226 					}
   224 
   227 
   225 					if (order->flags & OFB_FULL_LOAD) s++; /* service at */
   228 					if (order->GetDepotOrderType() & ODTFB_SERVICE) s++; // service at
   226 
   229 
   227 					SetDParam(1, s);
   230 					SetDParam(1, s);
   228 					if (order->refit_cargo < NUM_CARGO) {
   231 					if (order->IsRefit()) {
   229 						SetDParam(3, STR_REFIT_ORDER);
   232 						SetDParam(3, STR_REFIT_ORDER);
   230 						SetDParam(4, GetCargo(order->refit_cargo)->name);
   233 						SetDParam(4, GetCargo(order->GetRefitCargo())->name);
   231 					} else {
   234 					} else {
   232 						SetDParam(3, STR_EMPTY);
   235 						SetDParam(3, STR_EMPTY);
   233 					}
   236 					}
   234 					break;
   237 					break;
   235 				}
   238 				}
   236 
   239 
   237 				case OT_GOTO_WAYPOINT:
   240 				case OT_GOTO_WAYPOINT:
   238 					SetDParam(1, (order->flags & OFB_NON_STOP) ? STR_GO_NON_STOP_TO_WAYPOINT : STR_GO_TO_WAYPOINT);
   241 					SetDParam(1, (order->GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS) ? STR_GO_NON_STOP_TO_WAYPOINT : STR_GO_TO_WAYPOINT);
   239 					SetDParam(2, order->dest);
   242 					SetDParam(2, order->GetDestination());
   240 					break;
   243 					break;
   241 
   244 
   242 				default: break;
   245 				default: break;
   243 			}
   246 			}
   244 
   247 
   261 static Order GetOrderCmdFromTile(const Vehicle *v, TileIndex tile)
   264 static Order GetOrderCmdFromTile(const Vehicle *v, TileIndex tile)
   262 {
   265 {
   263 	Order order;
   266 	Order order;
   264 	order.next  = NULL;
   267 	order.next  = NULL;
   265 	order.index = 0;
   268 	order.index = 0;
   266 	order.refit_cargo   = CT_INVALID;
   269 
   267 	order.refit_subtype = 0;
   270 	/* check depot first */
   268 
       
   269 	// check depot first
       
   270 	if (_patches.gotodepot) {
   271 	if (_patches.gotodepot) {
   271 		switch (GetTileType(tile)) {
   272 		switch (GetTileType(tile)) {
   272 		case MP_RAILWAY:
   273 			case MP_RAILWAY:
   273 			if (v->type == VEH_TRAIN && IsTileOwner(tile, _local_player)) {
   274 				if (v->type == VEH_TRAIN && IsTileOwner(tile, _local_player)) {
   274 				if (IsRailDepot(tile)) {
   275 					if (IsRailDepot(tile)) {
   275 					order.type = OT_GOTO_DEPOT;
   276 						order.MakeGoToDepot(GetDepotByTile(tile)->index, ODTFB_PART_OF_ORDERS);
   276 					order.flags = OFB_PART_OF_ORDERS;
   277 						return order;
   277 					order.dest = GetDepotByTile(tile)->index;
   278 					}
       
   279 				}
       
   280 				break;
       
   281 
       
   282 			case MP_ROAD:
       
   283 				if (IsRoadDepot(tile) && v->type == VEH_ROAD && IsTileOwner(tile, _local_player)) {
       
   284 					order.MakeGoToDepot(GetDepotByTile(tile)->index, ODTFB_PART_OF_ORDERS);
   278 					return order;
   285 					return order;
   279 				}
   286 				}
   280 			}
   287 				break;
   281 			break;
   288 
   282 
   289 			case MP_STATION:
   283 		case MP_ROAD:
   290 				if (v->type != VEH_AIRCRAFT) break;
   284 			if (IsRoadDepot(tile) && v->type == VEH_ROAD && IsTileOwner(tile, _local_player)) {
   291 				if (IsHangar(tile) && IsTileOwner(tile, _local_player)) {
   285 				order.type = OT_GOTO_DEPOT;
   292 					order.MakeGoToDepot(GetStationIndex(tile), ODTFB_PART_OF_ORDERS);
   286 				order.flags = OFB_PART_OF_ORDERS;
   293 					return order;
   287 				order.dest = GetDepotByTile(tile)->index;
   294 				}
   288 				return order;
   295 				break;
   289 			}
   296 
   290 			break;
   297 			case MP_WATER:
   291 
   298 				if (v->type != VEH_SHIP) break;
   292 		case MP_STATION:
   299 				if (IsTileDepotType(tile, TRANSPORT_WATER) &&
   293 			if (v->type != VEH_AIRCRAFT) break;
   300 						IsTileOwner(tile, _local_player)) {
   294 			if (IsHangar(tile) && IsTileOwner(tile, _local_player)) {
   301 					TileIndex tile2 = GetOtherShipDepotTile(tile);
   295 				order.type = OT_GOTO_DEPOT;
   302 
   296 				order.flags = OFB_PART_OF_ORDERS;
   303 					order.MakeGoToDepot(GetDepotByTile(tile < tile2 ? tile : tile2)->index, ODTFB_PART_OF_ORDERS);
   297 				order.dest = GetStationIndex(tile);
   304 					return order;
   298 				return order;
   305 				}
   299 			}
       
   300 			break;
       
   301 
       
   302 		case MP_WATER:
       
   303 			if (v->type != VEH_SHIP) break;
       
   304 			if (IsTileDepotType(tile, TRANSPORT_WATER) &&
       
   305 					IsTileOwner(tile, _local_player)) {
       
   306 				TileIndex tile2 = GetOtherShipDepotTile(tile);
       
   307 
       
   308 				order.type = OT_GOTO_DEPOT;
       
   309 				order.flags = OFB_PART_OF_ORDERS;
       
   310 				order.dest = GetDepotByTile(tile < tile2 ? tile : tile2)->index;
       
   311 				return order;
       
   312 			}
       
   313 
   306 
   314 			default:
   307 			default:
   315 				break;
   308 				break;
   316 		}
   309 		}
   317 	}
   310 	}
   318 
   311 
   319 	// check waypoint
   312 	/* check waypoint */
   320 	if (IsTileType(tile, MP_RAILWAY) &&
   313 	if (IsTileType(tile, MP_RAILWAY) &&
   321 			v->type == VEH_TRAIN &&
   314 			v->type == VEH_TRAIN &&
   322 			IsTileOwner(tile, _local_player) &&
   315 			IsTileOwner(tile, _local_player) &&
   323 			IsRailWaypoint(tile)) {
   316 			IsRailWaypoint(tile)) {
   324 		order.type = OT_GOTO_WAYPOINT;
   317 		order.MakeGoToWaypoint(GetWaypointByTile(tile)->index);
   325 		order.flags = 0;
       
   326 		order.dest = GetWaypointByTile(tile)->index;
       
   327 		return order;
   318 		return order;
   328 	}
   319 	}
   329 
   320 
   330 	if (IsTileType(tile, MP_STATION)) {
   321 	if (IsTileType(tile, MP_STATION)) {
   331 		StationID st_index = GetStationIndex(tile);
   322 		StationID st_index = GetStationIndex(tile);
   332 		const Station *st = GetStation(st_index);
   323 		const Station *st = GetStation(st_index);
   333 
   324 
   334 		if (st->owner == _current_player || st->owner == OWNER_NONE) {
   325 		if (st->owner == _current_player || st->owner == OWNER_NONE) {
   335 			byte facil;
   326 			byte facil;
   336 			(facil=FACIL_DOCK, v->type == VEH_SHIP) ||
   327 			(facil = FACIL_DOCK, v->type == VEH_SHIP) ||
   337 			(facil=FACIL_TRAIN, v->type == VEH_TRAIN) ||
   328 			(facil = FACIL_TRAIN, v->type == VEH_TRAIN) ||
   338 			(facil=FACIL_AIRPORT, v->type == VEH_AIRCRAFT) ||
   329 			(facil = FACIL_AIRPORT, v->type == VEH_AIRCRAFT) ||
   339 			(facil=FACIL_BUS_STOP, v->type == VEH_ROAD && IsCargoInClass(v->cargo_type, CC_PASSENGERS)) ||
   330 			(facil = FACIL_BUS_STOP, v->type == VEH_ROAD && IsCargoInClass(v->cargo_type, CC_PASSENGERS)) ||
   340 			(facil=FACIL_TRUCK_STOP, 1);
   331 			(facil = FACIL_TRUCK_STOP, 1);
   341 			if (st->facilities & facil) {
   332 			if (st->facilities & facil) {
   342 				order.type = OT_GOTO_STATION;
   333 				order.MakeGoToStation(st_index);
   343 				order.flags = 0;
       
   344 				order.dest = st_index;
       
   345 				return order;
   334 				return order;
   346 			}
   335 			}
   347 		}
   336 		}
   348 	}
   337 	}
   349 
   338 
   350 	// not found
   339 	/* not found */
   351 	order.Free();
   340 	order.Free();
   352 	order.dest = INVALID_STATION;
       
   353 	return order;
   341 	return order;
   354 }
   342 }
   355 
   343 
   356 static bool HandleOrderVehClick(const Vehicle *v, const Vehicle *u, Window *w)
   344 static bool HandleOrderVehClick(const Vehicle *v, const Vehicle *u, Window *w)
   357 {
   345 {
   360 	if (!u->IsPrimaryVehicle()) {
   348 	if (!u->IsPrimaryVehicle()) {
   361 		u = u->First();
   349 		u = u->First();
   362 		if (!u->IsPrimaryVehicle()) return false;
   350 		if (!u->IsPrimaryVehicle()) return false;
   363 	}
   351 	}
   364 
   352 
   365 	// v is vehicle getting orders. Only copy/clone orders if vehicle doesn't have any orders yet
   353 	/* v is vehicle getting orders. Only copy/clone orders if vehicle doesn't have any orders yet
   366 	// obviously if you press CTRL on a non-empty orders vehicle you know what you are doing
   354 	 * obviously if you press CTRL on a non-empty orders vehicle you know what you are doing */
   367 	if (v->num_orders != 0 && _ctrl_pressed == 0) return false;
   355 	if (v->num_orders != 0 && _ctrl_pressed == 0) return false;
   368 
   356 
   369 	if (DoCommandP(v->tile, v->index | (u->index << 16), _ctrl_pressed ? CO_SHARE : CO_COPY, NULL,
   357 	if (DoCommandP(v->tile, v->index | (u->index << 16), _ctrl_pressed ? CO_SHARE : CO_COPY, NULL,
   370 		_ctrl_pressed ? CMD_CLONE_ORDER | CMD_MSG(STR_CANT_SHARE_ORDER_LIST) : CMD_CLONE_ORDER | CMD_MSG(STR_CANT_COPY_ORDER_LIST))) {
   358 		_ctrl_pressed ? CMD_CLONE_ORDER | CMD_MSG(STR_CANT_SHARE_ORDER_LIST) : CMD_CLONE_ORDER | CMD_MSG(STR_CANT_COPY_ORDER_LIST))) {
   371 		WP(w, order_d).sel = -1;
   359 		WP(w, order_d).sel = -1;
   375 	return true;
   363 	return true;
   376 }
   364 }
   377 
   365 
   378 static void OrdersPlaceObj(const Vehicle *v, TileIndex tile, Window *w)
   366 static void OrdersPlaceObj(const Vehicle *v, TileIndex tile, Window *w)
   379 {
   367 {
   380 	Order cmd;
   368 	/* check if we're clicking on a vehicle first.. clone orders in that case. */
   381 	const Vehicle *u;
   369 	const Vehicle *u = CheckMouseOverVehicle();
   382 
       
   383 	// check if we're clicking on a vehicle first.. clone orders in that case.
       
   384 	u = CheckMouseOverVehicle();
       
   385 	if (u != NULL && HandleOrderVehClick(v, u, w)) return;
   370 	if (u != NULL && HandleOrderVehClick(v, u, w)) return;
   386 
   371 
   387 	cmd = GetOrderCmdFromTile(v, tile);
   372 	const Order cmd = GetOrderCmdFromTile(v, tile);
   388 	if (!cmd.IsValid()) return;
   373 	if (!cmd.IsValid()) return;
   389 
   374 
   390 	if (DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), PackOrder(&cmd), NULL, CMD_INSERT_ORDER | CMD_MSG(STR_8833_CAN_T_INSERT_NEW_ORDER))) {
   375 	if (DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), cmd.Pack(), NULL, CMD_INSERT_ORDER | CMD_MSG(STR_8833_CAN_T_INSERT_NEW_ORDER))) {
   391 		if (WP(w, order_d).sel != -1) WP(w,order_d).sel++;
   376 		if (WP(w, order_d).sel != -1) WP(w,order_d).sel++;
   392 		ResetObjectToPlace();
   377 		ResetObjectToPlace();
   393 	}
   378 	}
   394 }
   379 }
   395 
   380 
   397  * Handle the click on the goto button.
   382  * Handle the click on the goto button.
   398  *
   383  *
   399  * @param w current window
   384  * @param w current window
   400  * @param v current vehicle
   385  * @param v current vehicle
   401  */
   386  */
   402 static void OrderClick_Goto(Window *w, const Vehicle *v)
   387 static void OrderClick_Goto(Window *w, const Vehicle *v, int i)
   403 {
   388 {
   404 	w->InvalidateWidget(ORDER_WIDGET_GOTO);
   389 	w->InvalidateWidget(ORDER_WIDGET_GOTO);
   405 	w->ToggleWidgetLoweredState(ORDER_WIDGET_GOTO);
   390 	w->ToggleWidgetLoweredState(ORDER_WIDGET_GOTO);
   406 	if (w->IsWidgetLowered(ORDER_WIDGET_GOTO)) {
   391 	if (w->IsWidgetLowered(ORDER_WIDGET_GOTO)) {
   407 		_place_clicked_vehicle = NULL;
   392 		_place_clicked_vehicle = NULL;
   414 /**
   399 /**
   415  * Handle the click on the full load button.
   400  * Handle the click on the full load button.
   416  *
   401  *
   417  * @param w current window
   402  * @param w current window
   418  * @param v current vehicle
   403  * @param v current vehicle
   419  */
   404  * @param load_type the way to load.
   420 static void OrderClick_FullLoad(Window *w, const Vehicle *v)
   405  */
   421 {
   406 static void OrderClick_FullLoad(Window *w, const Vehicle *v, int load_type)
   422 	DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), OF_FULL_LOAD, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   407 {
       
   408 	VehicleOrderID sel_ord = OrderGetSel(w);
       
   409 	const Order *order = GetVehicleOrder(v, sel_ord);
       
   410 
       
   411 	if (load_type > 0) load_type += 3;
       
   412 	if (load_type >= 0 && (order->GetLoadType() & OLFB_FULL_LOAD) == (load_type & OLFB_FULL_LOAD)) return;
       
   413 	DoCommandP(v->tile, v->index + (sel_ord << 16), MOF_LOAD | ((order->GetLoadType() & OLFB_FULL_LOAD) ^ OLFB_FULL_LOAD) << 2, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
       
   414 }
       
   415 
       
   416 /**
       
   417  * Handle the click on the service.
       
   418  *
       
   419  * @param w current window
       
   420  * @param v current vehicle
       
   421  */
       
   422 static void OrderClick_Service(Window *w, const Vehicle *v, int i)
       
   423 {
       
   424 	DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), MOF_DEPOT_ACTION, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   423 }
   425 }
   424 
   426 
   425 /**
   427 /**
   426  * Handle the click on the unload button.
   428  * Handle the click on the unload button.
   427  *
   429  *
   428  * @param w current window
   430  * @param w current window
   429  * @param v current vehicle
   431  * @param v current vehicle
   430  */
   432  */
   431 static void OrderClick_Unload(Window *w, const Vehicle *v)
   433 static void OrderClick_Unload(Window *w, const Vehicle *v, int i)
   432 {
   434 {
   433 	DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), OF_UNLOAD,    NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   435 	VehicleOrderID sel_ord = OrderGetSel(w);
       
   436 	const Order *order = GetVehicleOrder(v, sel_ord);
       
   437 
       
   438 	DoCommandP(v->tile, v->index + (sel_ord << 16), MOF_UNLOAD | (order->GetUnloadType() ^ OUFB_UNLOAD) << 2, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   434 }
   439 }
   435 
   440 
   436 /**
   441 /**
   437  * Handle the click on the nonstop button.
   442  * Handle the click on the nonstop button.
   438  *
   443  *
   439  * @param w current window
   444  * @param w current window
   440  * @param v current vehicle
   445  * @param v current vehicle
   441  */
   446  * @param non_stop what non-stop type to use; -1 to use the 'next' one.
   442 static void OrderClick_Nonstop(Window *w, const Vehicle *v)
   447  */
   443 {
   448 static void OrderClick_Nonstop(Window *w, const Vehicle *v, int non_stop)
   444 	DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), OF_NON_STOP,  NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   449 {
       
   450 	VehicleOrderID sel_ord = OrderGetSel(w);
       
   451 	const Order *order = GetVehicleOrder(v, sel_ord);
       
   452 
       
   453 	if (order->GetNonStopType() == non_stop) return;
       
   454 	if (_patches.new_nonstop && non_stop == ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS) non_stop = ONSF_STOP_EVERYWHERE;
       
   455 
       
   456 	/* Keypress if negative, so 'toggle' to the next */
       
   457 	if (non_stop < 0) {
       
   458 		non_stop = (order->GetNonStopType() + 1) % ONSF_END;
       
   459 	}
       
   460 
       
   461 	DoCommandP(v->tile, v->index + (sel_ord << 16), MOF_NON_STOP | non_stop << 2,  NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   445 }
   462 }
   446 
   463 
   447 /**
   464 /**
   448  * Handle the click on the transfer button.
   465  * Handle the click on the transfer button.
   449  *
   466  *
   450  * @param w current window
   467  * @param w current window
   451  * @param v current vehicle
   468  * @param v current vehicle
   452  */
   469  */
   453 static void OrderClick_Transfer(Window* w, const Vehicle* v)
   470 static void OrderClick_Transfer(Window *w, const Vehicle *v, int i)
   454 {
   471 {
   455 	DoCommandP(v->tile, v->index + (OrderGetSel(w) <<  16), OF_TRANSFER, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   472 	VehicleOrderID sel_ord = OrderGetSel(w);
       
   473 	const Order *order = GetVehicleOrder(v, sel_ord);
       
   474 
       
   475 	DoCommandP(v->tile, v->index + (sel_ord << 16), MOF_UNLOAD | (order->GetUnloadType() ^ OUFB_TRANSFER) << 2, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   456 }
   476 }
   457 
   477 
   458 /**
   478 /**
   459  * Handle the click on the skip button.
   479  * Handle the click on the skip button.
   460  * If ctrl is pressed skip to selected order.
   480  * If ctrl is pressed skip to selected order.
   461  *  Else skip to current order + 1
   481  *  Else skip to current order + 1
   462  *
   482  *
   463  * @param w current window
   483  * @param w current window
   464  * @param v current vehicle
   484  * @param v current vehicle
   465  */
   485  */
   466 static void OrderClick_Skip(Window *w, const Vehicle *v)
   486 static void OrderClick_Skip(Window *w, const Vehicle *v, int i)
   467 {
   487 {
   468 	/* Don't skip when there's nothing to skip */
   488 	/* Don't skip when there's nothing to skip */
   469 	if (_ctrl_pressed && v->cur_order_index == OrderGetSel(w)) return;
   489 	if (_ctrl_pressed && v->cur_order_index == OrderGetSel(w)) return;
   470 
   490 
   471 	DoCommandP(v->tile, v->index, _ctrl_pressed ? OrderGetSel(w) : ((v->cur_order_index + 1) % v->num_orders),
   491 	DoCommandP(v->tile, v->index, _ctrl_pressed ? OrderGetSel(w) : ((v->cur_order_index + 1) % v->num_orders),
   476  * Handle the click on the unload button.
   496  * Handle the click on the unload button.
   477  *
   497  *
   478  * @param w current window
   498  * @param w current window
   479  * @param v current vehicle
   499  * @param v current vehicle
   480  */
   500  */
   481 static void OrderClick_Delete(Window *w, const Vehicle *v)
   501 static void OrderClick_Delete(Window *w, const Vehicle *v, int i)
   482 {
   502 {
   483 	DoCommandP(v->tile, v->index, OrderGetSel(w), NULL, CMD_DELETE_ORDER | CMD_MSG(STR_8834_CAN_T_DELETE_THIS_ORDER));
   503 	DoCommandP(v->tile, v->index, OrderGetSel(w), NULL, CMD_DELETE_ORDER | CMD_MSG(STR_8834_CAN_T_DELETE_THIS_ORDER));
   484 }
   504 }
   485 
   505 
   486 /**
   506 /**
   489  *  Else show the refit window.
   509  *  Else show the refit window.
   490  *
   510  *
   491  * @param w current window
   511  * @param w current window
   492  * @param v current vehicle
   512  * @param v current vehicle
   493  */
   513  */
   494 static void OrderClick_Refit(Window *w, const Vehicle *v)
   514 static void OrderClick_Refit(Window *w, const Vehicle *v, int i)
   495 {
   515 {
   496 	if (_ctrl_pressed) {
   516 	if (_ctrl_pressed) {
   497 		/* Cancel refitting */
   517 		/* Cancel refitting */
   498 		DoCommandP(v->tile, v->index, (WP(w, order_d).sel << 16) | (CT_NO_REFIT << 8) | CT_NO_REFIT, NULL, CMD_ORDER_REFIT);
   518 		DoCommandP(v->tile, v->index, (WP(w, order_d).sel << 16) | (CT_NO_REFIT << 8) | CT_NO_REFIT, NULL, CMD_ORDER_REFIT);
   499 	} else {
   519 	} else {
   500 		ShowVehicleRefitWindow(v, WP(w, order_d).sel);
   520 		ShowVehicleRefitWindow(v, WP(w, order_d).sel);
   501 	}
   521 	}
   502 }
   522 }
   503 
   523 
   504 typedef void OnButtonVehClick(Window *w, const Vehicle *v);
   524 typedef void OnButtonVehClick(Window *w, const Vehicle *v, int i);
   505 
   525 
   506 /**
   526 /**
   507  * Keycode function mapping.
   527  * Keycode function mapping.
   508  *
   528  *
   509  * @see _order_keycodes[]
   529  * @see _order_keycodes[]
   514 	OrderClick_Delete,
   534 	OrderClick_Delete,
   515 	OrderClick_Nonstop,
   535 	OrderClick_Nonstop,
   516 	OrderClick_Goto,
   536 	OrderClick_Goto,
   517 	OrderClick_FullLoad,
   537 	OrderClick_FullLoad,
   518 	OrderClick_Unload,
   538 	OrderClick_Unload,
   519 	OrderClick_Transfer
   539 	OrderClick_Transfer,
       
   540 	OrderClick_Service,
   520 };
   541 };
   521 
   542 
   522 static const uint16 _order_keycodes[] = {
   543 static const uint16 _order_keycodes[] = {
   523 	'D', //skip order
   544 	'D', //skip order
   524 	'F', //delete order
   545 	'F', //delete order
   526 	'H', //goto order
   547 	'H', //goto order
   527 	'J', //full load
   548 	'J', //full load
   528 	'K'  //unload
   549 	'K'  //unload
   529 };
   550 };
   530 
   551 
       
   552 static const StringID _order_non_stop_drowdown[] = {
       
   553 	STR_ORDER_GO_TO,
       
   554 	STR_ORDER_GO_NON_STOP_TO,
       
   555 	STR_ORDER_GO_VIA,
       
   556 	STR_ORDER_GO_NON_STOP_VIA,
       
   557 	INVALID_STRING_ID
       
   558 };
       
   559 
       
   560 static const StringID _order_full_load_drowdown[] = {
       
   561 	STR_ORDER_DROP_LOAD_IF_POSSIBLE,
       
   562 	STR_ORDER_DROP_FULL_LOAD_ALL,
       
   563 	STR_ORDER_DROP_FULL_LOAD_ANY,
       
   564 	INVALID_STRING_ID
       
   565 };
       
   566 
   531 static void OrdersWndProc(Window *w, WindowEvent *e)
   567 static void OrdersWndProc(Window *w, WindowEvent *e)
   532 {
   568 {
       
   569 	const Vehicle *v = GetVehicle(w->window_number);
       
   570 
   533 	switch (e->event) {
   571 	switch (e->event) {
   534 		case WE_CREATE:
   572 		case WE_CREATE:
   535 			/* Ensure that the refit and unload buttons always remain at the same location.
   573 			/* Ensure that the refit and unload buttons always remain at the same location.
   536 			 * Only one of them can be active at any one time and takes turns on being disabled.
   574 			 * Only one of them can be active at any one time and takes turns on being disabled.
   537 			 * To ensure that they stay at the same location, we also verify that they behave the same
   575 			 * To ensure that they stay at the same location, we also verify that they behave the same
   538 			 * when resizing. */
   576 			 * when resizing. */
   539 			if (GetVehicle(w->window_number)->owner == _local_player) { // only the vehicle owner got these buttons
   577 			if (v->owner == _local_player) { // only the vehicle owner got these buttons
   540 				assert(w->widget[ORDER_WIDGET_REFIT].left          == w->widget[ORDER_WIDGET_UNLOAD].left);
   578 				assert(w->widget[ORDER_WIDGET_REFIT].left          == w->widget[ORDER_WIDGET_UNLOAD].left);
   541 				assert(w->widget[ORDER_WIDGET_REFIT].right         == w->widget[ORDER_WIDGET_UNLOAD].right);
   579 				assert(w->widget[ORDER_WIDGET_REFIT].right         == w->widget[ORDER_WIDGET_UNLOAD].right);
   542 				assert(w->widget[ORDER_WIDGET_REFIT].top           == w->widget[ORDER_WIDGET_UNLOAD].top);
   580 				assert(w->widget[ORDER_WIDGET_REFIT].top           == w->widget[ORDER_WIDGET_UNLOAD].top);
   543 				assert(w->widget[ORDER_WIDGET_REFIT].bottom        == w->widget[ORDER_WIDGET_UNLOAD].bottom);
   581 				assert(w->widget[ORDER_WIDGET_REFIT].bottom        == w->widget[ORDER_WIDGET_UNLOAD].bottom);
   544 				assert(w->widget[ORDER_WIDGET_REFIT].display_flags == w->widget[ORDER_WIDGET_UNLOAD].display_flags);
   582 				assert(w->widget[ORDER_WIDGET_REFIT].display_flags == w->widget[ORDER_WIDGET_UNLOAD].display_flags);
   550 				w->HideWidget(ORDER_WIDGET_TIMETABLE_VIEW);
   588 				w->HideWidget(ORDER_WIDGET_TIMETABLE_VIEW);
   551 			}
   589 			}
   552 
   590 
   553 			break;
   591 			break;
   554 
   592 
   555 	case WE_PAINT:
   593 		case WE_PAINT:
   556 		DrawOrdersWindow(w);
   594 			DrawOrdersWindow(w);
   557 		break;
   595 			break;
   558 
   596 
   559 	case WE_CLICK: {
   597 		case WE_CLICK:
   560 		const Vehicle *v = GetVehicle(w->window_number);
   598 			switch (e->we.click.widget) {
   561 		switch (e->we.click.widget) {
   599 				case ORDER_WIDGET_ORDER_LIST: {
   562 		case ORDER_WIDGET_ORDER_LIST: {
   600 					ResetObjectToPlace();
       
   601 					HideDropDownMenu(w);
       
   602 
       
   603 					int sel = GetOrderFromOrderWndPt(w, e->we.click.pt.y, v);
       
   604 
       
   605 					if (sel == INVALID_ORDER) {
       
   606 						/* This was a click on an empty part of the orders window, so
       
   607 						* deselect the currently selected order. */
       
   608 						WP(w, order_d).sel = -1;
       
   609 						SetWindowDirty(w);
       
   610 						return;
       
   611 					}
       
   612 
       
   613 					if (_ctrl_pressed && sel < v->num_orders) {
       
   614 						const Order *ord = GetVehicleOrder(v, sel);
       
   615 						TileIndex xy;
       
   616 
       
   617 						switch (ord->GetType()) {
       
   618 							case OT_GOTO_STATION:  xy = GetStation(ord->GetDestination())->xy ; break;
       
   619 							case OT_GOTO_DEPOT:    xy = (v->type == VEH_AIRCRAFT) ?  GetStation(ord->GetDestination())->xy : GetDepot(ord->GetDestination())->xy;    break;
       
   620 							case OT_GOTO_WAYPOINT: xy = GetWaypoint(ord->GetDestination())->xy; break;
       
   621 							default:               xy = 0; break;
       
   622 						}
       
   623 
       
   624 						if (xy != 0) ScrollMainWindowToTile(xy);
       
   625 						return;
       
   626 					} else {
       
   627 						if (sel == WP(w, order_d).sel) {
       
   628 							/* Deselect clicked order */
       
   629 							WP(w, order_d).sel = -1;
       
   630 						} else {
       
   631 							/* Select clicked order */
       
   632 							WP(w, order_d).sel = sel;
       
   633 
       
   634 							if (v->owner == _local_player) {
       
   635 								/* Activate drag and drop */
       
   636 								SetObjectToPlaceWnd(SPR_CURSOR_MOUSE, PAL_NONE, VHM_DRAG, w);
       
   637 							}
       
   638 						}
       
   639 					}
       
   640 
       
   641 					SetWindowDirty(w);
       
   642 				} break;
       
   643 
       
   644 				case ORDER_WIDGET_SKIP:
       
   645 					OrderClick_Skip(w, v, 0);
       
   646 					break;
       
   647 
       
   648 				case ORDER_WIDGET_DELETE:
       
   649 					OrderClick_Delete(w, v, 0);
       
   650 					break;
       
   651 
       
   652 				case ORDER_WIDGET_NON_STOP:
       
   653 					ShowDropDownMenu(w, _order_non_stop_drowdown, GetVehicleOrder(v, OrderGetSel(w))->GetNonStopType(), ORDER_WIDGET_NON_STOP, 0, _patches.new_nonstop ? 5 : 12, 124);
       
   654 					break;
       
   655 
       
   656 				case ORDER_WIDGET_GOTO:
       
   657 					OrderClick_Goto(w, v, 0);
       
   658 					break;
       
   659 
       
   660 				case ORDER_WIDGET_FULL_LOAD:
       
   661 					ShowDropDownMenu(w, _order_full_load_drowdown, GetVehicleOrder(v, OrderGetSel(w))->GetLoadType() << 2, ORDER_WIDGET_FULL_LOAD, 0, _patches.full_load_any ? 2 : 4, 124);
       
   662 					break;
       
   663 
       
   664 				case ORDER_WIDGET_UNLOAD:
       
   665 					OrderClick_Unload(w, v, 0);
       
   666 					break;
       
   667 
       
   668 				case ORDER_WIDGET_REFIT:
       
   669 					OrderClick_Refit(w, v, 0);
       
   670 					break;
       
   671 
       
   672 				case ORDER_WIDGET_TRANSFER:
       
   673 					OrderClick_Transfer(w, v, 0);
       
   674 					break;
       
   675 
       
   676 				case ORDER_WIDGET_SERVICE:
       
   677 					OrderClick_Service(w, v, 0);
       
   678 					break;
       
   679 
       
   680 				case ORDER_WIDGET_TIMETABLE_VIEW:
       
   681 					ShowTimetableWindow(v);
       
   682 					break;
       
   683 
       
   684 				case ORDER_WIDGET_SHARED_ORDER_LIST:
       
   685 					ShowVehicleListWindow(v);
       
   686 					break;
       
   687 			}
       
   688 			break;
       
   689 
       
   690 		case WE_DROPDOWN_SELECT: // we have selected a dropdown item in the list
       
   691 			switch (e->we.dropdown.button) {
       
   692 				case ORDER_WIDGET_NON_STOP:
       
   693 					OrderClick_Nonstop(w, v, e->we.dropdown.index);
       
   694 					break;
       
   695 
       
   696 				case ORDER_WIDGET_FULL_LOAD:
       
   697 					OrderClick_FullLoad(w, v, e->we.dropdown.index);
       
   698 					break;
       
   699 			}
       
   700 			break;
       
   701 
       
   702 		case WE_DRAGDROP:
       
   703 			switch (e->we.click.widget) {
       
   704 				case ORDER_WIDGET_ORDER_LIST: {
       
   705 					int from_order = OrderGetSel(w);
       
   706 					int to_order = GetOrderFromOrderWndPt(w, e->we.dragdrop.pt.y, v);
       
   707 
       
   708 					if (!(from_order == to_order || from_order == INVALID_ORDER || from_order > v->num_orders || to_order == INVALID_ORDER || to_order > v->num_orders) &&
       
   709 							DoCommandP(v->tile, v->index, from_order | (to_order << 16), NULL, CMD_MOVE_ORDER | CMD_MSG(STR_CAN_T_MOVE_THIS_ORDER))) {
       
   710 						WP(w, order_d).sel = -1;
       
   711 					}
       
   712 
       
   713 				} break;
       
   714 
       
   715 				case ORDER_WIDGET_DELETE:
       
   716 					OrderClick_Delete(w, v, 0);
       
   717 					break;
       
   718 			}
       
   719 
   563 			ResetObjectToPlace();
   720 			ResetObjectToPlace();
   564 
   721 			break;
   565 			int sel = GetOrderFromOrderWndPt(w, e->we.click.pt.y, v);
   722 
   566 
   723 		case WE_KEYPRESS:
   567 			if (sel == INVALID_ORDER) {
   724 			if (v->owner != _local_player) break;
   568 				/* This was a click on an empty part of the orders window, so
   725 
   569 				 * deselect the currently selected order. */
   726 			for (uint i = 0; i < lengthof(_order_keycodes); i++) {
   570 				WP(w, order_d).sel = -1;
   727 				if (e->we.keypress.keycode == _order_keycodes[i]) {
   571 				SetWindowDirty(w);
   728 					e->we.keypress.cont = false;
   572 				return;
   729 					/* see if the button is disabled */
   573 			}
   730 					if (!w->IsWidgetDisabled(i + ORDER_WIDGET_SKIP)) _order_button_proc[i](w, v, -1);
   574 
   731 					break;
   575 			if (_ctrl_pressed && sel < v->num_orders) {
       
   576 				const Order *ord = GetVehicleOrder(v, sel);
       
   577 				TileIndex xy;
       
   578 
       
   579 				switch (ord->type) {
       
   580 					case OT_GOTO_STATION:  xy = GetStation(ord->dest)->xy ; break;
       
   581 					case OT_GOTO_DEPOT:    xy = (v->type == VEH_AIRCRAFT) ?  GetStation(ord->dest)->xy : GetDepot(ord->dest)->xy;    break;
       
   582 					case OT_GOTO_WAYPOINT: xy = GetWaypoint(ord->dest)->xy; break;
       
   583 					default:               xy = 0; break;
       
   584 				}
   732 				}
   585 
   733 			}
   586 				if (xy != 0) ScrollMainWindowToTile(xy);
   734 			break;
   587 				return;
   735 
       
   736 		case WE_RCLICK: {
       
   737 			int s = OrderGetSel(w);
       
   738 
       
   739 			if (e->we.click.widget != ORDER_WIDGET_FULL_LOAD) break;
       
   740 			if (s == v->num_orders || !GetVehicleOrder(v, s)->IsType(OT_GOTO_DEPOT)) {
       
   741 				GuiShowTooltips(STR_8857_MAKE_THE_HIGHLIGHTED_ORDER);
   588 			} else {
   742 			} else {
   589 				if (sel == WP(w, order_d).sel) {
   743 				GuiShowTooltips(STR_SERVICE_HINT);
   590 					/* Deselect clicked order */
   744 			}
   591 					WP(w, order_d).sel = -1;
   745 		} break;
   592 				} else {
   746 
   593 					/* Select clicked order */
   747 		case WE_PLACE_OBJ:
   594 					WP(w, order_d).sel = sel;
   748 			OrdersPlaceObj(GetVehicle(w->window_number), e->we.place.tile, w);
   595 
   749 			break;
   596 					if (v->owner == _local_player) {
   750 
   597 						/* Activate drag and drop */
   751 		case WE_ABORT_PLACE_OBJ:
   598 						SetObjectToPlaceWnd(SPR_CURSOR_MOUSE, PAL_NONE, VHM_DRAG, w);
   752 			w->RaiseWidget(ORDER_WIDGET_GOTO);
   599 					}
   753 			w->InvalidateWidget(ORDER_WIDGET_GOTO);
       
   754 			break;
       
   755 
       
   756 		/* check if a vehicle in a depot was clicked.. */
       
   757 		case WE_MOUSELOOP:
       
   758 			v = _place_clicked_vehicle;
       
   759 			/*
       
   760 			* Check if we clicked on a vehicle
       
   761 			* and if the GOTO button of this window is pressed
       
   762 			* This is because of all open order windows WE_MOUSELOOP is called
       
   763 			* and if you have 3 windows open, and this check is not done
       
   764 			* the order is copied to the last open window instead of the
       
   765 			* one where GOTO is enabled
       
   766 			*/
       
   767 			if (v != NULL && w->IsWidgetLowered(ORDER_WIDGET_GOTO)) {
       
   768 				_place_clicked_vehicle = NULL;
       
   769 				HandleOrderVehClick(GetVehicle(w->window_number), v, w);
       
   770 			}
       
   771 			break;
       
   772 
       
   773 		case WE_RESIZE:
       
   774 			/* Update the scroll + matrix */
       
   775 			w->vscroll.cap = (w->widget[ORDER_WIDGET_ORDER_LIST].bottom - w->widget[ORDER_WIDGET_ORDER_LIST].top) / 10;
       
   776 			break;
       
   777 
       
   778 		case WE_TIMEOUT: // handle button unclick ourselves...
       
   779 			/* unclick all buttons except for the 'goto' button (ORDER_WIDGET_GOTO), which is 'persistent' */
       
   780 			for (uint i = 0; i < w->widget_count; i++) {
       
   781 				if (w->IsWidgetLowered(i) && i != ORDER_WIDGET_GOTO) {
       
   782 					w->RaiseWidget(i);
       
   783 					w->InvalidateWidget(i);
   600 				}
   784 				}
   601 			}
   785 			}
   602 
   786 			break;
   603 			SetWindowDirty(w);
       
   604 		} break;
       
   605 
       
   606 		case ORDER_WIDGET_SKIP:
       
   607 			OrderClick_Skip(w, v);
       
   608 			break;
       
   609 
       
   610 		case ORDER_WIDGET_DELETE:
       
   611 			OrderClick_Delete(w, v);
       
   612 			break;
       
   613 
       
   614 		case ORDER_WIDGET_NON_STOP:
       
   615 			OrderClick_Nonstop(w, v);
       
   616 			break;
       
   617 
       
   618 		case ORDER_WIDGET_GOTO:
       
   619 			OrderClick_Goto(w, v);
       
   620 			break;
       
   621 
       
   622 		case ORDER_WIDGET_FULL_LOAD:
       
   623 			OrderClick_FullLoad(w, v);
       
   624 			break;
       
   625 
       
   626 		case ORDER_WIDGET_UNLOAD:
       
   627 			OrderClick_Unload(w, v);
       
   628 			break;
       
   629 		case ORDER_WIDGET_REFIT:
       
   630 			OrderClick_Refit(w, v);
       
   631 			break;
       
   632 
       
   633 		case ORDER_WIDGET_TRANSFER:
       
   634 			OrderClick_Transfer(w, v);
       
   635 			break;
       
   636 
       
   637 		case ORDER_WIDGET_TIMETABLE_VIEW:
       
   638 			ShowTimetableWindow(v);
       
   639 			break;
       
   640 
       
   641 		case ORDER_WIDGET_SHARED_ORDER_LIST:
       
   642 			ShowVehicleListWindow(v);
       
   643 			break;
       
   644 		}
       
   645 	} break;
       
   646 
       
   647 	case WE_DRAGDROP: {
       
   648 		const Vehicle *v = GetVehicle(w->window_number);
       
   649 
       
   650 		switch (e->we.click.widget) {
       
   651 			case ORDER_WIDGET_ORDER_LIST: {
       
   652 				int from_order = OrderGetSel(w);
       
   653 				int to_order = GetOrderFromOrderWndPt(w, e->we.dragdrop.pt.y, v);
       
   654 
       
   655 				if (!(from_order == to_order || from_order == INVALID_ORDER || from_order > v->num_orders || to_order == INVALID_ORDER || to_order > v->num_orders) &&
       
   656 						DoCommandP(v->tile, v->index, from_order | (to_order << 16), NULL, CMD_MOVE_ORDER | CMD_MSG(STR_CAN_T_MOVE_THIS_ORDER))) {
       
   657 					WP(w, order_d).sel = -1;
       
   658 				}
       
   659 
       
   660 				break;
       
   661 			}
       
   662 
       
   663 			case ORDER_WIDGET_DELETE:
       
   664 				OrderClick_Delete(w, v);
       
   665 				break;
       
   666 		}
       
   667 
       
   668 		ResetObjectToPlace();
       
   669 		break;
       
   670 	}
       
   671 
       
   672 	case WE_KEYPRESS: {
       
   673 		Vehicle *v = GetVehicle(w->window_number);
       
   674 		uint i;
       
   675 
       
   676 		if (v->owner != _local_player) break;
       
   677 
       
   678 		for (i = 0; i < lengthof(_order_keycodes); i++) {
       
   679 			if (e->we.keypress.keycode == _order_keycodes[i]) {
       
   680 				e->we.keypress.cont = false;
       
   681 				//see if the button is disabled
       
   682 				if (!w->IsWidgetDisabled(i + ORDER_WIDGET_SKIP)) _order_button_proc[i](w, v);
       
   683 				break;
       
   684 			}
       
   685 		}
       
   686 		break;
       
   687 	}
       
   688 
       
   689 	case WE_RCLICK: {
       
   690 		const Vehicle *v = GetVehicle(w->window_number);
       
   691 		int s = OrderGetSel(w);
       
   692 
       
   693 		if (e->we.click.widget != ORDER_WIDGET_FULL_LOAD) break;
       
   694 		if (s == v->num_orders || GetVehicleOrder(v, s)->type != OT_GOTO_DEPOT) {
       
   695 			GuiShowTooltips(STR_8857_MAKE_THE_HIGHLIGHTED_ORDER);
       
   696 		} else {
       
   697 			GuiShowTooltips(STR_SERVICE_HINT);
       
   698 		}
       
   699 	} break;
       
   700 
       
   701 	case WE_PLACE_OBJ: {
       
   702 		OrdersPlaceObj(GetVehicle(w->window_number), e->we.place.tile, w);
       
   703 	} break;
       
   704 
       
   705 	case WE_ABORT_PLACE_OBJ: {
       
   706 		w->RaiseWidget(ORDER_WIDGET_GOTO);
       
   707 		w->InvalidateWidget(ORDER_WIDGET_GOTO);
       
   708 	} break;
       
   709 
       
   710 	// check if a vehicle in a depot was clicked..
       
   711 	case WE_MOUSELOOP: {
       
   712 		const Vehicle *v = _place_clicked_vehicle;
       
   713 		/*
       
   714 		 * Check if we clicked on a vehicle
       
   715 		 * and if the GOTO button of this window is pressed
       
   716 		 * This is because of all open order windows WE_MOUSELOOP is called
       
   717 		 * and if you have 3 windows open, and this check is not done
       
   718 		 * the order is copied to the last open window instead of the
       
   719 		 * one where GOTO is enabled
       
   720 		 */
       
   721 		if (v != NULL && w->IsWidgetLowered(ORDER_WIDGET_GOTO)) {
       
   722 			_place_clicked_vehicle = NULL;
       
   723 			HandleOrderVehClick(GetVehicle(w->window_number), v, w);
       
   724 		}
       
   725 	} break;
       
   726 
       
   727 	case WE_RESIZE:
       
   728 		/* Update the scroll + matrix */
       
   729 		w->vscroll.cap = (w->widget[ORDER_WIDGET_ORDER_LIST].bottom - w->widget[ORDER_WIDGET_ORDER_LIST].top) / 10;
       
   730 		break;
       
   731 
       
   732 	case WE_TIMEOUT: { // handle button unclick ourselves...
       
   733 		// unclick all buttons except for the 'goto' button (ORDER_WIDGET_GOTO), which is 'persistent'
       
   734 		uint i;
       
   735 		for (i = 0; i < w->widget_count; i++) {
       
   736 			if (w->IsWidgetLowered(i) && i != ORDER_WIDGET_GOTO) {
       
   737 				w->RaiseWidget(i);
       
   738 				w->InvalidateWidget(i);
       
   739 			}
       
   740 		}
       
   741 	} break;
       
   742 	}
   787 	}
   743 }
   788 }
   744 
   789 
   745 /**
   790 /**
   746  * Widget definition for player train orders
   791  * Widget definition for player train orders
   747  */
   792  */
   748 static const Widget _orders_train_widgets[] = {
   793 static const Widget _orders_train_widgets[] = {
   749 	{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,                STR_018B_CLOSE_WINDOW},               // ORDER_WIDGET_CLOSEBOX
   794 	{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,                STR_018B_CLOSE_WINDOW},               // ORDER_WIDGET_CLOSEBOX
   750 	{    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   398,     0,    13, STR_8829_ORDERS,         STR_018C_WINDOW_TITLE_DRAG_THIS},     // ORDER_WIDGET_CAPTION
   795 	{    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   385,     0,    13, STR_8829_ORDERS,         STR_018C_WINDOW_TITLE_DRAG_THIS},     // ORDER_WIDGET_CAPTION
   751 	{ WWT_PUSHTXTBTN,   RESIZE_LR,      14,   338,   398,     0,    13, STR_TIMETABLE_VIEW,      STR_TIMETABLE_VIEW_TOOLTIP},          // ORDER_WIDGET_TIMETABLE_VIEW
   796 	{ WWT_PUSHTXTBTN,   RESIZE_LR,      14,   325,   385,     0,    13, STR_TIMETABLE_VIEW,      STR_TIMETABLE_VIEW_TOOLTIP},          // ORDER_WIDGET_TIMETABLE_VIEW
   752 
   797 
   753 	{      WWT_PANEL,   RESIZE_RB,      14,     0,   386,    14,    75, 0x0,                     STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, // ORDER_WIDGET_ORDER_LIST
   798 	{      WWT_PANEL,   RESIZE_RB,      14,     0,   373,    14,    75, 0x0,                     STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, // ORDER_WIDGET_ORDER_LIST
   754 
   799 
   755 	{  WWT_SCROLLBAR,   RESIZE_LRB,     14,   387,   398,    14,    75, 0x0,                     STR_0190_SCROLL_BAR_SCROLLS_LIST},    // ORDER_WIDGET_SCROLLBAR
   800 	{  WWT_SCROLLBAR,   RESIZE_LRB,     14,   374,   385,    14,    75, 0x0,                     STR_0190_SCROLL_BAR_SCROLLS_LIST},    // ORDER_WIDGET_SCROLLBAR
   756 
   801 
   757 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,    52,    76,    87, STR_8823_SKIP,           STR_8853_SKIP_THE_CURRENT_ORDER},     // ORDER_WIDGET_SKIP
   802 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,   123,    88,    99, STR_8823_SKIP,           STR_8853_SKIP_THE_CURRENT_ORDER},     // ORDER_WIDGET_SKIP
   758 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,    53,   105,    76,    87, STR_8824_DELETE,         STR_8854_DELETE_THE_HIGHLIGHTED},     // ORDER_WIDGET_DELETE
   803 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   124,   247,    88,    99, STR_8824_DELETE,         STR_8854_DELETE_THE_HIGHLIGHTED},     // ORDER_WIDGET_DELETE
   759 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   106,   158,    76,    87, STR_8825_NON_STOP,       STR_8855_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_NON_STOP
   804 	{   WWT_DROPDOWN,   RESIZE_TB,      14,     0,    92,    76,    87, STR_8825_NON_STOP,       STR_8855_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_NON_STOP
   760 	{    WWT_TEXTBTN,   RESIZE_TB,      14,   159,   211,    76,    87, STR_8826_GO_TO,          STR_8856_INSERT_A_NEW_ORDER_BEFORE},  // ORDER_WIDGET_GOTO
   805 	{    WWT_TEXTBTN,   RESIZE_TB,      14,   248,   371,    88,    99, STR_8826_GO_TO,          STR_8856_INSERT_A_NEW_ORDER_BEFORE},  // ORDER_WIDGET_GOTO
   761 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   212,   264,    76,    87, STR_FULLLOAD_OR_SERVICE, STR_NULL},                            // ORDER_WIDGET_FULL_LOAD
   806 	{   WWT_DROPDOWN,   RESIZE_TB,      14,    93,   185,    76,    87, STR_8827_FULL_LOAD,      STR_8857_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_FULL_LOAD
   762 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   265,   319,    76,    87, STR_8828_UNLOAD,         STR_8858_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_UNLOAD
   807 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   186,   278,    76,    87, STR_8828_UNLOAD,         STR_8858_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_UNLOAD
   763 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   265,   319,    76,    87, STR_REFIT,               STR_REFIT_TIP},                       // ORDER_WIDGET_REFIT
   808 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   186,   278,    76,    87, STR_REFIT,               STR_REFIT_TIP},                       // ORDER_WIDGET_REFIT
   764 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   320,   372,    76,    87, STR_TRANSFER,            STR_MAKE_THE_HIGHLIGHTED_ORDER},      // ORDER_WIDGET_TRANSFER
   809 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   279,   371,    76,    87, STR_TRANSFER,            STR_MAKE_THE_HIGHLIGHTED_ORDER},      // ORDER_WIDGET_TRANSFER
   765 
   810 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   279,   371,    76,    87, STR_SERVICE,             STR_MAKE_THE_HIGHLIGHTED_ORDER},      // ORDER_WIDGET_SERVICE
   766 	{ 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
   811 
   767 
   812 	{      WWT_PANEL,   RESIZE_RTB,     14,   372,   373,    76,    99, 0x0,                     STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
   768 	{      WWT_PANEL,   RESIZE_RTB,     14,   387,   386,    76,    87, 0x0,                     STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
   813 	{ WWT_PUSHIMGBTN,   RESIZE_LRTB,    14,   372,   385,    76,    87, SPR_SHARED_ORDERS_ICON,  STR_VEH_WITH_SHARED_ORDERS_LIST_TIP}, // ORDER_WIDGET_SHARED_ORDER_LIST
   769 
   814 
   770 	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   387,   398,    76,    87, 0x0,                     STR_RESIZE_BUTTON},                   // ORDER_WIDGET_RESIZE
   815 	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   374,   385,    88,    99, 0x0,                     STR_RESIZE_BUTTON},                   // ORDER_WIDGET_RESIZE
   771 	{   WIDGETS_END},
   816 	{   WIDGETS_END},
   772 };
   817 };
   773 
   818 
   774 static const WindowDesc _orders_train_desc = {
   819 static const WindowDesc _orders_train_desc = {
   775 	WDP_AUTO, WDP_AUTO, 399, 88, 399, 88,
   820 	WDP_AUTO, WDP_AUTO, 386, 100, 386, 100,
   776 	WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW,
   821 	WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW,
   777 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE,
   822 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE,
   778 	_orders_train_widgets,
   823 	_orders_train_widgets,
   779 	OrdersWndProc
   824 	OrdersWndProc
   780 };
   825 };
   782 /**
   827 /**
   783  * Widget definition for player orders (!train)
   828  * Widget definition for player orders (!train)
   784  */
   829  */
   785 static const Widget _orders_widgets[] = {
   830 static const Widget _orders_widgets[] = {
   786 	{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,                STR_018B_CLOSE_WINDOW},               // ORDER_WIDGET_CLOSEBOX
   831 	{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,                STR_018B_CLOSE_WINDOW},               // ORDER_WIDGET_CLOSEBOX
   787 	{    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   409,     0,    13, STR_8829_ORDERS,         STR_018C_WINDOW_TITLE_DRAG_THIS},     // ORDER_WIDGET_CAPTION
   832 	{    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   385,     0,    13, STR_8829_ORDERS,         STR_018C_WINDOW_TITLE_DRAG_THIS},     // ORDER_WIDGET_CAPTION
   788 	{ WWT_PUSHTXTBTN,   RESIZE_LR,      14,   349,   409,     0,    13, STR_TIMETABLE_VIEW,      STR_TIMETABLE_VIEW_TOOLTIP},          // ORDER_WIDGET_TIMETABLE_VIEW
   833 	{ WWT_PUSHTXTBTN,   RESIZE_LR,      14,   325,   385,     0,    13, STR_TIMETABLE_VIEW,      STR_TIMETABLE_VIEW_TOOLTIP},          // ORDER_WIDGET_TIMETABLE_VIEW
   789 
   834 
   790 	{      WWT_PANEL,   RESIZE_RB,      14,     0,   397,    14,    75, 0x0,                     STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, // ORDER_WIDGET_ORDER_LIST
   835 	{      WWT_PANEL,   RESIZE_RB,      14,     0,   373,    14,    75, 0x0,                     STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, // ORDER_WIDGET_ORDER_LIST
   791 
   836 
   792 	{  WWT_SCROLLBAR,   RESIZE_LRB,     14,   398,   409,    14,    75, 0x0,                     STR_0190_SCROLL_BAR_SCROLLS_LIST},    // ORDER_WIDGET_SCROLLBAR
   837 	{  WWT_SCROLLBAR,   RESIZE_LRB,     14,   374,   385,    14,    75, 0x0,                     STR_0190_SCROLL_BAR_SCROLLS_LIST},    // ORDER_WIDGET_SCROLLBAR
   793 
   838 
   794 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,    63,    76,    87, STR_8823_SKIP,           STR_8853_SKIP_THE_CURRENT_ORDER},     // ORDER_WIDGET_SKIP
   839 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,   123,    88,    99, STR_8823_SKIP,           STR_8853_SKIP_THE_CURRENT_ORDER},     // ORDER_WIDGET_SKIP
   795 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,    64,   128,    76,    87, STR_8824_DELETE,         STR_8854_DELETE_THE_HIGHLIGHTED},     // ORDER_WIDGET_DELETE
   840 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   124,   247,    88,    99, STR_8824_DELETE,         STR_8854_DELETE_THE_HIGHLIGHTED},     // ORDER_WIDGET_DELETE
   796 	{      WWT_EMPTY,   RESIZE_TB,      14,     0,     0,    76,    87, 0x0,                     0x0},                                 // ORDER_WIDGET_NON_STOP
   841 	{      WWT_EMPTY,   RESIZE_TB,      14,     0,     0,    76,    87, 0x0,                     0x0},                                 // ORDER_WIDGET_NON_STOP
   797 	{    WWT_TEXTBTN,   RESIZE_TB,      14,   129,   192,    76,    87, STR_8826_GO_TO,          STR_8856_INSERT_A_NEW_ORDER_BEFORE},  // ORDER_WIDGET_GOTO
   842 	{    WWT_TEXTBTN,   RESIZE_TB,      14,   248,   371,    88,    99, STR_8826_GO_TO,          STR_8856_INSERT_A_NEW_ORDER_BEFORE},  // ORDER_WIDGET_GOTO
   798 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   193,   256,    76,    87, STR_FULLLOAD_OR_SERVICE, STR_NULL},                            // ORDER_WIDGET_FULL_LOAD
   843 	{   WWT_DROPDOWN,   RESIZE_TB,      14,     0,   123,    76,    87, STR_8827_FULL_LOAD,      STR_8857_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_FULL_LOAD
   799 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   257,   319,    76,    87, STR_8828_UNLOAD,         STR_8858_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_UNLOAD
   844 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   124,   247,    76,    87, STR_8828_UNLOAD,         STR_8858_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_UNLOAD
   800 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   257,   319,    76,    87, STR_REFIT,               STR_REFIT_TIP},                       // ORDER_WIDGET_REFIT
   845 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   124,   247,    76,    87, STR_REFIT,               STR_REFIT_TIP},                       // ORDER_WIDGET_REFIT
   801 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   320,   383,    76,    87, STR_TRANSFER,            STR_MAKE_THE_HIGHLIGHTED_ORDER},      // ORDER_WIDGET_TRANSFER
   846 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   248,   372,    76,    87, STR_TRANSFER,            STR_MAKE_THE_HIGHLIGHTED_ORDER},      // ORDER_WIDGET_TRANSFER
   802 
   847 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   248,   372,    76,    87, STR_SERVICE,             STR_NULL},                            // ORDER_WIDGET_SERVICE
   803 	{ 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
   848 
   804 
   849 	{      WWT_PANEL,   RESIZE_RTB,     14,   372,   373,    76,    99, 0x0,                     STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
   805 	{      WWT_PANEL,   RESIZE_RTB,     14,   397,   396,    76,    87, 0x0,                     STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
   850 	{ WWT_PUSHIMGBTN,   RESIZE_LRTB,    14,   372,   385,    76,    87, SPR_SHARED_ORDERS_ICON,  STR_VEH_WITH_SHARED_ORDERS_LIST_TIP}, // ORDER_WIDGET_SHARED_ORDER_LIST
   806 
   851 
   807 	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   398,   409,    76,    87, 0x0,                     STR_RESIZE_BUTTON},                   // ORDER_WIDGET_RESIZE
   852 	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   374,   385,    88,    99, 0x0,                     STR_RESIZE_BUTTON},                   // ORDER_WIDGET_RESIZE
   808 	{   WIDGETS_END},
   853 	{   WIDGETS_END},
   809 };
   854 };
   810 
   855 
   811 static const WindowDesc _orders_desc = {
   856 static const WindowDesc _orders_desc = {
   812 	WDP_AUTO, WDP_AUTO, 410, 88, 410, 88,
   857 	WDP_AUTO, WDP_AUTO, 386, 100, 386, 100,
   813 	WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW,
   858 	WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW,
   814 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE,
   859 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE,
   815 	_orders_widgets,
   860 	_orders_widgets,
   816 	OrdersWndProc
   861 	OrdersWndProc
   817 };
   862 };
   819 /**
   864 /**
   820  * Widget definition for competitor orders
   865  * Widget definition for competitor orders
   821  */
   866  */
   822 static const Widget _other_orders_widgets[] = {
   867 static const Widget _other_orders_widgets[] = {
   823 	{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,           STR_018B_CLOSE_WINDOW},               // ORDER_WIDGET_CLOSEBOX
   868 	{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,           STR_018B_CLOSE_WINDOW},               // ORDER_WIDGET_CLOSEBOX
   824 	{    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   331,     0,    13, STR_A00B_ORDERS,    STR_018C_WINDOW_TITLE_DRAG_THIS},     // ORDER_WIDGET_CAPTION
   869 	{    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   385,     0,    13, STR_8829_ORDERS,    STR_018C_WINDOW_TITLE_DRAG_THIS},     // ORDER_WIDGET_CAPTION
   825 	{ WWT_PUSHTXTBTN,   RESIZE_LR,      14,   271,   331,     0,    13, STR_TIMETABLE_VIEW, STR_TIMETABLE_VIEW_TOOLTIP},          // ORDER_WIDGET_TIMETABLE_VIEW
   870 	{ WWT_PUSHTXTBTN,   RESIZE_LR,      14,   325,   385,     0,    13, STR_TIMETABLE_VIEW, STR_TIMETABLE_VIEW_TOOLTIP},          // ORDER_WIDGET_TIMETABLE_VIEW
   826 
   871 
   827 	{      WWT_PANEL,   RESIZE_RB,      14,     0,   319,    14,    75, 0x0,                STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, // ORDER_WIDGET_ORDER_LIST
   872 	{      WWT_PANEL,   RESIZE_RB,      14,     0,   373,    14,    75, 0x0,                STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, // ORDER_WIDGET_ORDER_LIST
   828 
   873 
   829 	{  WWT_SCROLLBAR,   RESIZE_LRB,     14,   320,   331,    14,    75, 0x0,                STR_0190_SCROLL_BAR_SCROLLS_LIST},    // ORDER_WIDGET_SCROLLBAR
   874 	{  WWT_SCROLLBAR,   RESIZE_LRB,     14,   374,   385,    14,    75, 0x0,                STR_0190_SCROLL_BAR_SCROLLS_LIST},    // ORDER_WIDGET_SCROLLBAR
   830 
   875 
   831 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_SKIP
   876 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_SKIP
   832 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_DELETE
   877 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_DELETE
   833 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_NON_STOP
   878 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_NON_STOP
   834 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_GOTO
   879 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_GOTO
   835 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_FULL_LOAD
   880 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_FULL_LOAD
   836 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_UNLOAD
   881 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_UNLOAD
   837 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_REFIT
   882 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_REFIT
   838 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_TRANSFER
   883 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_TRANSFER
   839 
   884 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_SERVICE
   840 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_SHARED_ORDER_LIST
   885 
   841 
   886 	{      WWT_PANEL,   RESIZE_RTB,     14,     0,   373,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
   842 	{      WWT_PANEL,   RESIZE_RTB,     14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
   887 	{      WWT_EMPTY,   RESIZE_TB,      14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_SHARED_ORDER_LIST
   843 
   888 
   844 	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   320,   331,    76,    87, 0x0,                STR_RESIZE_BUTTON},                   // ORDER_WIDGET_RESIZE
   889 	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   374,   385,    88,    99, 0x0,                STR_RESIZE_BUTTON},              // ORDER_WIDGET_RESIZE
   845 	{   WIDGETS_END},
   890 	{   WIDGETS_END},
   846 };
   891 };
   847 
   892 
   848 static const WindowDesc _other_orders_desc = {
   893 static const WindowDesc _other_orders_desc = {
   849 	WDP_AUTO, WDP_AUTO, 332, 88, 332, 88,
   894 	WDP_AUTO, WDP_AUTO, 386, 88, 386, 88,
   850 	WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW,
   895 	WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW,
   851 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE,
   896 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE,
   852 	_other_orders_widgets,
   897 	_other_orders_widgets,
   853 	OrdersWndProc
   898 	OrdersWndProc
   854 };
   899 };