tron@2186: /* $Id$ */ tron@2186: belugas@6677: /** @file order_gui.cpp */ belugas@6677: truelight@0: #include "stdafx.h" Darkvater@1891: #include "openttd.h" tron@3144: #include "road_map.h" tron@3315: #include "station_map.h" tron@1363: #include "table/sprites.h" tron@507: #include "table/strings.h" richk@6725: #include "strings.h" tron@2163: #include "functions.h" tron@679: #include "map.h" tron@1209: #include "tile.h" truelight@0: #include "window.h" truelight@0: #include "gui.h" truelight@0: #include "gfx.h" truelight@0: #include "vehicle.h" truelight@0: #include "station.h" truelight@0: #include "town.h" truelight@0: #include "command.h" truelight@0: #include "viewport.h" truelight@1313: #include "depot.h" truelight@1542: #include "waypoint.h" bjarni@2676: #include "train.h" celestar@3392: #include "water_map.h" bjarni@4668: #include "vehicle_gui.h" richk@6720: #include "timetable.h" peter1138@6417: #include "cargotype.h" truelight@0: bjarni@6079: enum OrderWindowWidgets { bjarni@6079: ORDER_WIDGET_CLOSEBOX = 0, bjarni@6079: ORDER_WIDGET_CAPTION, richk@6720: ORDER_WIDGET_TIMETABLE_VIEW, bjarni@6079: ORDER_WIDGET_ORDER_LIST, bjarni@6079: ORDER_WIDGET_SCROLLBAR, bjarni@6079: ORDER_WIDGET_SKIP, bjarni@6079: ORDER_WIDGET_DELETE, bjarni@6079: ORDER_WIDGET_NON_STOP, bjarni@6079: ORDER_WIDGET_GOTO, bjarni@6079: ORDER_WIDGET_FULL_LOAD, bjarni@6079: ORDER_WIDGET_UNLOAD, bjarni@6080: ORDER_WIDGET_REFIT, bjarni@6079: ORDER_WIDGET_TRANSFER, bjarni@6079: ORDER_WIDGET_SHARED_ORDER_LIST, bjarni@6079: ORDER_WIDGET_RESIZE_BAR, bjarni@6079: ORDER_WIDGET_RESIZE, bjarni@6079: }; bjarni@6079: richk@6720: /** richk@6720: * Return the memorised selected order. richk@6720: * richk@6720: * @param w current window richk@6720: * @return the memorised order if it is a vaild one richk@6720: * else return the number of orders richk@6720: */ belugas@4171: static int OrderGetSel(const Window *w) truelight@0: { belugas@4171: const Vehicle *v = GetVehicle(w->window_number); truelight@0: int num = WP(w,order_d).sel; truelight@0: tron@2549: return (num >= 0 && num < v->num_orders) ? num : v->num_orders; truelight@0: } truelight@0: richk@6720: /** richk@6720: * Calculate the selected order. richk@6720: * The calculation is based on the relative (to the window) y click position and richk@6720: * the position of the scrollbar. richk@6720: * richk@6720: * @param w current window richk@6720: * @param y Y-value of the click relative to the window origin richk@6720: * @param v current vehicle richk@6720: * @return the new selected order if the order is valid else return that richk@6720: * an invalid one has been selected. richk@6720: */ richk@6720: static int GetOrderFromOrderWndPt(Window *w, int y, const Vehicle *v) richk@6720: { richk@6720: /* richk@6720: * Calculation description: richk@6720: * 15 = 14 (w->widget[ORDER_WIDGET_ORDER_LIST].top) + 1 (frame-line) richk@6720: * 10 = order text hight richk@6720: */ richk@6720: int sel = (y - 15) / 10; richk@6720: richk@6720: if ((uint)sel >= w->vscroll.cap) return INVALID_ORDER; richk@6720: richk@6720: sel += w->vscroll.pos; richk@6720: richk@6720: return (sel <= v->num_orders && sel >= 0) ? sel : INVALID_ORDER; richk@6720: } richk@6720: celestar@1935: static StringID StationOrderStrings[] = { celestar@1937: STR_8806_GO_TO, celestar@1935: STR_8807_GO_TO_TRANSFER, celestar@1935: STR_8808_GO_TO_UNLOAD, celestar@1935: STR_8809_GO_TO_TRANSFER_UNLOAD, celestar@1935: STR_880A_GO_TO_LOAD, celestar@1935: STR_880B_GO_TO_TRANSFER_LOAD, celestar@1935: STR_NULL, celestar@1935: STR_NULL, celestar@1935: STR_880C_GO_NON_STOP_TO, celestar@1935: STR_880D_GO_TO_NON_STOP_TRANSFER, celestar@1935: STR_880E_GO_NON_STOP_TO_UNLOAD, celestar@1935: STR_880F_GO_TO_NON_STOP_TRANSFER_UNLOAD, celestar@1935: STR_8810_GO_NON_STOP_TO_LOAD, celestar@1935: STR_8811_GO_TO_NON_STOP_TRANSFER_LOAD, celestar@1935: STR_NULL celestar@1935: }; celestar@1935: truelight@0: static void DrawOrdersWindow(Window *w) truelight@0: { truelight@1024: const Vehicle *v; truelight@1024: const Order *order; truelight@1024: StringID str; truelight@1024: int sel; truelight@0: int y, i; truelight@1024: bool shared_orders; truelight@1024: byte color; truelight@0: truelight@919: v = GetVehicle(w->window_number); tron@1019: truelight@1024: shared_orders = IsOrderListShared(v); truelight@0: truelight@1024: SetVScrollCount(w, v->num_orders + 1); truelight@0: truelight@0: sel = OrderGetSel(w); truelight@1024: SetDParam(2, STR_8827_FULL_LOAD); truelight@193: truelight@1024: order = GetVehicleOrder(v, sel); tron@725: Darkvater@4949: if (v->owner == _local_player) { Darkvater@4949: /* skip */ richk@6720: SetWindowWidgetDisabledState(w, ORDER_WIDGET_SKIP, v->num_orders <= 1); belugas@4709: Darkvater@4949: /* delete */ bjarni@6079: SetWindowWidgetDisabledState(w, ORDER_WIDGET_DELETE, bjarni@6310: (uint)v->num_orders + ((shared_orders || v->num_orders != 0) ? 1 : 0) <= (uint)WP(w, order_d).sel); bjarni@4712: Darkvater@4949: /* non-stop only for trains */ rubidium@6585: SetWindowWidgetDisabledState(w, ORDER_WIDGET_NON_STOP, v->type != VEH_TRAIN || order == NULL); bjarni@6079: SetWindowWidgetDisabledState(w, ORDER_WIDGET_FULL_LOAD, order == NULL); // full load bjarni@6079: SetWindowWidgetDisabledState(w, ORDER_WIDGET_UNLOAD, order == NULL); // unload bjarni@6079: SetWindowWidgetDisabledState(w, ORDER_WIDGET_TRANSFER, order == NULL); // transfer Darkvater@4949: /* Disable list of vehicles with the same shared orders if there is no list */ bjarni@6079: SetWindowWidgetDisabledState(w, ORDER_WIDGET_SHARED_ORDER_LIST, !shared_orders || v->orders == NULL); bjarni@6079: SetWindowWidgetDisabledState(w, ORDER_WIDGET_REFIT, order == NULL); // Refit bjarni@6079: HideWindowWidget(w, ORDER_WIDGET_REFIT); // Refit Darkvater@4949: } else { bjarni@6079: DisableWindowWidget(w, ORDER_WIDGET_TRANSFER); Darkvater@4949: } bjarni@4712: bjarni@6079: ShowWindowWidget(w, ORDER_WIDGET_UNLOAD); // Unload belugas@4709: truelight@1024: if (order != NULL) { truelight@1024: switch (order->type) { Darkvater@4949: case OT_GOTO_STATION: break; tron@2549: truelight@1024: case OT_GOTO_DEPOT: bjarni@6079: DisableWindowWidget(w, ORDER_WIDGET_TRANSFER); bjarni@4712: bjarni@4712: /* Remove unload and replace it with refit */ bjarni@6079: HideWindowWidget(w, ORDER_WIDGET_UNLOAD); bjarni@6079: ShowWindowWidget(w, ORDER_WIDGET_REFIT); truelight@1024: SetDParam(2,STR_SERVICE); truelight@1024: break; tron@725: truelight@1024: case OT_GOTO_WAYPOINT: bjarni@6079: DisableWindowWidget(w, ORDER_WIDGET_FULL_LOAD); bjarni@6079: DisableWindowWidget(w, ORDER_WIDGET_UNLOAD); bjarni@6079: DisableWindowWidget(w, ORDER_WIDGET_TRANSFER); truelight@1024: break; truelight@1024: belugas@4709: default: // every other orders bjarni@6079: DisableWindowWidget(w, ORDER_WIDGET_NON_STOP); bjarni@6079: DisableWindowWidget(w, ORDER_WIDGET_FULL_LOAD); bjarni@6079: DisableWindowWidget(w, ORDER_WIDGET_UNLOAD); truelight@1024: } truelight@0: } truelight@0: richk@6720: SetDParam(0, v->index); truelight@0: DrawWindowWidgets(w); truelight@0: truelight@0: y = 15; truelight@0: truelight@1024: i = w->vscroll.pos; truelight@1024: order = GetVehicleOrder(v, i); truelight@1024: while (order != NULL) { truelight@1024: str = (v->cur_order_index == i) ? STR_8805 : STR_8804; bjarni@4712: SetDParam(3, STR_EMPTY); truelight@0: darkvater@1242: if (i - w->vscroll.pos < w->vscroll.cap) { truelight@1024: SetDParam(1, 6); truelight@1024: tron@2631: switch (order->type) { tron@2631: case OT_GOTO_STATION: tron@2631: SetDParam(1, StationOrderStrings[order->flags]); tron@4527: SetDParam(2, order->dest); tron@2631: break; celestar@1935: tron@2631: case OT_GOTO_DEPOT: { tron@2631: StringID s = STR_NULL; tron@2631: rubidium@6585: if (v->type == VEH_AIRCRAFT) { tron@2631: s = STR_GO_TO_AIRPORT_HANGAR; tron@4527: SetDParam(2, order->dest); tron@2631: } else { tron@4527: SetDParam(2, GetDepot(order->dest)->town_index); tron@2631: tron@2631: switch (v->type) { rubidium@6585: case VEH_TRAIN: s = (order->flags & OF_NON_STOP) ? STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT : STR_GO_TO_TRAIN_DEPOT; break; rubidium@6585: case VEH_ROAD: s = STR_9038_GO_TO_ROADVEH_DEPOT; break; rubidium@6585: case VEH_SHIP: s = STR_GO_TO_SHIP_DEPOT; break; tron@2631: default: break; tron@2631: } truelight@0: } celestar@1935: tron@2631: if (order->flags & OF_FULL_LOAD) s++; /* service at */ tron@2631: celestar@1935: SetDParam(1, s); bjarni@4782: if (order->refit_cargo < NUM_CARGO) { bjarni@4712: SetDParam(3, STR_REFIT_ORDER); peter1138@6417: SetDParam(4, GetCargo(order->refit_cargo)->name); bjarni@4782: } else { bjarni@4782: SetDParam(3, STR_EMPTY); bjarni@4712: } tron@2631: break; truelight@0: } truelight@1024: tron@2631: case OT_GOTO_WAYPOINT: tron@2631: SetDParam(1, (order->flags & OF_NON_STOP) ? STR_GO_NON_STOP_TO_WAYPOINT : STR_GO_TO_WAYPOINT); tron@4527: SetDParam(2, order->dest); tron@2631: break; truelight@4351: truelight@4351: default: break; truelight@0: } truelight@1024: truelight@1024: color = (i == WP(w,order_d).sel) ? 0xC : 0x10; truelight@1024: SetDParam(0, i + 1); truelight@1024: if (order->type != OT_DUMMY) { truelight@1024: DrawString(2, y, str, color); truelight@1024: } else { truelight@1024: SetDParam(1, STR_INVALID_ORDER); tron@4527: SetDParam(2, order->dest); truelight@1024: DrawString(2, y, str, color); truelight@0: } truelight@0: y += 10; truelight@0: } truelight@0: truelight@0: i++; truelight@1024: order = order->next; truelight@1024: } truelight@0: darkvater@1242: if (i - w->vscroll.pos < w->vscroll.cap) { truelight@1024: str = shared_orders ? STR_END_OF_SHARED_ORDERS : STR_882A_END_OF_ORDERS; truelight@1024: color = (i == WP(w,order_d).sel) ? 0xC : 0x10; truelight@1024: DrawString(2, y, str, color); truelight@0: } truelight@0: } truelight@0: Darkvater@2436: static Order GetOrderCmdFromTile(const Vehicle *v, TileIndex tile) truelight@0: { darkvater@558: Order order; peter1138@3387: order.next = NULL; peter1138@3387: order.index = 0; bjarni@4715: order.refit_cargo = CT_INVALID; bjarni@4715: order.refit_subtype = 0; truelight@0: truelight@0: // check depot first truelight@0: if (_patches.gotodepot) { tron@1214: switch (GetTileType(tile)) { truelight@0: case MP_RAILWAY: rubidium@6585: if (v->type == VEH_TRAIN && IsTileOwner(tile, _local_player)) { tron@4182: if (IsRailDepot(tile)) { darkvater@558: order.type = OT_GOTO_DEPOT; celestar@1530: order.flags = OF_PART_OF_ORDERS; tron@4527: order.dest = GetDepotByTile(tile)->index; darkvater@558: return order; Celestar@560: } truelight@0: } truelight@0: break; truelight@0: truelight@0: case MP_STREET: rubidium@6585: if (GetRoadTileType(tile) == ROAD_TILE_DEPOT && v->type == VEH_ROAD && IsTileOwner(tile, _local_player)) { darkvater@558: order.type = OT_GOTO_DEPOT; celestar@1530: order.flags = OF_PART_OF_ORDERS; tron@4527: order.dest = GetDepotByTile(tile)->index; darkvater@558: return order; Celestar@560: } truelight@0: break; truelight@0: truelight@0: case MP_STATION: rubidium@6585: if (v->type != VEH_AIRCRAFT) break; tron@3338: if (IsHangar(tile) && IsTileOwner(tile, _local_player)) { darkvater@558: order.type = OT_GOTO_DEPOT; Darkvater@2778: order.flags = OF_PART_OF_ORDERS; tron@4527: order.dest = GetStationIndex(tile); darkvater@558: return order; Celestar@560: } truelight@0: break; truelight@0: truelight@0: case MP_WATER: rubidium@6585: if (v->type != VEH_SHIP) break; tron@1334: if (IsTileDepotType(tile, TRANSPORT_WATER) && tron@1334: IsTileOwner(tile, _local_player)) { celestar@3392: TileIndex tile2 = GetOtherShipDepotTile(tile); celestar@3392: darkvater@558: order.type = OT_GOTO_DEPOT; celestar@1530: order.flags = OF_PART_OF_ORDERS; tron@4527: order.dest = GetDepotByTile(tile < tile2 ? tile : tile2)->index; darkvater@558: return order; truelight@0: } tron@1214: tron@1214: default: tron@1214: break; truelight@0: } truelight@0: } truelight@0: darkvater@395: // check waypoint tron@1901: if (IsTileType(tile, MP_RAILWAY) && rubidium@6585: v->type == VEH_TRAIN && tron@1901: IsTileOwner(tile, _local_player) && truelight@2668: IsRailWaypoint(tile)) { darkvater@558: order.type = OT_GOTO_WAYPOINT; darkvater@558: order.flags = 0; tron@4527: order.dest = GetWaypointByTile(tile)->index; darkvater@558: return order; darkvater@558: } dominik@319: tron@1035: if (IsTileType(tile, MP_STATION)) { tron@3315: StationID st_index = GetStationIndex(tile); belugas@4171: const Station *st = GetStation(st_index); truelight@0: truelight@0: if (st->owner == _current_player || st->owner == OWNER_NONE) { truelight@0: byte facil; rubidium@6585: (facil=FACIL_DOCK, v->type == VEH_SHIP) || rubidium@6585: (facil=FACIL_TRAIN, v->type == VEH_TRAIN) || rubidium@6585: (facil=FACIL_AIRPORT, v->type == VEH_AIRCRAFT) || peter1138@6655: (facil=FACIL_BUS_STOP, v->type == VEH_ROAD && IsCargoInClass(v->cargo_type, CC_PASSENGERS)) || truelight@0: (facil=FACIL_TRUCK_STOP, 1); darkvater@558: if (st->facilities & facil) { darkvater@558: order.type = OT_GOTO_STATION; darkvater@558: order.flags = 0; tron@4527: order.dest = st_index; darkvater@558: return order; darkvater@558: } truelight@0: } truelight@0: } truelight@0: truelight@0: // not found bjarni@6589: order.Free(); tron@4527: order.dest = INVALID_STATION; darkvater@558: return order; truelight@0: } truelight@0: belugas@4171: static bool HandleOrderVehClick(const Vehicle *v, const Vehicle *u, Window *w) truelight@0: { tron@2549: if (u->type != v->type) return false; truelight@0: richk@6719: if (u->HasFront() && !u->IsPrimaryVehicle()) { truelight@0: u = GetFirstVehicleInChain(u); richk@6719: if (!u->IsPrimaryVehicle()) return false; truelight@0: } truelight@0: truelight@0: // v is vehicle getting orders. Only copy/clone orders if vehicle doesn't have any orders yet truelight@0: // obviously if you press CTRL on a non-empty orders vehicle you know what you are doing tron@2549: if (v->num_orders != 0 && _ctrl_pressed == 0) return false; truelight@193: truelight@0: if (DoCommandP(v->tile, v->index | (u->index << 16), _ctrl_pressed ? 0 : 1, NULL, truelight@0: _ctrl_pressed ? CMD_CLONE_ORDER | CMD_MSG(STR_CANT_SHARE_ORDER_LIST) : CMD_CLONE_ORDER | CMD_MSG(STR_CANT_COPY_ORDER_LIST))) { truelight@0: WP(w,order_d).sel = -1; truelight@0: ResetObjectToPlace(); truelight@0: } truelight@0: truelight@0: return true; truelight@0: } truelight@0: belugas@4171: static void OrdersPlaceObj(const Vehicle *v, TileIndex tile, Window *w) truelight@0: { darkvater@558: Order cmd; belugas@4171: const Vehicle *u; truelight@193: truelight@0: // check if we're clicking on a vehicle first.. clone orders in that case. truelight@0: u = CheckMouseOverVehicle(); tron@2549: if (u != NULL && HandleOrderVehClick(v, u, w)) return; truelight@0: truelight@0: cmd = GetOrderCmdFromTile(v, tile); bjarni@6589: if (!cmd.IsValid()) return; truelight@0: darkvater@558: if (DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), PackOrder(&cmd), NULL, CMD_INSERT_ORDER | CMD_MSG(STR_8833_CAN_T_INSERT_NEW_ORDER))) { tron@2549: if (WP(w,order_d).sel != -1) WP(w,order_d).sel++; truelight@0: ResetObjectToPlace(); truelight@0: } truelight@0: } truelight@0: richk@6720: /** richk@6720: * Handle the click on the goto button. richk@6720: * richk@6720: * @param w current window richk@6720: * @param v current vehicle richk@6720: */ belugas@4171: static void OrderClick_Goto(Window *w, const Vehicle *v) Celestar@1000: { bjarni@6079: InvalidateWidget(w, ORDER_WIDGET_GOTO); bjarni@6079: ToggleWidgetLoweredState(w, ORDER_WIDGET_GOTO); bjarni@6079: if (IsWindowWidgetLowered(w, ORDER_WIDGET_GOTO)) { Celestar@1000: _place_clicked_vehicle = NULL; peter1138@5919: SetObjectToPlaceWnd(ANIMCURSOR_PICKSTATION, PAL_NONE, 1, w); Celestar@1000: } else { Celestar@1000: ResetObjectToPlace(); Celestar@1000: } Celestar@1000: } Celestar@1000: richk@6720: /** richk@6720: * Handle the click on the full load button. richk@6720: * richk@6720: * @param w current window richk@6720: * @param v current vehicle richk@6720: */ belugas@4171: static void OrderClick_FullLoad(Window *w, const Vehicle *v) Celestar@1000: { truelight@1024: DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), OFB_FULL_LOAD, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER)); Celestar@1000: } Celestar@1000: richk@6720: /** richk@6720: * Handle the click on the unload button. richk@6720: * richk@6720: * @param w current window richk@6720: * @param v current vehicle richk@6720: */ belugas@4171: static void OrderClick_Unload(Window *w, const Vehicle *v) Celestar@1000: { truelight@1024: DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), OFB_UNLOAD, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER)); truelight@1024: } truelight@1024: richk@6720: /** richk@6720: * Handle the click on the nonstop button. richk@6720: * richk@6720: * @param w current window richk@6720: * @param v current vehicle richk@6720: */ belugas@4171: static void OrderClick_Nonstop(Window *w, const Vehicle *v) truelight@1024: { truelight@1024: DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), OFB_NON_STOP, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER)); Celestar@1000: } Celestar@1000: richk@6720: /** richk@6720: * Handle the click on the transfer button. richk@6720: * richk@6720: * @param w current window richk@6720: * @param v current vehicle richk@6720: */ tron@2549: static void OrderClick_Transfer(Window* w, const Vehicle* v) celestar@1935: { celestar@1935: DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), OFB_TRANSFER, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER)); celestar@1935: } celestar@1935: richk@6720: /** richk@6720: * Handle the click on the skip button. richk@6720: * If ctrl is pressed skip to selected order. richk@6720: * Else skip to current order + 1 richk@6720: * richk@6720: * @param w current window richk@6720: * @param v current vehicle richk@6720: */ belugas@4171: static void OrderClick_Skip(Window *w, const Vehicle *v) Celestar@1000: { richk@6720: /* Don't skip when there's nothing to skip */ richk@6720: if (_ctrl_pressed && v->cur_order_index == OrderGetSel(w)) return; richk@6720: richk@6720: DoCommandP(v->tile, v->index, _ctrl_pressed ? OrderGetSel(w) : ((v->cur_order_index + 1) % v->num_orders), richk@6720: NULL, CMD_SKIP_TO_ORDER | CMD_MSG(_ctrl_pressed ? STR_CAN_T_SKIP_TO_ORDER : STR_CAN_T_SKIP_ORDER)); Celestar@1000: } Celestar@1000: richk@6720: /** richk@6720: * Handle the click on the unload button. richk@6720: * richk@6720: * @param w current window richk@6720: * @param v current vehicle richk@6720: */ belugas@4171: static void OrderClick_Delete(Window *w, const Vehicle *v) Celestar@1000: { truelight@1024: DoCommandP(v->tile, v->index, OrderGetSel(w), NULL, CMD_DELETE_ORDER | CMD_MSG(STR_8834_CAN_T_DELETE_THIS_ORDER)); Celestar@1000: } Celestar@1000: richk@6720: /** richk@6720: * Handle the click on the refit button. richk@6720: * If ctrl is pressed cancel refitting. richk@6720: * Else show the refit window. richk@6720: * richk@6720: * @param w current window richk@6720: * @param v current vehicle richk@6720: */ bjarni@4712: static void OrderClick_Refit(Window *w, const Vehicle *v) bjarni@4712: { bjarni@4712: if (_ctrl_pressed) { bjarni@4712: /* Cancel refitting */ bjarni@4712: DoCommandP(v->tile, v->index, (WP(w,order_d).sel << 16) | (CT_NO_REFIT << 8) | CT_NO_REFIT, NULL, CMD_ORDER_REFIT); bjarni@4712: } else { bjarni@4712: ShowVehicleRefitWindow(v, WP(w,order_d).sel); bjarni@4712: } bjarni@4712: } bjarni@4712: belugas@4171: typedef void OnButtonVehClick(Window *w, const Vehicle *v); Celestar@1000: richk@6720: /** richk@6720: * Keycode function mapping. richk@6720: * richk@6720: * @see _order_keycodes[] richk@6720: * @note Keep them allways in sync with _order_keycodes[]! richk@6720: */ belugas@4171: static OnButtonVehClick* const _order_button_proc[] = { Celestar@1000: OrderClick_Skip, Celestar@1000: OrderClick_Delete, Celestar@1000: OrderClick_Nonstop, Celestar@1000: OrderClick_Goto, Celestar@1000: OrderClick_FullLoad, celestar@1935: OrderClick_Unload, celestar@1935: OrderClick_Transfer Celestar@1000: }; Celestar@1000: Celestar@1000: static const uint16 _order_keycodes[] = { Celestar@1000: 'D', //skip order Celestar@1000: 'F', //delete order Celestar@1000: 'G', //non-stop Celestar@1000: 'H', //goto order Celestar@1000: 'J', //full load Celestar@1000: 'K' //unload Celestar@1000: }; truelight@0: truelight@0: static void OrdersWndProc(Window *w, WindowEvent *e) truelight@0: { tron@2549: switch (e->event) { bjarni@4712: case WE_CREATE: bjarni@6082: /* Ensure that the refit and unload buttons always remain at the same location. bjarni@6082: * Only one of them can be active at any one time and takes turns on being disabled. bjarni@6082: * To ensure that they stay at the same location, we also verify that they behave the same bjarni@6082: * when resizing. */ bjarni@6082: if (GetVehicle(w->window_number)->owner == _local_player) { // only the vehicle owner got these buttons bjarni@6082: assert(w->widget[ORDER_WIDGET_REFIT].left == w->widget[ORDER_WIDGET_UNLOAD].left); bjarni@6082: assert(w->widget[ORDER_WIDGET_REFIT].right == w->widget[ORDER_WIDGET_UNLOAD].right); bjarni@6082: assert(w->widget[ORDER_WIDGET_REFIT].top == w->widget[ORDER_WIDGET_UNLOAD].top); bjarni@6082: assert(w->widget[ORDER_WIDGET_REFIT].bottom == w->widget[ORDER_WIDGET_UNLOAD].bottom); bjarni@6082: assert(w->widget[ORDER_WIDGET_REFIT].display_flags == w->widget[ORDER_WIDGET_UNLOAD].display_flags); bjarni@6082: } richk@6720: richk@6720: if (_patches.timetabling) { richk@6720: w->widget[ORDER_WIDGET_CAPTION].right -= 61; richk@6720: } else { richk@6720: HideWindowWidget(w, ORDER_WIDGET_TIMETABLE_VIEW); richk@6720: } richk@6720: bjarni@4712: break; bjarni@4712: truelight@0: case WE_PAINT: truelight@0: DrawOrdersWindow(w); truelight@0: break; truelight@0: truelight@0: case WE_CLICK: { richk@6720: const Vehicle *v = GetVehicle(w->window_number); belugas@4634: switch (e->we.click.widget) { bjarni@6079: case ORDER_WIDGET_ORDER_LIST: { richk@6720: ResetObjectToPlace(); truelight@0: richk@6720: int sel = GetOrderFromOrderWndPt(w, e->we.click.pt.y, v); truelight@0: richk@6720: if (sel == INVALID_ORDER) { richk@6720: /* This was a click on an empty part of the orders window, so richk@6720: * deselect the currently selected order. */ richk@6720: WP(w,order_d).sel = -1; richk@6720: SetWindowDirty(w); richk@6720: return; richk@6720: } truelight@0: truelight@1024: if (_ctrl_pressed && sel < v->num_orders) { truelight@1043: const Order *ord = GetVehicleOrder(v, sel); tron@4077: TileIndex xy; tron@4077: truelight@1024: switch (ord->type) { tron@4527: case OT_GOTO_STATION: xy = GetStation(ord->dest)->xy ; break; rubidium@6585: case OT_GOTO_DEPOT: xy = (v->type == VEH_AIRCRAFT) ? GetStation(ord->dest)->xy : GetDepot(ord->dest)->xy; break; tron@4527: case OT_GOTO_WAYPOINT: xy = GetWaypoint(ord->dest)->xy; break; tron@4077: default: xy = 0; break; darkvater@44: } darkvater@44: tron@4077: if (xy != 0) ScrollMainWindowToTile(xy); darkvater@44: return; richk@6720: } else { richk@6720: if (sel == WP(w,order_d).sel) { richk@6720: /* Deselect clicked order */ richk@6720: WP(w,order_d).sel = -1; richk@6720: } else { richk@6720: /* Select clicked order */ richk@6720: WP(w,order_d).sel = sel; richk@6720: richk@6720: if (v->owner == _local_player) { richk@6720: /* Activate drag and drop */ richk@6720: SetObjectToPlaceWnd(SPR_CURSOR_MOUSE, PAL_NONE, 4, w); richk@6720: } richk@6720: } darkvater@44: } darkvater@44: truelight@0: SetWindowDirty(w); richk@6719: } break; truelight@0: bjarni@6079: case ORDER_WIDGET_SKIP: Celestar@1000: OrderClick_Skip(w, v); truelight@0: break; truelight@0: bjarni@6079: case ORDER_WIDGET_DELETE: Celestar@1000: OrderClick_Delete(w, v); truelight@0: break; truelight@0: bjarni@6079: case ORDER_WIDGET_NON_STOP: Celestar@1000: OrderClick_Nonstop(w, v); Celestar@1000: break; tron@1019: bjarni@6079: case ORDER_WIDGET_GOTO: Celestar@1000: OrderClick_Goto(w, v); truelight@0: break; truelight@0: bjarni@6079: case ORDER_WIDGET_FULL_LOAD: Celestar@1000: OrderClick_FullLoad(w, v); truelight@0: break; truelight@0: bjarni@6079: case ORDER_WIDGET_UNLOAD: Celestar@1000: OrderClick_Unload(w, v); truelight@0: break; bjarni@6080: case ORDER_WIDGET_REFIT: bjarni@6080: OrderClick_Refit(w, v); bjarni@6080: break; bjarni@6080: bjarni@6079: case ORDER_WIDGET_TRANSFER: celestar@1935: OrderClick_Transfer(w, v); celestar@1935: break; richk@6720: richk@6720: case ORDER_WIDGET_TIMETABLE_VIEW: richk@6720: ShowTimetableWindow(v); richk@6720: break; richk@6720: bjarni@6079: case ORDER_WIDGET_SHARED_ORDER_LIST: bjarni@5996: ShowVehicleListWindow(v); bjarni@4408: break; truelight@0: } truelight@0: } break; tron@1019: richk@6720: case WE_DRAGDROP: { richk@6720: const Vehicle *v = GetVehicle(w->window_number); richk@6720: richk@6720: switch (e->we.click.widget) { richk@6720: case ORDER_WIDGET_ORDER_LIST: { richk@6720: int from_order = OrderGetSel(w); richk@6720: int to_order = GetOrderFromOrderWndPt(w, e->we.dragdrop.pt.y, v); richk@6720: richk@6720: if (!(from_order == to_order || from_order == INVALID_ORDER || from_order > v->num_orders || to_order == INVALID_ORDER || to_order > v->num_orders) && richk@6720: DoCommandP(v->tile, v->index, from_order | (to_order << 16), NULL, CMD_MOVE_ORDER | CMD_MSG(STR_CAN_T_MOVE_THIS_ORDER))) { richk@6720: WP(w, order_d).sel = -1; richk@6720: } richk@6720: richk@6720: break; richk@6720: } richk@6720: richk@6720: case ORDER_WIDGET_DELETE: richk@6720: OrderClick_Delete(w, v); richk@6720: break; richk@6720: } richk@6720: richk@6720: ResetObjectToPlace(); richk@6720: break; richk@6720: } richk@6720: Celestar@1000: case WE_KEYPRESS: { Celestar@1000: Vehicle *v = GetVehicle(w->window_number); Celestar@1000: uint i; Celestar@1000: Darkvater@4949: if (v->owner != _local_player) break; Darkvater@4949: tron@2952: for (i = 0; i < lengthof(_order_keycodes); i++) { belugas@4634: if (e->we.keypress.keycode == _order_keycodes[i]) { belugas@4634: e->we.keypress.cont = false; tron@1019: //see if the button is disabled bjarni@6079: if (!IsWindowWidgetDisabled(w, i + ORDER_WIDGET_SKIP)) _order_button_proc[i](w, v); Celestar@1000: break; Celestar@1000: } Celestar@1000: } Celestar@1000: break; Celestar@1000: } Celestar@1000: truelight@0: case WE_RCLICK: { belugas@4171: const Vehicle *v = GetVehicle(w->window_number); tron@2639: int s = OrderGetSel(w); tron@2639: bjarni@6079: if (e->we.click.widget != ORDER_WIDGET_FULL_LOAD) break; tron@2639: if (s == v->num_orders || GetVehicleOrder(v, s)->type != OT_GOTO_DEPOT) { celestar@1256: GuiShowTooltips(STR_8857_MAKE_THE_HIGHLIGHTED_ORDER); tron@2639: } else { truelight@0: GuiShowTooltips(STR_SERVICE_HINT); tron@2639: } darkvater@1242: } break; truelight@0: truelight@0: case WE_PLACE_OBJ: { belugas@4634: OrdersPlaceObj(GetVehicle(w->window_number), e->we.place.tile, w); truelight@0: } break; truelight@0: truelight@0: case WE_ABORT_PLACE_OBJ: { bjarni@6079: RaiseWindowWidget(w, ORDER_WIDGET_GOTO); bjarni@6079: InvalidateWidget( w, ORDER_WIDGET_GOTO); truelight@0: } break; truelight@0: truelight@0: // check if a vehicle in a depot was clicked.. truelight@0: case WE_MOUSELOOP: { belugas@4171: const Vehicle *v = _place_clicked_vehicle; truelight@25: /* truelight@25: * Check if we clicked on a vehicle truelight@25: * and if the GOTO button of this window is pressed truelight@25: * This is because of all open order windows WE_MOUSELOOP is called truelight@25: * and if you have 3 windows open, and this check is not done truelight@25: * the order is copied to the last open window instead of the Darkvater@4949: * one where GOTO is enabled truelight@25: */ bjarni@6079: if (v != NULL && IsWindowWidgetLowered(w, ORDER_WIDGET_GOTO)) { truelight@0: _place_clicked_vehicle = NULL; truelight@919: HandleOrderVehClick(GetVehicle(w->window_number), v, w); truelight@0: } truelight@0: } break; truelight@193: darkvater@1242: case WE_RESIZE: darkvater@1242: /* Update the scroll + matrix */ bjarni@6079: w->vscroll.cap = (w->widget[ORDER_WIDGET_ORDER_LIST].bottom - w->widget[ORDER_WIDGET_ORDER_LIST].top) / 10; darkvater@1242: break; Darkvater@5013: Darkvater@5013: case WE_TIMEOUT: { // handle button unclick ourselves... bjarni@6079: // unclick all buttons except for the 'goto' button (ORDER_WIDGET_GOTO), which is 'persistent' rubidium@5235: uint i; rubidium@5235: for (i = 0; i < w->widget_count; i++) { bjarni@6079: if (IsWindowWidgetLowered(w, i) && i != ORDER_WIDGET_GOTO) { Darkvater@5013: RaiseWindowWidget(w, i); Darkvater@5013: InvalidateWidget(w, i); Darkvater@5013: } Darkvater@5013: } Darkvater@5013: } break; truelight@0: } truelight@0: } truelight@0: richk@6720: /** richk@6720: * Widget definition for player train orders richk@6720: */ dominik@1081: static const Widget _orders_train_widgets[] = { richk@6720: { WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, // ORDER_WIDGET_CLOSEBOX richk@6720: { WWT_CAPTION, RESIZE_RIGHT, 14, 11, 398, 0, 13, STR_8829_ORDERS, STR_018C_WINDOW_TITLE_DRAG_THIS}, // ORDER_WIDGET_CAPTION richk@6720: { WWT_PUSHTXTBTN, RESIZE_LR, 14, 338, 398, 0, 13, STR_TIMETABLE_VIEW, STR_TIMETABLE_VIEW_TOOLTIP}, // ORDER_WIDGET_TIMETABLE_VIEW richk@6720: richk@6720: { WWT_PANEL, RESIZE_RB, 14, 0, 386, 14, 75, 0x0, STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, // ORDER_WIDGET_ORDER_LIST richk@6720: richk@6720: { WWT_SCROLLBAR, RESIZE_LRB, 14, 387, 398, 14, 75, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, // ORDER_WIDGET_SCROLLBAR richk@6720: richk@6720: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 0, 52, 76, 87, STR_8823_SKIP, STR_8853_SKIP_THE_CURRENT_ORDER}, // ORDER_WIDGET_SKIP richk@6720: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 53, 105, 76, 87, STR_8824_DELETE, STR_8854_DELETE_THE_HIGHLIGHTED}, // ORDER_WIDGET_DELETE richk@6720: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 106, 158, 76, 87, STR_8825_NON_STOP, STR_8855_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_NON_STOP richk@6720: { WWT_TEXTBTN, RESIZE_TB, 14, 159, 211, 76, 87, STR_8826_GO_TO, STR_8856_INSERT_A_NEW_ORDER_BEFORE}, // ORDER_WIDGET_GOTO richk@6720: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 212, 264, 76, 87, STR_FULLLOAD_OR_SERVICE, STR_NULL}, // ORDER_WIDGET_FULL_LOAD richk@6720: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 265, 319, 76, 87, STR_8828_UNLOAD, STR_8858_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_UNLOAD richk@6720: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 265, 319, 76, 87, STR_REFIT, STR_REFIT_TIP}, // ORDER_WIDGET_REFIT richk@6720: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 320, 372, 76, 87, STR_886F_TRANSFER, STR_886D_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_TRANSFER richk@6720: richk@6720: { 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 richk@6720: richk@6720: { WWT_PANEL, RESIZE_RTB, 14, 387, 386, 76, 87, 0x0, STR_NULL}, // ORDER_WIDGET_RESIZE_BAR richk@6720: richk@6720: { WWT_RESIZEBOX, RESIZE_LRTB, 14, 387, 398, 76, 87, 0x0, STR_RESIZE_BUTTON}, // ORDER_WIDGET_RESIZE richk@6720: { WIDGETS_END}, truelight@0: }; truelight@0: dominik@1081: static const WindowDesc _orders_train_desc = { Darkvater@5070: WDP_AUTO, WDP_AUTO, 399, 88, dominik@1081: WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW, Darkvater@5013: WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE, dominik@1081: _orders_train_widgets, dominik@1081: OrdersWndProc dominik@1081: }; dominik@1081: richk@6720: /** richk@6720: * Widget definition for player orders (!train) richk@6720: */ dominik@1081: static const Widget _orders_widgets[] = { richk@6720: { WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, // ORDER_WIDGET_CLOSEBOX richk@6720: { WWT_CAPTION, RESIZE_RIGHT, 14, 11, 409, 0, 13, STR_8829_ORDERS, STR_018C_WINDOW_TITLE_DRAG_THIS}, // ORDER_WIDGET_CAPTION richk@6720: { WWT_PUSHTXTBTN, RESIZE_LR, 14, 349, 409, 0, 13, STR_TIMETABLE_VIEW, STR_TIMETABLE_VIEW_TOOLTIP}, // ORDER_WIDGET_TIMETABLE_VIEW richk@6720: richk@6720: { WWT_PANEL, RESIZE_RB, 14, 0, 397, 14, 75, 0x0, STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, // ORDER_WIDGET_ORDER_LIST richk@6720: richk@6720: { WWT_SCROLLBAR, RESIZE_LRB, 14, 398, 409, 14, 75, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, // ORDER_WIDGET_SCROLLBAR richk@6720: richk@6720: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 0, 63, 76, 87, STR_8823_SKIP, STR_8853_SKIP_THE_CURRENT_ORDER}, // ORDER_WIDGET_SKIP richk@6720: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 64, 128, 76, 87, STR_8824_DELETE, STR_8854_DELETE_THE_HIGHLIGHTED}, // ORDER_WIDGET_DELETE richk@6720: { WWT_EMPTY, RESIZE_TB, 14, 0, 0, 76, 87, 0x0, 0x0}, // ORDER_WIDGET_NON_STOP richk@6720: { WWT_TEXTBTN, RESIZE_TB, 14, 129, 192, 76, 87, STR_8826_GO_TO, STR_8856_INSERT_A_NEW_ORDER_BEFORE}, // ORDER_WIDGET_GOTO richk@6720: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 193, 256, 76, 87, STR_FULLLOAD_OR_SERVICE, STR_NULL}, // ORDER_WIDGET_FULL_LOAD richk@6720: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 257, 319, 76, 87, STR_8828_UNLOAD, STR_8858_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_UNLOAD richk@6720: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 257, 319, 76, 87, STR_REFIT, STR_REFIT_TIP}, // ORDER_WIDGET_REFIT richk@6720: { WWT_PUSHTXTBTN, RESIZE_TB, 14, 320, 383, 76, 87, STR_886F_TRANSFER, STR_886D_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_TRANSFER richk@6720: richk@6720: { 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 richk@6720: richk@6720: { WWT_PANEL, RESIZE_RTB, 14, 397, 396, 76, 87, 0x0, STR_NULL}, // ORDER_WIDGET_RESIZE_BAR richk@6720: richk@6720: { WWT_RESIZEBOX, RESIZE_LRTB, 14, 398, 409, 76, 87, 0x0, STR_RESIZE_BUTTON}, // ORDER_WIDGET_RESIZE richk@6720: { WIDGETS_END}, dominik@1081: }; dominik@1081: celestar@995: static const WindowDesc _orders_desc = { Darkvater@5070: WDP_AUTO, WDP_AUTO, 410, 88, truelight@0: WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW, Darkvater@5013: WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE, celestar@995: _orders_widgets, truelight@0: OrdersWndProc truelight@0: }; truelight@0: richk@6720: /** richk@6720: * Widget definition for competitor orders richk@6720: */ celestar@995: static const Widget _other_orders_widgets[] = { richk@6720: { WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, // ORDER_WIDGET_CLOSEBOX richk@6720: { WWT_CAPTION, RESIZE_RIGHT, 14, 11, 331, 0, 13, STR_A00B_ORDERS, STR_018C_WINDOW_TITLE_DRAG_THIS}, // ORDER_WIDGET_CAPTION richk@6720: { WWT_PUSHTXTBTN, RESIZE_LR, 14, 271, 331, 0, 13, STR_TIMETABLE_VIEW, STR_TIMETABLE_VIEW_TOOLTIP}, // ORDER_WIDGET_TIMETABLE_VIEW richk@6720: richk@6720: { WWT_PANEL, RESIZE_RB, 14, 0, 319, 14, 75, 0x0, STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, // ORDER_WIDGET_ORDER_LIST richk@6720: richk@6720: { WWT_SCROLLBAR, RESIZE_LRB, 14, 320, 331, 14, 75, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, // ORDER_WIDGET_SCROLLBAR richk@6720: richk@6720: { WWT_EMPTY, RESIZE_NONE, 14, 0, 319, 76, 87, 0x0, STR_NULL}, // ORDER_WIDGET_SKIP richk@6720: { WWT_EMPTY, RESIZE_NONE, 14, 0, 319, 76, 87, 0x0, STR_NULL}, // ORDER_WIDGET_DELETE richk@6720: { WWT_EMPTY, RESIZE_NONE, 14, 0, 319, 76, 87, 0x0, STR_NULL}, // ORDER_WIDGET_NON_STOP richk@6720: { WWT_EMPTY, RESIZE_NONE, 14, 0, 319, 76, 87, 0x0, STR_NULL}, // ORDER_WIDGET_GOTO richk@6720: { WWT_EMPTY, RESIZE_NONE, 14, 0, 319, 76, 87, 0x0, STR_NULL}, // ORDER_WIDGET_FULL_LOAD richk@6720: { WWT_EMPTY, RESIZE_NONE, 14, 0, 319, 76, 87, 0x0, STR_NULL}, // ORDER_WIDGET_UNLOAD richk@6720: { WWT_EMPTY, RESIZE_NONE, 14, 0, 319, 76, 87, 0x0, STR_NULL}, // ORDER_WIDGET_REFIT richk@6720: { WWT_EMPTY, RESIZE_NONE, 14, 0, 319, 76, 87, 0x0, STR_NULL}, // ORDER_WIDGET_TRANSFER richk@6720: richk@6720: { WWT_EMPTY, RESIZE_NONE, 14, 0, 319, 76, 87, 0x0, STR_NULL}, // ORDER_WIDGET_SHARED_ORDER_LIST richk@6720: richk@6720: { WWT_PANEL, RESIZE_RTB, 14, 0, 319, 76, 87, 0x0, STR_NULL}, // ORDER_WIDGET_RESIZE_BAR richk@6720: richk@6720: { WWT_RESIZEBOX, RESIZE_LRTB, 14, 320, 331, 76, 87, 0x0, STR_RESIZE_BUTTON}, // ORDER_WIDGET_RESIZE richk@6720: { WIDGETS_END}, truelight@0: }; truelight@0: celestar@995: static const WindowDesc _other_orders_desc = { Darkvater@5070: WDP_AUTO, WDP_AUTO, 332, 88, truelight@0: WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW, darkvater@1242: WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE, celestar@995: _other_orders_widgets, truelight@0: OrdersWndProc truelight@0: }; truelight@0: belugas@4171: void ShowOrdersWindow(const Vehicle *v) truelight@0: { truelight@0: Window *w; truelight@0: VehicleID veh = v->index; truelight@0: truelight@0: DeleteWindowById(WC_VEHICLE_ORDERS, veh); truelight@0: DeleteWindowById(WC_VEHICLE_DETAILS, veh); truelight@193: dominik@1081: if (v->owner != _local_player) { Darkvater@5071: w = AllocateWindowDescFront(&_other_orders_desc, veh); tron@2549: } else { rubidium@6585: w = AllocateWindowDescFront((v->type == VEH_TRAIN) ? &_orders_train_desc : &_orders_desc, veh); tron@2549: } truelight@0: darkvater@1242: if (w != NULL) { darkvater@1242: w->caption_color = v->owner; darkvater@1242: w->vscroll.cap = 6; darkvater@1242: w->resize.step_height = 10; darkvater@1242: WP(w,order_d).sel = -1; darkvater@1242: } truelight@0: }