src/order_gui.cpp
branchnoai
changeset 10142 56ee7da4ad56
parent 9869 6404afe43575
child 10181 54df587fef5d
equal deleted inserted replaced
10096:780921b39016 10142:56ee7da4ad56
    24 #include "window_func.h"
    24 #include "window_func.h"
    25 #include "vehicle_func.h"
    25 #include "vehicle_func.h"
    26 #include "settings_type.h"
    26 #include "settings_type.h"
    27 #include "player_func.h"
    27 #include "player_func.h"
    28 #include "newgrf_cargo.h"
    28 #include "newgrf_cargo.h"
       
    29 #include "widgets/dropdown_func.h"
       
    30 #include "textbuf_gui.h"
       
    31 #include "string_func.h"
    29 
    32 
    30 #include "table/sprites.h"
    33 #include "table/sprites.h"
    31 #include "table/strings.h"
    34 #include "table/strings.h"
    32 
    35 
    33 enum OrderWindowWidgets {
    36 enum OrderWindowWidgets {
    38 	ORDER_WIDGET_SCROLLBAR,
    41 	ORDER_WIDGET_SCROLLBAR,
    39 	ORDER_WIDGET_SKIP,
    42 	ORDER_WIDGET_SKIP,
    40 	ORDER_WIDGET_DELETE,
    43 	ORDER_WIDGET_DELETE,
    41 	ORDER_WIDGET_NON_STOP,
    44 	ORDER_WIDGET_NON_STOP,
    42 	ORDER_WIDGET_GOTO,
    45 	ORDER_WIDGET_GOTO,
       
    46 	ORDER_WIDGET_GOTO_DROPDOWN,
    43 	ORDER_WIDGET_FULL_LOAD,
    47 	ORDER_WIDGET_FULL_LOAD,
    44 	ORDER_WIDGET_UNLOAD,
    48 	ORDER_WIDGET_UNLOAD,
    45 	ORDER_WIDGET_REFIT,
    49 	ORDER_WIDGET_REFIT,
    46 	ORDER_WIDGET_TRANSFER,
    50 	ORDER_WIDGET_SERVICE,
       
    51 	ORDER_WIDGET_COND_VARIABLE,
       
    52 	ORDER_WIDGET_COND_COMPARATOR,
       
    53 	ORDER_WIDGET_COND_VALUE,
       
    54 	ORDER_WIDGET_RESIZE_BAR,
    47 	ORDER_WIDGET_SHARED_ORDER_LIST,
    55 	ORDER_WIDGET_SHARED_ORDER_LIST,
    48 	ORDER_WIDGET_RESIZE_BAR,
       
    49 	ORDER_WIDGET_RESIZE,
    56 	ORDER_WIDGET_RESIZE,
    50 };
    57 };
       
    58 
       
    59 /** Under what reason are we using the PlaceObject functionality? */
       
    60 enum OrderPlaceObjectState {
       
    61 	OPOS_GOTO,
       
    62 	OPOS_CONDITIONAL,
       
    63 };
       
    64 
       
    65 struct order_d {
       
    66 	int sel;
       
    67 	OrderPlaceObjectState goto_type;
       
    68 };
       
    69 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(order_d));
    51 
    70 
    52 /**
    71 /**
    53  * Return the memorised selected order.
    72  * Return the memorised selected order.
    54  *
    73  *
    55  * @param w current window
    74  * @param w current window
    80 	/*
    99 	/*
    81 	 * Calculation description:
   100 	 * Calculation description:
    82 	 * 15 = 14 (w->widget[ORDER_WIDGET_ORDER_LIST].top) + 1 (frame-line)
   101 	 * 15 = 14 (w->widget[ORDER_WIDGET_ORDER_LIST].top) + 1 (frame-line)
    83 	 * 10 = order text hight
   102 	 * 10 = order text hight
    84 	 */
   103 	 */
    85 	int sel = (y - 15) / 10;
   104 	int sel = (y - w->widget[ORDER_WIDGET_ORDER_LIST].top - 1) / 10;
    86 
   105 
    87 	if ((uint)sel >= w->vscroll.cap) return INVALID_ORDER;
   106 	if ((uint)sel >= w->vscroll.cap) return INVALID_ORDER;
    88 
   107 
    89 	sel += w->vscroll.pos;
   108 	sel += w->vscroll.pos;
    90 
   109 
    91 	return (sel <= v->num_orders && sel >= 0) ? sel : INVALID_ORDER;
   110 	return (sel <= v->num_orders && sel >= 0) ? sel : INVALID_ORDER;
    92 }
   111 }
    93 
   112 
    94 static StringID _station_order_strings[][7] = {
   113 /** Order load types that could be given to station orders. */
       
   114 static const StringID _station_load_types[][5] = {
    95 	{
   115 	{
    96 		STR_8806_GO_TO,
   116 		STR_EMPTY,
    97 		STR_GO_TO_TRANSFER,
   117 		INVALID_STRING_ID,
    98 		STR_8807_GO_TO_UNLOAD,
   118 		STR_ORDER_FULL_LOAD,
    99 		STR_GO_TO_TRANSFER_UNLOAD,
   119 		STR_ORDER_FULL_LOAD_ANY,
   100 		STR_8808_GO_TO_LOAD,
   120 		STR_ORDER_NO_LOAD,
   101 		STR_GO_TO_TRANSFER_LOAD
       
   102 	}, {
   121 	}, {
   103 		STR_880A_GO_NON_STOP_TO,
   122 		STR_ORDER_UNLOAD,
   104 		STR_GO_TO_NON_STOP_TRANSFER,
   123 		INVALID_STRING_ID,
   105 		STR_880B_GO_NON_STOP_TO_UNLOAD,
   124 		STR_ORDER_UNLOAD_FULL_LOAD,
   106 		STR_GO_TO_NON_STOP_TRANSFER_UNLOAD,
   125 		STR_ORDER_UNLOAD_FULL_LOAD_ANY,
   107 		STR_880C_GO_NON_STOP_TO_LOAD,
   126 		STR_ORDER_UNLOAD_NO_LOAD,
   108 		STR_GO_TO_NON_STOP_TRANSFER_LOAD
   127 	}, {
   109 	}
   128 		STR_ORDER_TRANSFER,
   110 };
   129 		INVALID_STRING_ID,
       
   130 		STR_ORDER_TRANSFER_FULL_LOAD,
       
   131 		STR_ORDER_TRANSFER_FULL_LOAD_ANY,
       
   132 		STR_ORDER_TRANSFER_NO_LOAD,
       
   133 	}, {
       
   134 		/* Unload and transfer do not work together. */
       
   135 		INVALID_STRING_ID,
       
   136 		INVALID_STRING_ID,
       
   137 		INVALID_STRING_ID,
       
   138 		INVALID_STRING_ID,
       
   139 	}, {
       
   140 		STR_ORDER_NO_UNLOAD,
       
   141 		INVALID_STRING_ID,
       
   142 		STR_ORDER_NO_UNLOAD_FULL_LOAD,
       
   143 		STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY,
       
   144 		INVALID_STRING_ID,
       
   145 	}
       
   146 };
       
   147 
       
   148 static const StringID _order_non_stop_drowdown[] = {
       
   149 	STR_ORDER_GO_TO,
       
   150 	STR_ORDER_GO_NON_STOP_TO,
       
   151 	STR_ORDER_GO_VIA,
       
   152 	STR_ORDER_GO_NON_STOP_VIA,
       
   153 	INVALID_STRING_ID
       
   154 };
       
   155 
       
   156 static const StringID _order_full_load_drowdown[] = {
       
   157 	STR_ORDER_DROP_LOAD_IF_POSSIBLE,
       
   158 	STR_EMPTY,
       
   159 	STR_ORDER_DROP_FULL_LOAD_ALL,
       
   160 	STR_ORDER_DROP_FULL_LOAD_ANY,
       
   161 	STR_ORDER_DROP_NO_LOADING,
       
   162 	INVALID_STRING_ID
       
   163 };
       
   164 
       
   165 static const StringID _order_unload_drowdown[] = {
       
   166 	STR_ORDER_DROP_UNLOAD_IF_ACCEPTED,
       
   167 	STR_ORDER_DROP_UNLOAD,
       
   168 	STR_ORDER_DROP_TRANSFER,
       
   169 	STR_EMPTY,
       
   170 	STR_ORDER_DROP_NO_UNLOADING,
       
   171 	INVALID_STRING_ID
       
   172 };
       
   173 
       
   174 static const StringID _order_goto_dropdown[] = {
       
   175 	STR_ORDER_GO_TO,
       
   176 	STR_ORDER_GO_TO_NEAREST_DEPOT,
       
   177 	STR_ORDER_CONDITIONAL,
       
   178 	INVALID_STRING_ID
       
   179 };
       
   180 
       
   181 static const StringID _order_goto_dropdown_aircraft[] = {
       
   182 	STR_ORDER_GO_TO,
       
   183 	STR_ORDER_GO_TO_NEAREST_HANGAR,
       
   184 	STR_ORDER_CONDITIONAL,
       
   185 	INVALID_STRING_ID
       
   186 };
       
   187 
       
   188 static const StringID _order_conditional_variable[] = {
       
   189 	STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE,
       
   190 	STR_ORDER_CONDITIONAL_RELIABILITY,
       
   191 	STR_ORDER_CONDITIONAL_MAX_SPEED,
       
   192 	STR_ORDER_CONDITIONAL_AGE,
       
   193 	STR_ORDER_CONDITIONAL_REQUIRES_SERVICE,
       
   194 	STR_ORDER_CONDITIONAL_UNCONDITIONALLY,
       
   195 	INVALID_STRING_ID,
       
   196 };
       
   197 
       
   198 static const StringID _order_conditional_condition[] = {
       
   199 	STR_ORDER_CONDITIONAL_COMPARATOR_EQUALS,
       
   200 	STR_ORDER_CONDITIONAL_COMPARATOR_NOT_EQUALS,
       
   201 	STR_ORDER_CONDITIONAL_COMPARATOR_LESS_THAN,
       
   202 	STR_ORDER_CONDITIONAL_COMPARATOR_LESS_EQUALS,
       
   203 	STR_ORDER_CONDITIONAL_COMPARATOR_MORE_THAN,
       
   204 	STR_ORDER_CONDITIONAL_COMPARATOR_MORE_EQUALS,
       
   205 	STR_ORDER_CONDITIONAL_COMPARATOR_IS_TRUE,
       
   206 	STR_ORDER_CONDITIONAL_COMPARATOR_IS_FALSE,
       
   207 	INVALID_STRING_ID,
       
   208 };
       
   209 
       
   210 extern uint ConvertSpeedToDisplaySpeed(uint speed);
       
   211 extern uint ConvertDisplaySpeedToSpeed(uint speed);
       
   212 
   111 
   213 
   112 static void DrawOrdersWindow(Window *w)
   214 static void DrawOrdersWindow(Window *w)
   113 {
   215 {
   114 	const Vehicle *v;
   216 	const Vehicle *v = GetVehicle(w->window_number);
   115 	const Order *order;
   217 	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 
   218 
   125 	SetVScrollCount(w, v->num_orders + 1);
   219 	SetVScrollCount(w, v->num_orders + 1);
   126 
   220 
   127 	sel = OrderGetSel(w);
   221 	int sel = OrderGetSel(w);
   128 	SetDParam(2, STR_8827_FULL_LOAD);
   222 	const Order *order = GetVehicleOrder(v, sel);
   129 
       
   130 	order = GetVehicleOrder(v, sel);
       
   131 
   223 
   132 	if (v->owner == _local_player) {
   224 	if (v->owner == _local_player) {
       
   225 		/* Set the strings for the dropdown boxes. */
       
   226 		w->widget[ORDER_WIDGET_NON_STOP].data        = _order_non_stop_drowdown[order == NULL ? 0 : order->GetNonStopType()];
       
   227 		w->widget[ORDER_WIDGET_FULL_LOAD].data       = _order_full_load_drowdown[order == NULL ? 0 : order->GetLoadType()];
       
   228 		w->widget[ORDER_WIDGET_UNLOAD].data          = _order_unload_drowdown[order == NULL ? 0 : order->GetUnloadType()];
       
   229 		w->widget[ORDER_WIDGET_COND_VARIABLE].data   = _order_conditional_variable[order == NULL ? 0 : order->GetConditionVariable()];
       
   230 		w->widget[ORDER_WIDGET_COND_COMPARATOR].data = _order_conditional_condition[order == NULL ? 0 : order->GetConditionComparator()];
       
   231 
   133 		/* skip */
   232 		/* skip */
   134 		w->SetWidgetDisabledState(ORDER_WIDGET_SKIP, v->num_orders <= 1);
   233 		w->SetWidgetDisabledState(ORDER_WIDGET_SKIP, v->num_orders <= 1);
   135 
   234 
   136 		/* delete */
   235 		/* delete */
   137 		w->SetWidgetDisabledState(ORDER_WIDGET_DELETE,
   236 		w->SetWidgetDisabledState(ORDER_WIDGET_DELETE,
   138 				(uint)v->num_orders + ((shared_orders || v->num_orders != 0) ? 1 : 0) <= (uint)WP(w, order_d).sel);
   237 				(uint)v->num_orders + ((shared_orders || v->num_orders != 0) ? 1 : 0) <= (uint)WP(w, order_d).sel);
   139 
   238 
   140 		/* non-stop only for trains */
   239 		/* non-stop only for trains */
   141 		w->SetWidgetDisabledState(ORDER_WIDGET_NON_STOP,  v->type != VEH_TRAIN || order == NULL);
   240 		w->SetWidgetDisabledState(ORDER_WIDGET_NON_STOP,  v->type != VEH_TRAIN || order == NULL);
   142 		w->SetWidgetDisabledState(ORDER_WIDGET_FULL_LOAD, order == NULL); // full load
   241 		w->SetWidgetDisabledState(ORDER_WIDGET_FULL_LOAD, order == NULL || (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) != 0); // full load
   143 		w->SetWidgetDisabledState(ORDER_WIDGET_UNLOAD,    order == NULL); // unload
   242 		w->SetWidgetDisabledState(ORDER_WIDGET_UNLOAD,    order == NULL || (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) != 0); // unload
   144 		w->SetWidgetDisabledState(ORDER_WIDGET_TRANSFER,  order == NULL); // transfer
       
   145 		/* Disable list of vehicles with the same shared orders if there is no list */
   243 		/* 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);
   244 		w->SetWidgetDisabledState(ORDER_WIDGET_SHARED_ORDER_LIST, !shared_orders || v->orders == NULL);
   147 		w->SetWidgetDisabledState(ORDER_WIDGET_REFIT,     order == NULL); // Refit
   245 		w->SetWidgetDisabledState(ORDER_WIDGET_REFIT,     order == NULL); // Refit
       
   246 		w->SetWidgetDisabledState(ORDER_WIDGET_SERVICE,   order == NULL); // Refit
   148 		w->HideWidget(ORDER_WIDGET_REFIT); // Refit
   247 		w->HideWidget(ORDER_WIDGET_REFIT); // Refit
   149 	} else {
   248 		w->HideWidget(ORDER_WIDGET_SERVICE); // Service
   150 		w->DisableWidget(ORDER_WIDGET_TRANSFER);
   249 
   151 	}
   250 		w->HideWidget(ORDER_WIDGET_COND_VARIABLE);
   152 
   251 		w->HideWidget(ORDER_WIDGET_COND_COMPARATOR);
   153 	w->ShowWidget(ORDER_WIDGET_UNLOAD); // Unload
   252 		w->HideWidget(ORDER_WIDGET_COND_VALUE);
       
   253 	}
       
   254 
       
   255 	w->ShowWidget(ORDER_WIDGET_NON_STOP);
       
   256 	w->ShowWidget(ORDER_WIDGET_UNLOAD);
       
   257 	w->ShowWidget(ORDER_WIDGET_FULL_LOAD);
   154 
   258 
   155 	if (order != NULL) {
   259 	if (order != NULL) {
   156 		switch (order->GetType()) {
   260 		switch (order->GetType()) {
   157 			case OT_GOTO_STATION:
   261 			case OT_GOTO_STATION:
   158 				if (!GetStation(order->GetDestination())->IsBuoy()) break;
   262 				if (!GetStation(order->GetDestination())->IsBuoy()) break;
   159 				/* Fall-through */
   263 				/* Fall-through */
   160 
   264 
   161 			case OT_GOTO_WAYPOINT:
   265 			case OT_GOTO_WAYPOINT:
   162 				w->DisableWidget(ORDER_WIDGET_FULL_LOAD);
   266 				w->DisableWidget(ORDER_WIDGET_FULL_LOAD);
   163 				w->DisableWidget(ORDER_WIDGET_UNLOAD);
   267 				w->DisableWidget(ORDER_WIDGET_UNLOAD);
   164 				w->DisableWidget(ORDER_WIDGET_TRANSFER);
       
   165 				break;
   268 				break;
   166 
   269 
   167 			case OT_GOTO_DEPOT:
   270 			case OT_GOTO_DEPOT:
   168 				w->DisableWidget(ORDER_WIDGET_TRANSFER);
   271 				w->DisableWidget(ORDER_WIDGET_FULL_LOAD);
   169 
   272 
   170 				/* Remove unload and replace it with refit */
   273 				/* Remove unload and replace it with refit */
   171 				w->HideWidget(ORDER_WIDGET_UNLOAD);
   274 				w->HideWidget(ORDER_WIDGET_UNLOAD);
   172 				w->ShowWidget(ORDER_WIDGET_REFIT);
   275 				w->ShowWidget(ORDER_WIDGET_REFIT);
   173 				SetDParam(2,STR_SERVICE);
   276 				w->HideWidget(ORDER_WIDGET_FULL_LOAD);
       
   277 				w->ShowWidget(ORDER_WIDGET_SERVICE);
   174 				break;
   278 				break;
       
   279 
       
   280 			case OT_CONDITIONAL: {
       
   281 				w->HideWidget(ORDER_WIDGET_NON_STOP);
       
   282 				w->HideWidget(ORDER_WIDGET_UNLOAD);
       
   283 				w->HideWidget(ORDER_WIDGET_FULL_LOAD);
       
   284 				w->ShowWidget(ORDER_WIDGET_COND_VARIABLE);
       
   285 				w->ShowWidget(ORDER_WIDGET_COND_COMPARATOR);
       
   286 				w->ShowWidget(ORDER_WIDGET_COND_VALUE);
       
   287 
       
   288 				OrderConditionVariable ocv = order->GetConditionVariable();
       
   289 				w->SetWidgetDisabledState(ORDER_WIDGET_COND_COMPARATOR, ocv == OCV_UNCONDITIONALLY);
       
   290 				w->SetWidgetDisabledState(ORDER_WIDGET_COND_VALUE, ocv == OCV_REQUIRES_SERVICE || ocv == OCV_UNCONDITIONALLY);
       
   291 
       
   292 				uint value = order->GetConditionValue();
       
   293 				if (order->GetConditionVariable() == OCV_MAX_SPEED) value = ConvertSpeedToDisplaySpeed(value);
       
   294 				SetDParam(1, value);
       
   295 			} break;
   175 
   296 
   176 			default: // every other orders
   297 			default: // every other orders
   177 				w->DisableWidget(ORDER_WIDGET_NON_STOP);
   298 				w->DisableWidget(ORDER_WIDGET_NON_STOP);
   178 				w->DisableWidget(ORDER_WIDGET_FULL_LOAD);
   299 				w->DisableWidget(ORDER_WIDGET_FULL_LOAD);
   179 				w->DisableWidget(ORDER_WIDGET_UNLOAD);
   300 				w->DisableWidget(ORDER_WIDGET_UNLOAD);
   181 	}
   302 	}
   182 
   303 
   183 	SetDParam(0, v->index);
   304 	SetDParam(0, v->index);
   184 	DrawWindowWidgets(w);
   305 	DrawWindowWidgets(w);
   185 
   306 
   186 	y = 15;
   307 	int y = 15;
   187 
   308 
   188 	i = w->vscroll.pos;
   309 	int i = w->vscroll.pos;
   189 	order = GetVehicleOrder(v, i);
   310 	order = GetVehicleOrder(v, i);
       
   311 	StringID str;
   190 	while (order != NULL) {
   312 	while (order != NULL) {
   191 		str = (v->cur_order_index == i) ? STR_8805 : STR_8804;
   313 		str = (v->cur_order_index == i) ? STR_8805 : STR_8804;
   192 		SetDParam(3, STR_EMPTY);
   314 		SetDParam(6, STR_EMPTY);
   193 
   315 
   194 		if (i - w->vscroll.pos < w->vscroll.cap) {
   316 		if (i - w->vscroll.pos < w->vscroll.cap) {
   195 			SetDParam(1, 6);
       
   196 
       
   197 			switch (order->GetType()) {
   317 			switch (order->GetType()) {
   198 				case OT_DUMMY:
   318 				case OT_DUMMY:
   199 					SetDParam(1, STR_INVALID_ORDER);
   319 					SetDParam(1, STR_INVALID_ORDER);
   200 					SetDParam(2, order->GetDestination());
   320 					SetDParam(2, order->GetDestination());
   201 					break;
   321 					break;
   202 
   322 
   203 				case OT_GOTO_STATION:
   323 				case OT_GOTO_STATION: {
   204 					SetDParam(1, _station_order_strings[!!order->GetNonStopType()][order->GetLoadType() | order->GetUnloadType()]);
   324 					OrderLoadFlags load = order->GetLoadType();
   205 					SetDParam(2, order->GetDestination());
   325 					OrderUnloadFlags unload = order->GetUnloadType();
   206 					break;
   326 
   207 
   327 					SetDParam(1, STR_GO_TO_STATION);
   208 				case OT_GOTO_DEPOT: {
   328 					SetDParam(2, STR_ORDER_GO_TO + (v->type == VEH_TRAIN ? order->GetNonStopType() : 0));
   209 					StringID s = STR_NULL;
   329 					SetDParam(3, order->GetDestination());
   210 
   330 					SetDParam(4, (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) ? STR_EMPTY : _station_load_types[unload][load]);
       
   331 				} break;
       
   332 
       
   333 				case OT_GOTO_DEPOT:
   211 					if (v->type == VEH_AIRCRAFT) {
   334 					if (v->type == VEH_AIRCRAFT) {
   212 						s = STR_GO_TO_AIRPORT_HANGAR;
   335 						if (order->GetDepotActionType() & ODATFB_NEAREST_DEPOT) {
   213 						SetDParam(2, order->GetDestination());
   336 							SetDParam(1, STR_GO_TO_NEAREST_DEPOT);
       
   337 							SetDParam(3, STR_ORDER_NEAREST_HANGAR);
       
   338 						} else {
       
   339 							SetDParam(1, STR_GO_TO_HANGAR);
       
   340 							SetDParam(3, order->GetDestination());
       
   341 						}
       
   342 						SetDParam(4, STR_EMPTY);
   214 					} else {
   343 					} else {
   215 						SetDParam(2, GetDepot(order->GetDestination())->town_index);
   344 						if (order->GetDepotActionType() & ODATFB_NEAREST_DEPOT) {
       
   345 							SetDParam(1, STR_GO_TO_NEAREST_DEPOT);
       
   346 							SetDParam(3, STR_ORDER_NEAREST_DEPOT);
       
   347 						} else {
       
   348 							SetDParam(1, STR_GO_TO_DEPOT);
       
   349 							SetDParam(3, GetDepot(order->GetDestination())->town_index);
       
   350 						}
   216 
   351 
   217 						switch (v->type) {
   352 						switch (v->type) {
   218 							case VEH_TRAIN: s = (order->GetNonStopType() & OFB_NON_STOP) ? STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT : STR_GO_TO_TRAIN_DEPOT; break;
   353 							case VEH_TRAIN: SetDParam(4, STR_ORDER_TRAIN_DEPOT); break;
   219 							case VEH_ROAD:  s = STR_GO_TO_ROADVEH_DEPOT; break;
   354 							case VEH_ROAD:  SetDParam(4, STR_ORDER_ROAD_DEPOT); break;
   220 							case VEH_SHIP:  s = STR_GO_TO_SHIP_DEPOT; break;
   355 							case VEH_SHIP:  SetDParam(4, STR_ORDER_SHIP_DEPOT); break;
   221 							default: break;
   356 							default: NOT_REACHED();
   222 						}
   357 						}
   223 					}
   358 					}
   224 
   359 
   225 					if (order->GetDepotOrderType() & OFB_SERVICE_IF_NEEDED) s++; /* service at */
   360 					if (order->GetDepotOrderType() & ODTFB_SERVICE) {
   226 
   361 						SetDParam(2, (order->GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS) ? STR_ORDER_SERVICE_NON_STOP_AT : STR_ORDER_SERVICE_AT);
   227 					SetDParam(1, s);
   362 					} else {
       
   363 						SetDParam(2, (order->GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS) ? STR_ORDER_GO_NON_STOP_TO : STR_ORDER_GO_TO);
       
   364 					}
       
   365 
   228 					if (order->IsRefit()) {
   366 					if (order->IsRefit()) {
   229 						SetDParam(3, STR_REFIT_ORDER);
   367 						SetDParam(6, STR_REFIT_ORDER);
   230 						SetDParam(4, GetCargo(order->GetRefitCargo())->name);
   368 						SetDParam(7, GetCargo(order->GetRefitCargo())->name);
       
   369 					}
       
   370 					break;
       
   371 
       
   372 				case OT_GOTO_WAYPOINT:
       
   373 					SetDParam(1, (order->GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS) ? STR_GO_NON_STOP_TO_WAYPOINT : STR_GO_TO_WAYPOINT);
       
   374 					SetDParam(2, order->GetDestination());
       
   375 					break;
       
   376 
       
   377 				case OT_CONDITIONAL:
       
   378 					SetDParam(2, order->GetConditionSkipToOrder() + 1);
       
   379 					if (order->GetConditionVariable() == OCV_UNCONDITIONALLY) {
       
   380 						SetDParam(1, STR_CONDITIONAL_UNCONDITIONAL);
   231 					} else {
   381 					} else {
   232 						SetDParam(3, STR_EMPTY);
   382 						OrderConditionComparator occ = order->GetConditionComparator();
       
   383 						SetDParam(1, (occ == OCC_IS_TRUE || occ == OCC_IS_FALSE) ? STR_CONDITIONAL_TRUE_FALSE : STR_CONDITIONAL_NUM);
       
   384 						SetDParam(3, STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE + order->GetConditionVariable());
       
   385 						SetDParam(4, STR_ORDER_CONDITIONAL_COMPARATOR_EQUALS + occ);
       
   386 
       
   387 						uint value = order->GetConditionValue();
       
   388 						if (order->GetConditionVariable() == OCV_MAX_SPEED) value = ConvertSpeedToDisplaySpeed(value);
       
   389 						SetDParam(5, value);
   233 					}
   390 					}
   234 					break;
   391 					break;
   235 				}
   392 
   236 
   393 				default: NOT_REACHED();
   237 				case OT_GOTO_WAYPOINT:
       
   238 					SetDParam(1, (order->GetNonStopType() & OFB_NON_STOP) ? STR_GO_NON_STOP_TO_WAYPOINT : STR_GO_TO_WAYPOINT);
       
   239 					SetDParam(2, order->GetDestination());
       
   240 					break;
       
   241 
       
   242 				default: break;
       
   243 			}
   394 			}
   244 
   395 
   245 			SetDParam(0, i + 1);
   396 			SetDParam(0, i + 1);
   246 			DrawString(2, y, str, (i == WP(w, order_d).sel) ? TC_WHITE : TC_BLACK);
   397 			DrawString(2, y, str, (i == WP(w, order_d).sel) ? TC_WHITE : TC_BLACK);
   247 
   398 
   262 {
   413 {
   263 	Order order;
   414 	Order order;
   264 	order.next  = NULL;
   415 	order.next  = NULL;
   265 	order.index = 0;
   416 	order.index = 0;
   266 
   417 
   267 	// check depot first
   418 	/* check depot first */
   268 	if (_patches.gotodepot) {
   419 	if (_patches.gotodepot) {
   269 		switch (GetTileType(tile)) {
   420 		switch (GetTileType(tile)) {
   270 		case MP_RAILWAY:
   421 			case MP_RAILWAY:
   271 			if (v->type == VEH_TRAIN && IsTileOwner(tile, _local_player)) {
   422 				if (v->type == VEH_TRAIN && IsTileOwner(tile, _local_player)) {
   272 				if (IsRailDepot(tile)) {
   423 					if (IsRailDepot(tile)) {
   273 					order.MakeGoToDepot(GetDepotByTile(tile)->index, true);
   424 						order.MakeGoToDepot(GetDepotByTile(tile)->index, ODTFB_PART_OF_ORDERS);
       
   425 						return order;
       
   426 					}
       
   427 				}
       
   428 				break;
       
   429 
       
   430 			case MP_ROAD:
       
   431 				if (IsRoadDepot(tile) && v->type == VEH_ROAD && IsTileOwner(tile, _local_player)) {
       
   432 					order.MakeGoToDepot(GetDepotByTile(tile)->index, ODTFB_PART_OF_ORDERS);
   274 					return order;
   433 					return order;
   275 				}
   434 				}
   276 			}
   435 				break;
   277 			break;
   436 
   278 
   437 			case MP_STATION:
   279 		case MP_ROAD:
   438 				if (v->type != VEH_AIRCRAFT) break;
   280 			if (IsRoadDepot(tile) && v->type == VEH_ROAD && IsTileOwner(tile, _local_player)) {
   439 				if (IsHangar(tile) && IsTileOwner(tile, _local_player)) {
   281 				order.MakeGoToDepot(GetDepotByTile(tile)->index, true);
   440 					order.MakeGoToDepot(GetStationIndex(tile), ODTFB_PART_OF_ORDERS);
   282 				return order;
   441 					return order;
   283 			}
   442 				}
   284 			break;
   443 				break;
   285 
   444 
   286 		case MP_STATION:
   445 			case MP_WATER:
   287 			if (v->type != VEH_AIRCRAFT) break;
   446 				if (v->type != VEH_SHIP) break;
   288 			if (IsHangar(tile) && IsTileOwner(tile, _local_player)) {
   447 				if (IsTileDepotType(tile, TRANSPORT_WATER) &&
   289 				order.MakeGoToDepot(GetStationIndex(tile), true);
   448 						IsTileOwner(tile, _local_player)) {
   290 				return order;
   449 					TileIndex tile2 = GetOtherShipDepotTile(tile);
   291 			}
   450 
   292 			break;
   451 					order.MakeGoToDepot(GetDepotByTile(tile < tile2 ? tile : tile2)->index, ODTFB_PART_OF_ORDERS);
   293 
   452 					return order;
   294 		case MP_WATER:
   453 				}
   295 			if (v->type != VEH_SHIP) break;
       
   296 			if (IsTileDepotType(tile, TRANSPORT_WATER) &&
       
   297 					IsTileOwner(tile, _local_player)) {
       
   298 				TileIndex tile2 = GetOtherShipDepotTile(tile);
       
   299 
       
   300 				order.MakeGoToDepot(GetDepotByTile(tile < tile2 ? tile : tile2)->index, true);
       
   301 				return order;
       
   302 			}
       
   303 
   454 
   304 			default:
   455 			default:
   305 				break;
   456 				break;
   306 		}
   457 		}
   307 	}
   458 	}
   308 
   459 
   309 	// check waypoint
   460 	/* check waypoint */
   310 	if (IsTileType(tile, MP_RAILWAY) &&
   461 	if (IsTileType(tile, MP_RAILWAY) &&
   311 			v->type == VEH_TRAIN &&
   462 			v->type == VEH_TRAIN &&
   312 			IsTileOwner(tile, _local_player) &&
   463 			IsTileOwner(tile, _local_player) &&
   313 			IsRailWaypoint(tile)) {
   464 			IsRailWaypoint(tile)) {
   314 		order.MakeGoToWaypoint(GetWaypointByTile(tile)->index);
   465 		order.MakeGoToWaypoint(GetWaypointByTile(tile)->index);
   319 		StationID st_index = GetStationIndex(tile);
   470 		StationID st_index = GetStationIndex(tile);
   320 		const Station *st = GetStation(st_index);
   471 		const Station *st = GetStation(st_index);
   321 
   472 
   322 		if (st->owner == _current_player || st->owner == OWNER_NONE) {
   473 		if (st->owner == _current_player || st->owner == OWNER_NONE) {
   323 			byte facil;
   474 			byte facil;
   324 			(facil=FACIL_DOCK, v->type == VEH_SHIP) ||
   475 			(facil = FACIL_DOCK, v->type == VEH_SHIP) ||
   325 			(facil=FACIL_TRAIN, v->type == VEH_TRAIN) ||
   476 			(facil = FACIL_TRAIN, v->type == VEH_TRAIN) ||
   326 			(facil=FACIL_AIRPORT, v->type == VEH_AIRCRAFT) ||
   477 			(facil = FACIL_AIRPORT, v->type == VEH_AIRCRAFT) ||
   327 			(facil=FACIL_BUS_STOP, v->type == VEH_ROAD && IsCargoInClass(v->cargo_type, CC_PASSENGERS)) ||
   478 			(facil = FACIL_BUS_STOP, v->type == VEH_ROAD && IsCargoInClass(v->cargo_type, CC_PASSENGERS)) ||
   328 			(facil=FACIL_TRUCK_STOP, 1);
   479 			(facil = FACIL_TRUCK_STOP, 1);
   329 			if (st->facilities & facil) {
   480 			if (st->facilities & facil) {
   330 				order.MakeGoToStation(st_index);
   481 				order.MakeGoToStation(st_index);
       
   482 				if (_patches.new_nonstop && v->type == VEH_TRAIN) order.SetNonStopType(ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS);
   331 				return order;
   483 				return order;
   332 			}
   484 			}
   333 		}
   485 		}
   334 	}
   486 	}
   335 
   487 
   336 	// not found
   488 	/* not found */
   337 	order.Free();
   489 	order.Free();
   338 	return order;
   490 	return order;
   339 }
   491 }
   340 
   492 
   341 static bool HandleOrderVehClick(const Vehicle *v, const Vehicle *u, Window *w)
   493 static bool HandleOrderVehClick(const Vehicle *v, const Vehicle *u, Window *w)
   345 	if (!u->IsPrimaryVehicle()) {
   497 	if (!u->IsPrimaryVehicle()) {
   346 		u = u->First();
   498 		u = u->First();
   347 		if (!u->IsPrimaryVehicle()) return false;
   499 		if (!u->IsPrimaryVehicle()) return false;
   348 	}
   500 	}
   349 
   501 
   350 	// v is vehicle getting orders. Only copy/clone orders if vehicle doesn't have any orders yet
   502 	/* v is vehicle getting orders. Only copy/clone orders if vehicle doesn't have any orders yet
   351 	// obviously if you press CTRL on a non-empty orders vehicle you know what you are doing
   503 	 * obviously if you press CTRL on a non-empty orders vehicle you know what you are doing */
   352 	if (v->num_orders != 0 && _ctrl_pressed == 0) return false;
   504 	if (v->num_orders != 0 && _ctrl_pressed == 0) return false;
   353 
   505 
   354 	if (DoCommandP(v->tile, v->index | (u->index << 16), _ctrl_pressed ? CO_SHARE : CO_COPY, NULL,
   506 	if (DoCommandP(v->tile, v->index | (u->index << 16), _ctrl_pressed ? CO_SHARE : CO_COPY, NULL,
   355 		_ctrl_pressed ? CMD_CLONE_ORDER | CMD_MSG(STR_CANT_SHARE_ORDER_LIST) : CMD_CLONE_ORDER | CMD_MSG(STR_CANT_COPY_ORDER_LIST))) {
   507 		_ctrl_pressed ? CMD_CLONE_ORDER | CMD_MSG(STR_CANT_SHARE_ORDER_LIST) : CMD_CLONE_ORDER | CMD_MSG(STR_CANT_COPY_ORDER_LIST))) {
   356 		WP(w, order_d).sel = -1;
   508 		WP(w, order_d).sel = -1;
   360 	return true;
   512 	return true;
   361 }
   513 }
   362 
   514 
   363 static void OrdersPlaceObj(const Vehicle *v, TileIndex tile, Window *w)
   515 static void OrdersPlaceObj(const Vehicle *v, TileIndex tile, Window *w)
   364 {
   516 {
   365 	Order cmd;
   517 	/* check if we're clicking on a vehicle first.. clone orders in that case. */
   366 	const Vehicle *u;
   518 	const Vehicle *u = CheckMouseOverVehicle();
   367 
       
   368 	// check if we're clicking on a vehicle first.. clone orders in that case.
       
   369 	u = CheckMouseOverVehicle();
       
   370 	if (u != NULL && HandleOrderVehClick(v, u, w)) return;
   519 	if (u != NULL && HandleOrderVehClick(v, u, w)) return;
   371 
   520 
   372 	cmd = GetOrderCmdFromTile(v, tile);
   521 	const Order cmd = GetOrderCmdFromTile(v, tile);
   373 	if (!cmd.IsValid()) return;
   522 	if (!cmd.IsValid()) return;
   374 
   523 
   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))) {
   524 	if (DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), cmd.Pack(), NULL, CMD_INSERT_ORDER | CMD_MSG(STR_8833_CAN_T_INSERT_NEW_ORDER))) {
   376 		if (WP(w, order_d).sel != -1) WP(w,order_d).sel++;
   525 		if (WP(w, order_d).sel != -1) WP(w,order_d).sel++;
   377 		ResetObjectToPlace();
   526 		ResetObjectToPlace();
   382  * Handle the click on the goto button.
   531  * Handle the click on the goto button.
   383  *
   532  *
   384  * @param w current window
   533  * @param w current window
   385  * @param v current vehicle
   534  * @param v current vehicle
   386  */
   535  */
   387 static void OrderClick_Goto(Window *w, const Vehicle *v)
   536 static void OrderClick_Goto(Window *w, const Vehicle *v, int i)
   388 {
   537 {
   389 	w->InvalidateWidget(ORDER_WIDGET_GOTO);
   538 	w->InvalidateWidget(ORDER_WIDGET_GOTO);
   390 	w->ToggleWidgetLoweredState(ORDER_WIDGET_GOTO);
   539 	w->ToggleWidgetLoweredState(ORDER_WIDGET_GOTO);
   391 	if (w->IsWidgetLowered(ORDER_WIDGET_GOTO)) {
   540 	if (w->IsWidgetLowered(ORDER_WIDGET_GOTO)) {
   392 		_place_clicked_vehicle = NULL;
   541 		_place_clicked_vehicle = NULL;
   393 		SetObjectToPlaceWnd(ANIMCURSOR_PICKSTATION, PAL_NONE, VHM_RECT, w);
   542 		SetObjectToPlaceWnd(ANIMCURSOR_PICKSTATION, PAL_NONE, VHM_RECT, w);
       
   543 		WP(w, order_d).goto_type = OPOS_GOTO;
   394 	} else {
   544 	} else {
   395 		ResetObjectToPlace();
   545 		ResetObjectToPlace();
   396 	}
   546 	}
   397 }
   547 }
   398 
   548 
   399 /**
   549 /**
   400  * Handle the click on the full load button.
   550  * Handle the click on the full load button.
   401  *
   551  *
   402  * @param w current window
   552  * @param w current window
   403  * @param v current vehicle
   553  * @param v current vehicle
   404  */
   554  * @param load_type the way to load.
   405 static void OrderClick_FullLoad(Window *w, const Vehicle *v)
   555  */
   406 {
   556 static void OrderClick_FullLoad(Window *w, const Vehicle *v, int load_type)
   407 	DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), OF_FULL_LOAD, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   557 {
       
   558 	VehicleOrderID sel_ord = OrderGetSel(w);
       
   559 	const Order *order = GetVehicleOrder(v, sel_ord);
       
   560 
       
   561 	if (order->GetLoadType() == load_type) return;
       
   562 
       
   563 	if (load_type < 0) {
       
   564 		switch (order->GetLoadType()) {
       
   565 			case OLF_LOAD_IF_POSSIBLE: load_type = OLFB_FULL_LOAD;       break;
       
   566 			case OLFB_FULL_LOAD:       load_type = OLF_FULL_LOAD_ANY;    break;
       
   567 			case OLF_FULL_LOAD_ANY:    load_type = OLFB_NO_LOAD;         break;
       
   568 			case OLFB_NO_LOAD:         load_type = OLF_LOAD_IF_POSSIBLE; break;
       
   569 			default: NOT_REACHED();
       
   570 		}
       
   571 	}
       
   572 	DoCommandP(v->tile, v->index + (sel_ord << 16), MOF_LOAD | (load_type << 4), NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
       
   573 }
       
   574 
       
   575 /**
       
   576  * Handle the click on the service.
       
   577  *
       
   578  * @param w current window
       
   579  * @param v current vehicle
       
   580  */
       
   581 static void OrderClick_Service(Window *w, const Vehicle *v, int i)
       
   582 {
       
   583 	DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), MOF_DEPOT_ACTION, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
       
   584 }
       
   585 
       
   586 /**
       
   587  * Handle the click on the service in nearest depot button.
       
   588  *
       
   589  * @param w current window
       
   590  * @param v current vehicle
       
   591  */
       
   592 static void OrderClick_NearestDepot(Window *w, const Vehicle *v, int i)
       
   593 {
       
   594 	Order order;
       
   595 	order.next = NULL;
       
   596 	order.index = 0;
       
   597 	order.MakeGoToDepot(0, ODTFB_PART_OF_ORDERS);
       
   598 	order.SetDepotActionType(ODATFB_NEAREST_DEPOT);
       
   599 
       
   600 	DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), order.Pack(), NULL, CMD_INSERT_ORDER | CMD_MSG(STR_8833_CAN_T_INSERT_NEW_ORDER));
       
   601 }
       
   602 
       
   603 /**
       
   604  * Handle the click on the conditional order button.
       
   605  *
       
   606  * @param w current window
       
   607  * @param v current vehicle
       
   608  */
       
   609 static void OrderClick_Conditional(Window *w, const Vehicle *v, int i)
       
   610 {
       
   611 	w->InvalidateWidget(ORDER_WIDGET_GOTO);
       
   612 	w->LowerWidget(ORDER_WIDGET_GOTO);
       
   613 	SetObjectToPlaceWnd(ANIMCURSOR_PICKSTATION, PAL_NONE, VHM_RECT, w);
       
   614 	WP(w, order_d).goto_type = OPOS_CONDITIONAL;
   408 }
   615 }
   409 
   616 
   410 /**
   617 /**
   411  * Handle the click on the unload button.
   618  * Handle the click on the unload button.
   412  *
   619  *
   413  * @param w current window
   620  * @param w current window
   414  * @param v current vehicle
   621  * @param v current vehicle
   415  */
   622  */
   416 static void OrderClick_Unload(Window *w, const Vehicle *v)
   623 static void OrderClick_Unload(Window *w, const Vehicle *v, int unload_type)
   417 {
   624 {
   418 	DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), OF_UNLOAD,    NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   625 	VehicleOrderID sel_ord = OrderGetSel(w);
       
   626 	const Order *order = GetVehicleOrder(v, sel_ord);
       
   627 
       
   628 	if (order->GetUnloadType() == unload_type) return;
       
   629 
       
   630 	if (unload_type < 0) {
       
   631 		switch (order->GetUnloadType()) {
       
   632 			case OUF_UNLOAD_IF_POSSIBLE: unload_type = OUFB_UNLOAD;            break;
       
   633 			case OUFB_UNLOAD:            unload_type = OUFB_TRANSFER;          break;
       
   634 			case OUFB_TRANSFER:          unload_type = OUFB_NO_UNLOAD;         break;
       
   635 			case OUFB_NO_UNLOAD:         unload_type = OUF_UNLOAD_IF_POSSIBLE; break;
       
   636 			default: NOT_REACHED();
       
   637 		}
       
   638 	}
       
   639 
       
   640 	DoCommandP(v->tile, v->index + (sel_ord << 16), MOF_UNLOAD | (unload_type << 4), NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   419 }
   641 }
   420 
   642 
   421 /**
   643 /**
   422  * Handle the click on the nonstop button.
   644  * Handle the click on the nonstop button.
   423  *
   645  *
   424  * @param w current window
   646  * @param w current window
   425  * @param v current vehicle
   647  * @param v current vehicle
   426  */
   648  * @param non_stop what non-stop type to use; -1 to use the 'next' one.
   427 static void OrderClick_Nonstop(Window *w, const Vehicle *v)
   649  */
   428 {
   650 static void OrderClick_Nonstop(Window *w, const Vehicle *v, int non_stop)
   429 	DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), OF_NON_STOP,  NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   651 {
       
   652 	VehicleOrderID sel_ord = OrderGetSel(w);
       
   653 	const Order *order = GetVehicleOrder(v, sel_ord);
       
   654 
       
   655 	if (order->GetNonStopType() == non_stop) return;
       
   656 
       
   657 	/* Keypress if negative, so 'toggle' to the next */
       
   658 	if (non_stop < 0) {
       
   659 		non_stop = (order->GetNonStopType() + 1) % ONSF_END;
       
   660 	}
       
   661 
       
   662 	DoCommandP(v->tile, v->index + (sel_ord << 16), MOF_NON_STOP | non_stop << 4,  NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   430 }
   663 }
   431 
   664 
   432 /**
   665 /**
   433  * Handle the click on the transfer button.
   666  * Handle the click on the transfer button.
   434  *
   667  *
   435  * @param w current window
   668  * @param w current window
   436  * @param v current vehicle
   669  * @param v current vehicle
   437  */
   670  */
   438 static void OrderClick_Transfer(Window* w, const Vehicle* v)
   671 static void OrderClick_Transfer(Window *w, const Vehicle *v, int i)
   439 {
   672 {
   440 	DoCommandP(v->tile, v->index + (OrderGetSel(w) <<  16), OF_TRANSFER, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   673 	VehicleOrderID sel_ord = OrderGetSel(w);
       
   674 	const Order *order = GetVehicleOrder(v, sel_ord);
       
   675 
       
   676 	DoCommandP(v->tile, v->index + (sel_ord << 16), MOF_UNLOAD | ((order->GetUnloadType() & ~OUFB_NO_UNLOAD) ^ OUFB_TRANSFER) << 4, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
   441 }
   677 }
   442 
   678 
   443 /**
   679 /**
   444  * Handle the click on the skip button.
   680  * Handle the click on the skip button.
   445  * If ctrl is pressed skip to selected order.
   681  * If ctrl is pressed skip to selected order.
   446  *  Else skip to current order + 1
   682  *  Else skip to current order + 1
   447  *
   683  *
   448  * @param w current window
   684  * @param w current window
   449  * @param v current vehicle
   685  * @param v current vehicle
   450  */
   686  */
   451 static void OrderClick_Skip(Window *w, const Vehicle *v)
   687 static void OrderClick_Skip(Window *w, const Vehicle *v, int i)
   452 {
   688 {
   453 	/* Don't skip when there's nothing to skip */
   689 	/* Don't skip when there's nothing to skip */
   454 	if (_ctrl_pressed && v->cur_order_index == OrderGetSel(w)) return;
   690 	if (_ctrl_pressed && v->cur_order_index == OrderGetSel(w)) return;
   455 
   691 
   456 	DoCommandP(v->tile, v->index, _ctrl_pressed ? OrderGetSel(w) : ((v->cur_order_index + 1) % v->num_orders),
   692 	DoCommandP(v->tile, v->index, _ctrl_pressed ? OrderGetSel(w) : ((v->cur_order_index + 1) % v->num_orders),
   461  * Handle the click on the unload button.
   697  * Handle the click on the unload button.
   462  *
   698  *
   463  * @param w current window
   699  * @param w current window
   464  * @param v current vehicle
   700  * @param v current vehicle
   465  */
   701  */
   466 static void OrderClick_Delete(Window *w, const Vehicle *v)
   702 static void OrderClick_Delete(Window *w, const Vehicle *v, int i)
   467 {
   703 {
   468 	DoCommandP(v->tile, v->index, OrderGetSel(w), NULL, CMD_DELETE_ORDER | CMD_MSG(STR_8834_CAN_T_DELETE_THIS_ORDER));
   704 	DoCommandP(v->tile, v->index, OrderGetSel(w), NULL, CMD_DELETE_ORDER | CMD_MSG(STR_8834_CAN_T_DELETE_THIS_ORDER));
   469 }
   705 }
   470 
   706 
   471 /**
   707 /**
   474  *  Else show the refit window.
   710  *  Else show the refit window.
   475  *
   711  *
   476  * @param w current window
   712  * @param w current window
   477  * @param v current vehicle
   713  * @param v current vehicle
   478  */
   714  */
   479 static void OrderClick_Refit(Window *w, const Vehicle *v)
   715 static void OrderClick_Refit(Window *w, const Vehicle *v, int i)
   480 {
   716 {
   481 	if (_ctrl_pressed) {
   717 	if (_ctrl_pressed) {
   482 		/* Cancel refitting */
   718 		/* Cancel refitting */
   483 		DoCommandP(v->tile, v->index, (WP(w, order_d).sel << 16) | (CT_NO_REFIT << 8) | CT_NO_REFIT, NULL, CMD_ORDER_REFIT);
   719 		DoCommandP(v->tile, v->index, (WP(w, order_d).sel << 16) | (CT_NO_REFIT << 8) | CT_NO_REFIT, NULL, CMD_ORDER_REFIT);
   484 	} else {
   720 	} else {
   485 		ShowVehicleRefitWindow(v, WP(w, order_d).sel);
   721 		ShowVehicleRefitWindow(v, WP(w, order_d).sel);
   486 	}
   722 	}
   487 }
   723 }
   488 
   724 
   489 typedef void OnButtonVehClick(Window *w, const Vehicle *v);
   725 typedef void OnButtonVehClick(Window *w, const Vehicle *v, int i);
   490 
   726 
   491 /**
   727 /**
   492  * Keycode function mapping.
   728  * Keycode function mapping.
   493  *
   729  *
   494  * @see _order_keycodes[]
   730  * @see _order_keycodes[]
   499 	OrderClick_Delete,
   735 	OrderClick_Delete,
   500 	OrderClick_Nonstop,
   736 	OrderClick_Nonstop,
   501 	OrderClick_Goto,
   737 	OrderClick_Goto,
   502 	OrderClick_FullLoad,
   738 	OrderClick_FullLoad,
   503 	OrderClick_Unload,
   739 	OrderClick_Unload,
   504 	OrderClick_Transfer
   740 	OrderClick_Transfer,
       
   741 	OrderClick_Service,
   505 };
   742 };
   506 
   743 
   507 static const uint16 _order_keycodes[] = {
   744 static const uint16 _order_keycodes[] = {
   508 	'D', //skip order
   745 	'D', //skip order
   509 	'F', //delete order
   746 	'F', //delete order
   513 	'K'  //unload
   750 	'K'  //unload
   514 };
   751 };
   515 
   752 
   516 static void OrdersWndProc(Window *w, WindowEvent *e)
   753 static void OrdersWndProc(Window *w, WindowEvent *e)
   517 {
   754 {
       
   755 	const Vehicle *v = GetVehicle(w->window_number);
       
   756 
   518 	switch (e->event) {
   757 	switch (e->event) {
   519 		case WE_CREATE:
   758 		case WE_CREATE:
   520 			/* Ensure that the refit and unload buttons always remain at the same location.
       
   521 			 * Only one of them can be active at any one time and takes turns on being disabled.
       
   522 			 * To ensure that they stay at the same location, we also verify that they behave the same
       
   523 			 * when resizing. */
       
   524 			if (GetVehicle(w->window_number)->owner == _local_player) { // only the vehicle owner got these buttons
       
   525 				assert(w->widget[ORDER_WIDGET_REFIT].left          == w->widget[ORDER_WIDGET_UNLOAD].left);
       
   526 				assert(w->widget[ORDER_WIDGET_REFIT].right         == w->widget[ORDER_WIDGET_UNLOAD].right);
       
   527 				assert(w->widget[ORDER_WIDGET_REFIT].top           == w->widget[ORDER_WIDGET_UNLOAD].top);
       
   528 				assert(w->widget[ORDER_WIDGET_REFIT].bottom        == w->widget[ORDER_WIDGET_UNLOAD].bottom);
       
   529 				assert(w->widget[ORDER_WIDGET_REFIT].display_flags == w->widget[ORDER_WIDGET_UNLOAD].display_flags);
       
   530 			}
       
   531 
       
   532 			if (_patches.timetabling) {
   759 			if (_patches.timetabling) {
   533 				w->widget[ORDER_WIDGET_CAPTION].right -= 61;
   760 				w->widget[ORDER_WIDGET_CAPTION].right -= 61;
   534 			} else {
   761 			} else {
   535 				w->HideWidget(ORDER_WIDGET_TIMETABLE_VIEW);
   762 				w->HideWidget(ORDER_WIDGET_TIMETABLE_VIEW);
   536 			}
   763 			}
   537 
   764 
   538 			break;
   765 			break;
   539 
   766 
   540 	case WE_PAINT:
   767 		case WE_PAINT:
   541 		DrawOrdersWindow(w);
   768 			DrawOrdersWindow(w);
   542 		break;
   769 			break;
   543 
   770 
   544 	case WE_CLICK: {
   771 		case WE_CLICK:
   545 		const Vehicle *v = GetVehicle(w->window_number);
   772 			if (w->widget[e->we.click.widget].type != WWT_DROPDOWN) HideDropDownMenu(w);
   546 		switch (e->we.click.widget) {
   773 			switch (e->we.click.widget) {
   547 		case ORDER_WIDGET_ORDER_LIST: {
   774 				case ORDER_WIDGET_ORDER_LIST: {
       
   775 					ResetObjectToPlace();
       
   776 
       
   777 					int sel = GetOrderFromOrderWndPt(w, e->we.click.pt.y, v);
       
   778 
       
   779 					if (sel == INVALID_ORDER) {
       
   780 						/* This was a click on an empty part of the orders window, so
       
   781 						* deselect the currently selected order. */
       
   782 						WP(w, order_d).sel = -1;
       
   783 						SetWindowDirty(w);
       
   784 						return;
       
   785 					}
       
   786 
       
   787 					if (_ctrl_pressed && sel < v->num_orders) {
       
   788 						const Order *ord = GetVehicleOrder(v, sel);
       
   789 						TileIndex xy;
       
   790 
       
   791 						switch (ord->GetType()) {
       
   792 							case OT_GOTO_STATION:  xy = GetStation(ord->GetDestination())->xy ; break;
       
   793 							case OT_GOTO_DEPOT:    xy = (v->type == VEH_AIRCRAFT) ?  GetStation(ord->GetDestination())->xy : GetDepot(ord->GetDestination())->xy;    break;
       
   794 							case OT_GOTO_WAYPOINT: xy = GetWaypoint(ord->GetDestination())->xy; break;
       
   795 							default:               xy = 0; break;
       
   796 						}
       
   797 
       
   798 						if (xy != 0) ScrollMainWindowToTile(xy);
       
   799 						return;
       
   800 					} else {
       
   801 						if (sel == WP(w, order_d).sel) {
       
   802 							/* Deselect clicked order */
       
   803 							WP(w, order_d).sel = -1;
       
   804 						} else {
       
   805 							/* Select clicked order */
       
   806 							WP(w, order_d).sel = sel;
       
   807 
       
   808 							if (v->owner == _local_player) {
       
   809 								/* Activate drag and drop */
       
   810 								SetObjectToPlaceWnd(SPR_CURSOR_MOUSE, PAL_NONE, VHM_DRAG, w);
       
   811 							}
       
   812 						}
       
   813 					}
       
   814 
       
   815 					SetWindowDirty(w);
       
   816 				} break;
       
   817 
       
   818 				case ORDER_WIDGET_SKIP:
       
   819 					OrderClick_Skip(w, v, 0);
       
   820 					break;
       
   821 
       
   822 				case ORDER_WIDGET_DELETE:
       
   823 					OrderClick_Delete(w, v, 0);
       
   824 					break;
       
   825 
       
   826 				case ORDER_WIDGET_NON_STOP: {
       
   827 					const Order *o = GetVehicleOrder(v, OrderGetSel(w));
       
   828 					ShowDropDownMenu(w, _order_non_stop_drowdown, o->GetNonStopType(), ORDER_WIDGET_NON_STOP, 0, o->IsType(OT_GOTO_STATION) ? 0 : (o->IsType(OT_GOTO_WAYPOINT) ? 3 : 12));
       
   829 				} break;
       
   830 
       
   831 				case ORDER_WIDGET_GOTO:
       
   832 					OrderClick_Goto(w, v, 0);
       
   833 					break;
       
   834 
       
   835 				case ORDER_WIDGET_GOTO_DROPDOWN:
       
   836 					ShowDropDownMenu(w, v->type == VEH_AIRCRAFT ? _order_goto_dropdown_aircraft : _order_goto_dropdown, 0, ORDER_WIDGET_GOTO, 0, 0, w->widget[ORDER_WIDGET_GOTO_DROPDOWN].right - w->widget[ORDER_WIDGET_GOTO].left);
       
   837 					break;
       
   838 
       
   839 				case ORDER_WIDGET_FULL_LOAD:
       
   840 					ShowDropDownMenu(w, _order_full_load_drowdown, GetVehicleOrder(v, OrderGetSel(w))->GetLoadType(), ORDER_WIDGET_FULL_LOAD, 0, 2);
       
   841 					break;
       
   842 
       
   843 				case ORDER_WIDGET_UNLOAD:
       
   844 					ShowDropDownMenu(w, _order_unload_drowdown, GetVehicleOrder(v, OrderGetSel(w))->GetUnloadType(), ORDER_WIDGET_UNLOAD, 0, 8);
       
   845 					break;
       
   846 
       
   847 				case ORDER_WIDGET_REFIT:
       
   848 					OrderClick_Refit(w, v, 0);
       
   849 					break;
       
   850 
       
   851 				case ORDER_WIDGET_SERVICE:
       
   852 					OrderClick_Service(w, v, 0);
       
   853 					break;
       
   854 
       
   855 				case ORDER_WIDGET_TIMETABLE_VIEW:
       
   856 					ShowTimetableWindow(v);
       
   857 					break;
       
   858 
       
   859 				case ORDER_WIDGET_COND_VARIABLE:
       
   860 					ShowDropDownMenu(w, _order_conditional_variable, GetVehicleOrder(v, OrderGetSel(w))->GetConditionVariable(), ORDER_WIDGET_COND_VARIABLE, 0, 0);
       
   861 					break;
       
   862 
       
   863 				case ORDER_WIDGET_COND_COMPARATOR: {
       
   864 					const Order *o = GetVehicleOrder(v, OrderGetSel(w));
       
   865 					ShowDropDownMenu(w, _order_conditional_condition, o->GetConditionComparator(), ORDER_WIDGET_COND_COMPARATOR, 0, (o->GetConditionVariable() == OCV_REQUIRES_SERVICE) ? 0x3F : 0xC0);
       
   866 				} break;
       
   867 
       
   868 				case ORDER_WIDGET_COND_VALUE: {
       
   869 					const Order *order = GetVehicleOrder(v, OrderGetSel(w));
       
   870 					uint value = order->GetConditionValue();
       
   871 					if (order->GetConditionVariable() == OCV_MAX_SPEED) value = ConvertSpeedToDisplaySpeed(value);
       
   872 					SetDParam(0, value);
       
   873 					ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_ORDER_CONDITIONAL_VALUE_CAPT, 5, 100, w, CS_NUMERAL);
       
   874 				} break;
       
   875 
       
   876 				case ORDER_WIDGET_SHARED_ORDER_LIST:
       
   877 					ShowVehicleListWindow(v);
       
   878 					break;
       
   879 			}
       
   880 			break;
       
   881 
       
   882 		case WE_ON_EDIT_TEXT:
       
   883 			if (!StrEmpty(e->we.edittext.str)) {
       
   884 				VehicleOrderID sel = OrderGetSel(w);
       
   885 				uint value = atoi(e->we.edittext.str);
       
   886 
       
   887 				switch (GetVehicleOrder(v, sel)->GetConditionVariable()) {
       
   888 					case OCV_MAX_SPEED:
       
   889 						value = ConvertDisplaySpeedToSpeed(value);
       
   890 						break;
       
   891 
       
   892 					case OCV_RELIABILITY:
       
   893 					case OCV_LOAD_PERCENTAGE:
       
   894 						value = Clamp(value, 0, 100);
       
   895 
       
   896 					default:
       
   897 						break;
       
   898 				}
       
   899 				DoCommandP(v->tile, v->index + (sel << 16), MOF_COND_VALUE | Clamp(value, 0, 2047) << 4, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
       
   900 			}
       
   901 			break;
       
   902 
       
   903 		case WE_DROPDOWN_SELECT: // we have selected a dropdown item in the list
       
   904 			switch (e->we.dropdown.button) {
       
   905 				case ORDER_WIDGET_NON_STOP:
       
   906 					OrderClick_Nonstop(w, v, e->we.dropdown.index);
       
   907 					break;
       
   908 
       
   909 				case ORDER_WIDGET_FULL_LOAD:
       
   910 					OrderClick_FullLoad(w, v, e->we.dropdown.index);
       
   911 					break;
       
   912 
       
   913 				case ORDER_WIDGET_UNLOAD:
       
   914 					OrderClick_Unload(w, v, e->we.dropdown.index);
       
   915 					break;
       
   916 
       
   917 				case ORDER_WIDGET_GOTO:
       
   918 					switch (e->we.dropdown.index) {
       
   919 						case 0:
       
   920 							w->ToggleWidgetLoweredState(ORDER_WIDGET_GOTO);
       
   921 							OrderClick_Goto(w, v, 0);
       
   922 							break;
       
   923 
       
   924 						case 1: OrderClick_NearestDepot(w, v, 0); break;
       
   925 						case 2: OrderClick_Conditional(w, v, 0); break;
       
   926 						default: NOT_REACHED();
       
   927 					}
       
   928 					break;
       
   929 
       
   930 				case ORDER_WIDGET_COND_VARIABLE:
       
   931 					DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), MOF_COND_VARIABLE | e->we.dropdown.index << 4,  NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
       
   932 					break;
       
   933 
       
   934 				case ORDER_WIDGET_COND_COMPARATOR:
       
   935 					DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), MOF_COND_COMPARATOR | e->we.dropdown.index << 4,  NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
       
   936 					break;
       
   937 			}
       
   938 			break;
       
   939 
       
   940 		case WE_DRAGDROP:
       
   941 			switch (e->we.click.widget) {
       
   942 				case ORDER_WIDGET_ORDER_LIST: {
       
   943 					int from_order = OrderGetSel(w);
       
   944 					int to_order = GetOrderFromOrderWndPt(w, e->we.dragdrop.pt.y, v);
       
   945 
       
   946 					if (!(from_order == to_order || from_order == INVALID_ORDER || from_order > v->num_orders || to_order == INVALID_ORDER || to_order > v->num_orders) &&
       
   947 							DoCommandP(v->tile, v->index, from_order | (to_order << 16), NULL, CMD_MOVE_ORDER | CMD_MSG(STR_CAN_T_MOVE_THIS_ORDER))) {
       
   948 						WP(w, order_d).sel = -1;
       
   949 					}
       
   950 
       
   951 				} break;
       
   952 
       
   953 				case ORDER_WIDGET_DELETE:
       
   954 					OrderClick_Delete(w, v, 0);
       
   955 					break;
       
   956 			}
       
   957 
   548 			ResetObjectToPlace();
   958 			ResetObjectToPlace();
   549 
   959 			break;
   550 			int sel = GetOrderFromOrderWndPt(w, e->we.click.pt.y, v);
   960 
   551 
   961 		case WE_KEYPRESS:
   552 			if (sel == INVALID_ORDER) {
   962 			if (v->owner != _local_player) break;
   553 				/* This was a click on an empty part of the orders window, so
   963 
   554 				 * deselect the currently selected order. */
   964 			for (uint i = 0; i < lengthof(_order_keycodes); i++) {
   555 				WP(w, order_d).sel = -1;
   965 				if (e->we.keypress.keycode == _order_keycodes[i]) {
   556 				SetWindowDirty(w);
   966 					e->we.keypress.cont = false;
   557 				return;
   967 					/* see if the button is disabled */
       
   968 					if (!w->IsWidgetDisabled(i + ORDER_WIDGET_SKIP)) _order_button_proc[i](w, v, -1);
       
   969 					break;
       
   970 				}
   558 			}
   971 			}
   559 
   972 			break;
   560 			if (_ctrl_pressed && sel < v->num_orders) {
   973 
   561 				const Order *ord = GetVehicleOrder(v, sel);
   974 		case WE_PLACE_OBJ:
   562 				TileIndex xy;
   975 			if (WP(w, order_d).goto_type == OPOS_GOTO) {
   563 
   976 				OrdersPlaceObj(GetVehicle(w->window_number), e->we.place.tile, w);
   564 				switch (ord->GetType()) {
   977 			}
   565 					case OT_GOTO_STATION:  xy = GetStation(ord->GetDestination())->xy ; break;
   978 			break;
   566 					case OT_GOTO_DEPOT:    xy = (v->type == VEH_AIRCRAFT) ?  GetStation(ord->GetDestination())->xy : GetDepot(ord->GetDestination())->xy;    break;
   979 
   567 					case OT_GOTO_WAYPOINT: xy = GetWaypoint(ord->GetDestination())->xy; break;
   980 		case WE_ABORT_PLACE_OBJ:
   568 					default:               xy = 0; break;
   981 			if (WP(w, order_d).goto_type == OPOS_CONDITIONAL) {
   569 				}
   982 				WP(w, order_d).goto_type = OPOS_GOTO;
   570 
   983 				if (_cursor.pos.x >= (w->left + w->widget[ORDER_WIDGET_ORDER_LIST].left) &&
   571 				if (xy != 0) ScrollMainWindowToTile(xy);
   984 						_cursor.pos.y >= (w->top  + w->widget[ORDER_WIDGET_ORDER_LIST].top) &&
   572 				return;
   985 						_cursor.pos.x <= (w->left + w->widget[ORDER_WIDGET_ORDER_LIST].right) &&
   573 			} else {
   986 						_cursor.pos.y <= (w->top  + w->widget[ORDER_WIDGET_ORDER_LIST].bottom)) {
   574 				if (sel == WP(w, order_d).sel) {
   987 					int order_id = GetOrderFromOrderWndPt(w, _cursor.pos.y - w->top, v);
   575 					/* Deselect clicked order */
   988 					if (order_id != INVALID_ORDER) {
   576 					WP(w, order_d).sel = -1;
   989 						Order order;
   577 				} else {
   990 						order.next = NULL;
   578 					/* Select clicked order */
   991 						order.index = 0;
   579 					WP(w, order_d).sel = sel;
   992 						order.MakeConditional(order_id);
   580 
   993 
   581 					if (v->owner == _local_player) {
   994 						DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), order.Pack(), NULL, CMD_INSERT_ORDER | CMD_MSG(STR_8833_CAN_T_INSERT_NEW_ORDER));
   582 						/* Activate drag and drop */
       
   583 						SetObjectToPlaceWnd(SPR_CURSOR_MOUSE, PAL_NONE, VHM_DRAG, w);
       
   584 					}
   995 					}
   585 				}
   996 				}
   586 			}
   997 			}
   587 
   998 			w->RaiseWidget(ORDER_WIDGET_GOTO);
   588 			SetWindowDirty(w);
   999 			w->InvalidateWidget(ORDER_WIDGET_GOTO);
   589 		} break;
       
   590 
       
   591 		case ORDER_WIDGET_SKIP:
       
   592 			OrderClick_Skip(w, v);
       
   593 			break;
  1000 			break;
   594 
  1001 
   595 		case ORDER_WIDGET_DELETE:
  1002 		/* check if a vehicle in a depot was clicked.. */
   596 			OrderClick_Delete(w, v);
  1003 		case WE_MOUSELOOP:
       
  1004 			v = _place_clicked_vehicle;
       
  1005 			/*
       
  1006 			* Check if we clicked on a vehicle
       
  1007 			* and if the GOTO button of this window is pressed
       
  1008 			* This is because of all open order windows WE_MOUSELOOP is called
       
  1009 			* and if you have 3 windows open, and this check is not done
       
  1010 			* the order is copied to the last open window instead of the
       
  1011 			* one where GOTO is enabled
       
  1012 			*/
       
  1013 			if (v != NULL && w->IsWidgetLowered(ORDER_WIDGET_GOTO)) {
       
  1014 				_place_clicked_vehicle = NULL;
       
  1015 				HandleOrderVehClick(GetVehicle(w->window_number), v, w);
       
  1016 			}
   597 			break;
  1017 			break;
   598 
  1018 
   599 		case ORDER_WIDGET_NON_STOP:
  1019 		case WE_RESIZE:
   600 			OrderClick_Nonstop(w, v);
  1020 			/* Update the scroll + matrix */
       
  1021 			w->vscroll.cap = (w->widget[ORDER_WIDGET_ORDER_LIST].bottom - w->widget[ORDER_WIDGET_ORDER_LIST].top) / 10;
   601 			break;
  1022 			break;
   602 
  1023 
   603 		case ORDER_WIDGET_GOTO:
  1024 		case WE_TIMEOUT: // handle button unclick ourselves...
   604 			OrderClick_Goto(w, v);
  1025 			/* unclick all buttons except for the 'goto' button (ORDER_WIDGET_GOTO), which is 'persistent' */
       
  1026 			for (uint i = 0; i < w->widget_count; i++) {
       
  1027 				if (w->IsWidgetLowered(i) && i != ORDER_WIDGET_GOTO) {
       
  1028 					w->RaiseWidget(i);
       
  1029 					w->InvalidateWidget(i);
       
  1030 				}
       
  1031 			}
   605 			break;
  1032 			break;
   606 
       
   607 		case ORDER_WIDGET_FULL_LOAD:
       
   608 			OrderClick_FullLoad(w, v);
       
   609 			break;
       
   610 
       
   611 		case ORDER_WIDGET_UNLOAD:
       
   612 			OrderClick_Unload(w, v);
       
   613 			break;
       
   614 		case ORDER_WIDGET_REFIT:
       
   615 			OrderClick_Refit(w, v);
       
   616 			break;
       
   617 
       
   618 		case ORDER_WIDGET_TRANSFER:
       
   619 			OrderClick_Transfer(w, v);
       
   620 			break;
       
   621 
       
   622 		case ORDER_WIDGET_TIMETABLE_VIEW:
       
   623 			ShowTimetableWindow(v);
       
   624 			break;
       
   625 
       
   626 		case ORDER_WIDGET_SHARED_ORDER_LIST:
       
   627 			ShowVehicleListWindow(v);
       
   628 			break;
       
   629 		}
       
   630 	} break;
       
   631 
       
   632 	case WE_DRAGDROP: {
       
   633 		const Vehicle *v = GetVehicle(w->window_number);
       
   634 
       
   635 		switch (e->we.click.widget) {
       
   636 			case ORDER_WIDGET_ORDER_LIST: {
       
   637 				int from_order = OrderGetSel(w);
       
   638 				int to_order = GetOrderFromOrderWndPt(w, e->we.dragdrop.pt.y, v);
       
   639 
       
   640 				if (!(from_order == to_order || from_order == INVALID_ORDER || from_order > v->num_orders || to_order == INVALID_ORDER || to_order > v->num_orders) &&
       
   641 						DoCommandP(v->tile, v->index, from_order | (to_order << 16), NULL, CMD_MOVE_ORDER | CMD_MSG(STR_CAN_T_MOVE_THIS_ORDER))) {
       
   642 					WP(w, order_d).sel = -1;
       
   643 				}
       
   644 
       
   645 				break;
       
   646 			}
       
   647 
       
   648 			case ORDER_WIDGET_DELETE:
       
   649 				OrderClick_Delete(w, v);
       
   650 				break;
       
   651 		}
       
   652 
       
   653 		ResetObjectToPlace();
       
   654 		break;
       
   655 	}
       
   656 
       
   657 	case WE_KEYPRESS: {
       
   658 		Vehicle *v = GetVehicle(w->window_number);
       
   659 		uint i;
       
   660 
       
   661 		if (v->owner != _local_player) break;
       
   662 
       
   663 		for (i = 0; i < lengthof(_order_keycodes); i++) {
       
   664 			if (e->we.keypress.keycode == _order_keycodes[i]) {
       
   665 				e->we.keypress.cont = false;
       
   666 				//see if the button is disabled
       
   667 				if (!w->IsWidgetDisabled(i + ORDER_WIDGET_SKIP)) _order_button_proc[i](w, v);
       
   668 				break;
       
   669 			}
       
   670 		}
       
   671 		break;
       
   672 	}
       
   673 
       
   674 	case WE_RCLICK: {
       
   675 		const Vehicle *v = GetVehicle(w->window_number);
       
   676 		int s = OrderGetSel(w);
       
   677 
       
   678 		if (e->we.click.widget != ORDER_WIDGET_FULL_LOAD) break;
       
   679 		if (s == v->num_orders || !GetVehicleOrder(v, s)->IsType(OT_GOTO_DEPOT)) {
       
   680 			GuiShowTooltips(STR_8857_MAKE_THE_HIGHLIGHTED_ORDER);
       
   681 		} else {
       
   682 			GuiShowTooltips(STR_SERVICE_HINT);
       
   683 		}
       
   684 	} break;
       
   685 
       
   686 	case WE_PLACE_OBJ: {
       
   687 		OrdersPlaceObj(GetVehicle(w->window_number), e->we.place.tile, w);
       
   688 	} break;
       
   689 
       
   690 	case WE_ABORT_PLACE_OBJ: {
       
   691 		w->RaiseWidget(ORDER_WIDGET_GOTO);
       
   692 		w->InvalidateWidget(ORDER_WIDGET_GOTO);
       
   693 	} break;
       
   694 
       
   695 	// check if a vehicle in a depot was clicked..
       
   696 	case WE_MOUSELOOP: {
       
   697 		const Vehicle *v = _place_clicked_vehicle;
       
   698 		/*
       
   699 		 * Check if we clicked on a vehicle
       
   700 		 * and if the GOTO button of this window is pressed
       
   701 		 * This is because of all open order windows WE_MOUSELOOP is called
       
   702 		 * and if you have 3 windows open, and this check is not done
       
   703 		 * the order is copied to the last open window instead of the
       
   704 		 * one where GOTO is enabled
       
   705 		 */
       
   706 		if (v != NULL && w->IsWidgetLowered(ORDER_WIDGET_GOTO)) {
       
   707 			_place_clicked_vehicle = NULL;
       
   708 			HandleOrderVehClick(GetVehicle(w->window_number), v, w);
       
   709 		}
       
   710 	} break;
       
   711 
       
   712 	case WE_RESIZE:
       
   713 		/* Update the scroll + matrix */
       
   714 		w->vscroll.cap = (w->widget[ORDER_WIDGET_ORDER_LIST].bottom - w->widget[ORDER_WIDGET_ORDER_LIST].top) / 10;
       
   715 		break;
       
   716 
       
   717 	case WE_TIMEOUT: { // handle button unclick ourselves...
       
   718 		// unclick all buttons except for the 'goto' button (ORDER_WIDGET_GOTO), which is 'persistent'
       
   719 		uint i;
       
   720 		for (i = 0; i < w->widget_count; i++) {
       
   721 			if (w->IsWidgetLowered(i) && i != ORDER_WIDGET_GOTO) {
       
   722 				w->RaiseWidget(i);
       
   723 				w->InvalidateWidget(i);
       
   724 			}
       
   725 		}
       
   726 	} break;
       
   727 	}
  1033 	}
   728 }
  1034 }
   729 
  1035 
   730 /**
  1036 /**
   731  * Widget definition for player train orders
  1037  * Widget definition for player train orders
   732  */
  1038  */
   733 static const Widget _orders_train_widgets[] = {
  1039 static const Widget _orders_train_widgets[] = {
   734 	{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,                STR_018B_CLOSE_WINDOW},               // ORDER_WIDGET_CLOSEBOX
  1040 	{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,                STR_018B_CLOSE_WINDOW},               // ORDER_WIDGET_CLOSEBOX
   735 	{    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   398,     0,    13, STR_8829_ORDERS,         STR_018C_WINDOW_TITLE_DRAG_THIS},     // ORDER_WIDGET_CAPTION
  1041 	{    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   385,     0,    13, STR_8829_ORDERS,         STR_018C_WINDOW_TITLE_DRAG_THIS},     // ORDER_WIDGET_CAPTION
   736 	{ WWT_PUSHTXTBTN,   RESIZE_LR,      14,   338,   398,     0,    13, STR_TIMETABLE_VIEW,      STR_TIMETABLE_VIEW_TOOLTIP},          // ORDER_WIDGET_TIMETABLE_VIEW
  1042 	{ WWT_PUSHTXTBTN,   RESIZE_LR,      14,   325,   385,     0,    13, STR_TIMETABLE_VIEW,      STR_TIMETABLE_VIEW_TOOLTIP},          // ORDER_WIDGET_TIMETABLE_VIEW
   737 
  1043 
   738 	{      WWT_PANEL,   RESIZE_RB,      14,     0,   386,    14,    75, 0x0,                     STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, // ORDER_WIDGET_ORDER_LIST
  1044 	{      WWT_PANEL,   RESIZE_RB,      14,     0,   373,    14,    75, 0x0,                     STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, // ORDER_WIDGET_ORDER_LIST
   739 
  1045 
   740 	{  WWT_SCROLLBAR,   RESIZE_LRB,     14,   387,   398,    14,    75, 0x0,                     STR_0190_SCROLL_BAR_SCROLLS_LIST},    // ORDER_WIDGET_SCROLLBAR
  1046 	{  WWT_SCROLLBAR,   RESIZE_LRB,     14,   374,   385,    14,    75, 0x0,                     STR_0190_SCROLL_BAR_SCROLLS_LIST},    // ORDER_WIDGET_SCROLLBAR
   741 
  1047 
   742 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,    52,    76,    87, STR_8823_SKIP,           STR_8853_SKIP_THE_CURRENT_ORDER},     // ORDER_WIDGET_SKIP
  1048 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,   123,    88,    99, STR_8823_SKIP,           STR_8853_SKIP_THE_CURRENT_ORDER},     // ORDER_WIDGET_SKIP
   743 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,    53,   105,    76,    87, STR_8824_DELETE,         STR_8854_DELETE_THE_HIGHLIGHTED},     // ORDER_WIDGET_DELETE
  1049 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   124,   247,    88,    99, STR_8824_DELETE,         STR_8854_DELETE_THE_HIGHLIGHTED},     // ORDER_WIDGET_DELETE
   744 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   106,   158,    76,    87, STR_8825_NON_STOP,       STR_8855_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_NON_STOP
  1050 	{   WWT_DROPDOWN,   RESIZE_TB,      14,     0,   123,    76,    87, STR_NULL,                STR_ORDER_TOOLTIP_NON_STOP},          // ORDER_WIDGET_NON_STOP
   745 	{    WWT_TEXTBTN,   RESIZE_TB,      14,   159,   211,    76,    87, STR_8826_GO_TO,          STR_8856_INSERT_A_NEW_ORDER_BEFORE},  // ORDER_WIDGET_GOTO
  1051 	{    WWT_TEXTBTN,   RESIZE_TB,      14,   248,   359,    88,    99, STR_8826_GO_TO,          STR_8856_INSERT_A_NEW_ORDER_BEFORE},  // ORDER_WIDGET_GOTO
   746 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   212,   264,    76,    87, STR_FULLLOAD_OR_SERVICE, STR_NULL},                            // ORDER_WIDGET_FULL_LOAD
  1052 	{   WWT_DROPDOWN,   RESIZE_TB,      14,   360,   371,    88,    99, STR_EMPTY,               STR_ORDER_GO_TO_DROPDOWN_TOOLTIP},    // ORDER_WIDGET_GOTO_DROPDOWN
   747 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   265,   319,    76,    87, STR_8828_UNLOAD,         STR_8858_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_UNLOAD
  1053 	{   WWT_DROPDOWN,   RESIZE_TB,      14,   124,   247,    76,    87, STR_NULL,                STR_ORDER_TOOLTIP_FULL_LOAD},         // ORDER_WIDGET_FULL_LOAD
   748 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   265,   319,    76,    87, STR_REFIT,               STR_REFIT_TIP},                       // ORDER_WIDGET_REFIT
  1054 	{   WWT_DROPDOWN,   RESIZE_TB,      14,   248,   371,    76,    87, STR_NULL,                STR_ORDER_TOOLTIP_UNLOAD},            // ORDER_WIDGET_UNLOAD
   749 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   320,   372,    76,    87, STR_TRANSFER,            STR_MAKE_THE_HIGHLIGHTED_ORDER},      // ORDER_WIDGET_TRANSFER
  1055 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   124,   247,    76,    87, STR_REFIT,               STR_REFIT_TIP},                       // ORDER_WIDGET_REFIT
   750 
  1056 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   248,   371,    76,    87, STR_SERVICE,             STR_SERVICE_HINT},                    // ORDER_WIDGET_SERVICE
   751 	{ 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
  1057 
   752 
  1058 	{   WWT_DROPDOWN,   RESIZE_TB,      14,     0,   123,    76,    87, STR_NULL,                STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP},   // ORDER_WIDGET_COND_VARIABLE
   753 	{      WWT_PANEL,   RESIZE_RTB,     14,   387,   386,    76,    87, 0x0,                     STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
  1059 	{   WWT_DROPDOWN,   RESIZE_TB,      14,   124,   247,    76,    87, STR_NULL,                STR_ORDER_CONDITIONAL_COMPARATOR_TOOLTIP}, // ORDER_WIDGET_COND_COMPARATOR
   754 
  1060 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   248,   371,    76,    87, STR_CONDITIONAL_VALUE,   STR_ORDER_CONDITIONAL_VALUE_TOOLTIP},      // ORDER_WIDGET_COND_VALUE
   755 	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   387,   398,    76,    87, 0x0,                     STR_RESIZE_BUTTON},                   // ORDER_WIDGET_RESIZE
  1061 
       
  1062 	{      WWT_PANEL,   RESIZE_RTB,     14,   372,   373,    76,    99, 0x0,                     STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
       
  1063 	{ 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
       
  1064 
       
  1065 	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   374,   385,    88,    99, 0x0,                     STR_RESIZE_BUTTON},                   // ORDER_WIDGET_RESIZE
   756 	{   WIDGETS_END},
  1066 	{   WIDGETS_END},
   757 };
  1067 };
   758 
  1068 
   759 static const WindowDesc _orders_train_desc = {
  1069 static const WindowDesc _orders_train_desc = {
   760 	WDP_AUTO, WDP_AUTO, 399, 88, 399, 88,
  1070 	WDP_AUTO, WDP_AUTO, 386, 100, 386, 100,
   761 	WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW,
  1071 	WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW,
   762 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE,
  1072 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE,
   763 	_orders_train_widgets,
  1073 	_orders_train_widgets,
   764 	OrdersWndProc
  1074 	OrdersWndProc
   765 };
  1075 };
   767 /**
  1077 /**
   768  * Widget definition for player orders (!train)
  1078  * Widget definition for player orders (!train)
   769  */
  1079  */
   770 static const Widget _orders_widgets[] = {
  1080 static const Widget _orders_widgets[] = {
   771 	{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,                STR_018B_CLOSE_WINDOW},               // ORDER_WIDGET_CLOSEBOX
  1081 	{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,                STR_018B_CLOSE_WINDOW},               // ORDER_WIDGET_CLOSEBOX
   772 	{    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   409,     0,    13, STR_8829_ORDERS,         STR_018C_WINDOW_TITLE_DRAG_THIS},     // ORDER_WIDGET_CAPTION
  1082 	{    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   385,     0,    13, STR_8829_ORDERS,         STR_018C_WINDOW_TITLE_DRAG_THIS},     // ORDER_WIDGET_CAPTION
   773 	{ WWT_PUSHTXTBTN,   RESIZE_LR,      14,   349,   409,     0,    13, STR_TIMETABLE_VIEW,      STR_TIMETABLE_VIEW_TOOLTIP},          // ORDER_WIDGET_TIMETABLE_VIEW
  1083 	{ WWT_PUSHTXTBTN,   RESIZE_LR,      14,   325,   385,     0,    13, STR_TIMETABLE_VIEW,      STR_TIMETABLE_VIEW_TOOLTIP},          // ORDER_WIDGET_TIMETABLE_VIEW
   774 
  1084 
   775 	{      WWT_PANEL,   RESIZE_RB,      14,     0,   397,    14,    75, 0x0,                     STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, // ORDER_WIDGET_ORDER_LIST
  1085 	{      WWT_PANEL,   RESIZE_RB,      14,     0,   373,    14,    75, 0x0,                     STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, // ORDER_WIDGET_ORDER_LIST
   776 
  1086 
   777 	{  WWT_SCROLLBAR,   RESIZE_LRB,     14,   398,   409,    14,    75, 0x0,                     STR_0190_SCROLL_BAR_SCROLLS_LIST},    // ORDER_WIDGET_SCROLLBAR
  1087 	{  WWT_SCROLLBAR,   RESIZE_LRB,     14,   374,   385,    14,    75, 0x0,                     STR_0190_SCROLL_BAR_SCROLLS_LIST},    // ORDER_WIDGET_SCROLLBAR
   778 
  1088 
   779 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,    63,    76,    87, STR_8823_SKIP,           STR_8853_SKIP_THE_CURRENT_ORDER},     // ORDER_WIDGET_SKIP
  1089 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,   123,    88,    99, STR_8823_SKIP,           STR_8853_SKIP_THE_CURRENT_ORDER},     // ORDER_WIDGET_SKIP
   780 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,    64,   128,    76,    87, STR_8824_DELETE,         STR_8854_DELETE_THE_HIGHLIGHTED},     // ORDER_WIDGET_DELETE
  1090 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   124,   247,    88,    99, STR_8824_DELETE,         STR_8854_DELETE_THE_HIGHLIGHTED},     // ORDER_WIDGET_DELETE
   781 	{      WWT_EMPTY,   RESIZE_TB,      14,     0,     0,    76,    87, 0x0,                     0x0},                                 // ORDER_WIDGET_NON_STOP
  1091 	{      WWT_EMPTY,   RESIZE_TB,      14,     0,     0,    76,    87, 0x0,                     0x0},                                 // ORDER_WIDGET_NON_STOP
   782 	{    WWT_TEXTBTN,   RESIZE_TB,      14,   129,   192,    76,    87, STR_8826_GO_TO,          STR_8856_INSERT_A_NEW_ORDER_BEFORE},  // ORDER_WIDGET_GOTO
  1092 	{    WWT_TEXTBTN,   RESIZE_TB,      14,   248,   359,    88,    99, STR_8826_GO_TO,          STR_8856_INSERT_A_NEW_ORDER_BEFORE},  // ORDER_WIDGET_GOTO
   783 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   193,   256,    76,    87, STR_FULLLOAD_OR_SERVICE, STR_NULL},                            // ORDER_WIDGET_FULL_LOAD
  1093 	{   WWT_DROPDOWN,   RESIZE_TB,      14,   360,   371,    88,    99, STR_EMPTY,               STR_ORDER_GO_TO_DROPDOWN_TOOLTIP},    // ORDER_WIDGET_GOTO_DROPDOWN
   784 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   257,   319,    76,    87, STR_8828_UNLOAD,         STR_8858_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_UNLOAD
  1094 	{   WWT_DROPDOWN,   RESIZE_TB,      14,     0,   185,    76,    87, STR_NULL,                STR_ORDER_TOOLTIP_FULL_LOAD},         // ORDER_WIDGET_FULL_LOAD
   785 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   257,   319,    76,    87, STR_REFIT,               STR_REFIT_TIP},                       // ORDER_WIDGET_REFIT
  1095 	{   WWT_DROPDOWN,   RESIZE_TB,      14,   186,   371,    76,    87, STR_NULL,                STR_ORDER_TOOLTIP_UNLOAD},            // ORDER_WIDGET_UNLOAD
   786 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   320,   383,    76,    87, STR_TRANSFER,            STR_MAKE_THE_HIGHLIGHTED_ORDER},      // ORDER_WIDGET_TRANSFER
  1096 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,   185,    76,    87, STR_REFIT,               STR_REFIT_TIP},                       // ORDER_WIDGET_REFIT
   787 
  1097 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   186,   371,    76,    87, STR_SERVICE,             STR_SERVICE_HINT},                    // ORDER_WIDGET_SERVICE
   788 	{ 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
  1098 
   789 
  1099 	{   WWT_DROPDOWN,   RESIZE_TB,      14,     0,   123,    76,    87, STR_NULL,                STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP},   // ORDER_WIDGET_COND_VARIABLE
   790 	{      WWT_PANEL,   RESIZE_RTB,     14,   397,   396,    76,    87, 0x0,                     STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
  1100 	{   WWT_DROPDOWN,   RESIZE_TB,      14,   124,   247,    76,    87, STR_NULL,                STR_ORDER_CONDITIONAL_COMPARATOR_TOOLTIP}, // ORDER_WIDGET_COND_COMPARATOR
   791 
  1101 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   248,   371,    76,    87, STR_CONDITIONAL_VALUE,   STR_ORDER_CONDITIONAL_VALUE_TOOLTIP},      // ORDER_WIDGET_COND_VALUE
   792 	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   398,   409,    76,    87, 0x0,                     STR_RESIZE_BUTTON},                   // ORDER_WIDGET_RESIZE
  1102 
       
  1103 	{      WWT_PANEL,   RESIZE_RTB,     14,   372,   373,    76,    99, 0x0,                     STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
       
  1104 	{ 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
       
  1105 
       
  1106 	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   374,   385,    88,    99, 0x0,                     STR_RESIZE_BUTTON},                   // ORDER_WIDGET_RESIZE
   793 	{   WIDGETS_END},
  1107 	{   WIDGETS_END},
   794 };
  1108 };
   795 
  1109 
   796 static const WindowDesc _orders_desc = {
  1110 static const WindowDesc _orders_desc = {
   797 	WDP_AUTO, WDP_AUTO, 410, 88, 410, 88,
  1111 	WDP_AUTO, WDP_AUTO, 386, 100, 386, 100,
   798 	WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW,
  1112 	WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW,
   799 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE,
  1113 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE,
   800 	_orders_widgets,
  1114 	_orders_widgets,
   801 	OrdersWndProc
  1115 	OrdersWndProc
   802 };
  1116 };
   804 /**
  1118 /**
   805  * Widget definition for competitor orders
  1119  * Widget definition for competitor orders
   806  */
  1120  */
   807 static const Widget _other_orders_widgets[] = {
  1121 static const Widget _other_orders_widgets[] = {
   808 	{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,           STR_018B_CLOSE_WINDOW},               // ORDER_WIDGET_CLOSEBOX
  1122 	{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,           STR_018B_CLOSE_WINDOW},               // ORDER_WIDGET_CLOSEBOX
   809 	{    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   331,     0,    13, STR_A00B_ORDERS,    STR_018C_WINDOW_TITLE_DRAG_THIS},     // ORDER_WIDGET_CAPTION
  1123 	{    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   385,     0,    13, STR_8829_ORDERS,    STR_018C_WINDOW_TITLE_DRAG_THIS},     // ORDER_WIDGET_CAPTION
   810 	{ WWT_PUSHTXTBTN,   RESIZE_LR,      14,   271,   331,     0,    13, STR_TIMETABLE_VIEW, STR_TIMETABLE_VIEW_TOOLTIP},          // ORDER_WIDGET_TIMETABLE_VIEW
  1124 	{ WWT_PUSHTXTBTN,   RESIZE_LR,      14,   325,   385,     0,    13, STR_TIMETABLE_VIEW, STR_TIMETABLE_VIEW_TOOLTIP},          // ORDER_WIDGET_TIMETABLE_VIEW
   811 
  1125 
   812 	{      WWT_PANEL,   RESIZE_RB,      14,     0,   319,    14,    75, 0x0,                STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, // ORDER_WIDGET_ORDER_LIST
  1126 	{      WWT_PANEL,   RESIZE_RB,      14,     0,   373,    14,    75, 0x0,                STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, // ORDER_WIDGET_ORDER_LIST
   813 
  1127 
   814 	{  WWT_SCROLLBAR,   RESIZE_LRB,     14,   320,   331,    14,    75, 0x0,                STR_0190_SCROLL_BAR_SCROLLS_LIST},    // ORDER_WIDGET_SCROLLBAR
  1128 	{  WWT_SCROLLBAR,   RESIZE_LRB,     14,   374,   385,    14,    75, 0x0,                STR_0190_SCROLL_BAR_SCROLLS_LIST},    // ORDER_WIDGET_SCROLLBAR
   815 
  1129 
   816 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_SKIP
  1130 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_SKIP
   817 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_DELETE
  1131 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_DELETE
   818 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_NON_STOP
  1132 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_NON_STOP
   819 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_GOTO
  1133 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_GOTO
   820 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_FULL_LOAD
  1134 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_GOTO_DROPDOWN
   821 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_UNLOAD
  1135 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_FULL_LOAD
   822 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_REFIT
  1136 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_UNLOAD
   823 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_TRANSFER
  1137 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_REFIT
   824 
  1138 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_SERVICE
   825 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_SHARED_ORDER_LIST
  1139 
   826 
  1140 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_COND_VARIABLE
   827 	{      WWT_PANEL,   RESIZE_RTB,     14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
  1141 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_COND_COMPARATOR
   828 
  1142 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_COND_VALUE
   829 	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   320,   331,    76,    87, 0x0,                STR_RESIZE_BUTTON},                   // ORDER_WIDGET_RESIZE
  1143 
       
  1144 	{      WWT_PANEL,   RESIZE_RTB,     14,     0,   373,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
       
  1145 	{      WWT_EMPTY,   RESIZE_TB,      14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_SHARED_ORDER_LIST
       
  1146 
       
  1147 	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   374,   385,    76,    87, 0x0,                STR_RESIZE_BUTTON},                   // ORDER_WIDGET_RESIZE
   830 	{   WIDGETS_END},
  1148 	{   WIDGETS_END},
   831 };
  1149 };
   832 
  1150 
   833 static const WindowDesc _other_orders_desc = {
  1151 static const WindowDesc _other_orders_desc = {
   834 	WDP_AUTO, WDP_AUTO, 332, 88, 332, 88,
  1152 	WDP_AUTO, WDP_AUTO, 386, 88, 386, 88,
   835 	WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW,
  1153 	WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW,
   836 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE,
  1154 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE,
   837 	_other_orders_widgets,
  1155 	_other_orders_widgets,
   838 	OrdersWndProc
  1156 	OrdersWndProc
   839 };
  1157 };