src/autoreplace_gui.cpp
author rubidium
Sun, 18 May 2008 12:17:52 +0000
changeset 10614 04d1add9e12d
parent 10596 0ee9eba64c9c
child 10641 13148f508e6d
permissions -rw-r--r--
(svn r13158) -Codechange: make a class of the GameOptionsWindow.
2186
461a2aff3486 (svn r2701) Insert Id tags into all source files
tron
parents: 2163
diff changeset
     1
/* $Id$ */
461a2aff3486 (svn r2701) Insert Id tags into all source files
tron
parents: 2163
diff changeset
     2
10429
1b99254f9607 (svn r12971) -Documentation: add @file in files that missed them and add something more than whitespace as description of files that don't have a description.
rubidium
parents: 10382
diff changeset
     3
/** @file autoreplace_gui.cpp GUI for autoreplace handling. */
6443
b8f06d8eb7be (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6206
diff changeset
     4
164
0cbdf3c9bde1 (svn r165) -Feature: Option to sort vehicles in vehicle-list window by different criteria. Total independent sort for all types and players. Periodic resort of list every 10 TTD days. Thank you for your graphical inspiration follow and buxo (since none of you provided any code).
darkvater
parents:
diff changeset
     5
#include "stdafx.h"
1891
92a3b0aa0946 (svn r2397) - CodeChange: rename all "ttd" files to "openttd" files.
Darkvater
parents: 1859
diff changeset
     6
#include "openttd.h"
1299
0a6510cc889b (svn r1803) Move debugging stuff into files of it's own
tron
parents: 1294
diff changeset
     7
#include "debug.h"
842
ebfd36603ab9 (svn r1323) Adding autoreplace feature
bjarni
parents: 594
diff changeset
     8
#include "gui.h"
8612
6414fc21c2f3 (svn r11677) -Codechange: move price and command related types/functions to their respective places.
rubidium
parents: 8610
diff changeset
     9
#include "command_func.h"
2159
3b634157c3b2 (svn r2669) Shuffle some more stuff around to reduce dependencies
tron
parents: 2154
diff changeset
    10
#include "variables.h"
3b634157c3b2 (svn r2669) Shuffle some more stuff around to reduce dependencies
tron
parents: 2154
diff changeset
    11
#include "vehicle_gui.h"
2962
dbd168a4703a (svn r3524) - Split newgrf features from engine.[ch] into newgrf_engine.[ch], and add the new files to project files.
peter1138
parents: 2951
diff changeset
    12
#include "newgrf_engine.h"
7139
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 7134
diff changeset
    13
#include "group.h"
8599
b609cdeeff3f (svn r11664) -Codechange: use more specific ("rail_type.h" instead of "rail.h" that includes way more than only "rail_type.h") includes at some places.
rubidium
parents: 8578
diff changeset
    14
#include "rail.h"
8610
17cc343a23dd (svn r11675) -Codechange: split the string types from the string functions.
rubidium
parents: 8602
diff changeset
    15
#include "strings_func.h"
8627
448ebf3a8291 (svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents: 8612
diff changeset
    16
#include "window_func.h"
8640
1e93b81e96d2 (svn r11706) -Codechange: split vehicle.h and remove another bunch of useless includes.
rubidium
parents: 8627
diff changeset
    17
#include "vehicle_func.h"
8708
0c29fbc79be4 (svn r11775) -Codechange: move all autoreplace/autorenew functions to a single location.
rubidium
parents: 8670
diff changeset
    18
#include "autoreplace_func.h"
8720
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8708
diff changeset
    19
#include "gfx_func.h"
8750
fdd6054e7bae (svn r11818) -Codechange: split player.h into smaller pieces.
rubidium
parents: 8720
diff changeset
    20
#include "player_func.h"
8780
6f3f3ec6c69a (svn r11848) -Codechange: New class-based drop down list functionality. Lists are now dynamically generated, and can include parameters, or be extended however needed.
peter1138
parents: 8760
diff changeset
    21
#include "widgets/dropdown_func.h"
9282
2bb9703aeb39 (svn r12490) -Codechange: rename engine.h to engine_func.h and remove unneeded inclusions of engine.h and/or replace them with engine_type.h.
rubidium
parents: 9266
diff changeset
    22
#include "engine_func.h"
10382
d1d4452acbfc (svn r12924) -Feature: Introducing the so called 'engine pool' which primarily removes the fixed engine type limits and also happens to allow (with the patch option 'dynamic_engines') multiple NewGRF vehicle sets to coexist.
peter1138
parents: 10376
diff changeset
    23
#include "engine_base.h"
10596
0ee9eba64c9c (svn r13140) -Codechange: move the gui-list-sorting out of window_gui.h so window_gui.h only needs to be included in *_gui.cpp.
rubidium
parents: 10595
diff changeset
    24
#include "window_gui.h"
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
    25
8760
ce0891c412ce (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8750
diff changeset
    26
#include "table/sprites.h"
ce0891c412ce (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8750
diff changeset
    27
#include "table/strings.h"
ce0891c412ce (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8750
diff changeset
    28
10494
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
    29
void DrawEngineList(VehicleType type, int x, int y, const EngineList eng_list, uint16 min, uint16 max, EngineID selected_id, int count_location, GroupID selected_group);
505
11582dcada49 (svn r813) Push two tables from vehicle_gui.h into vehicle_gui.c - they were in the binary 48 (!) times.
tron
parents: 243
diff changeset
    30
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
    31
static const StringID _rail_types_list[] = {
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
    32
	STR_RAIL_VEHICLES,
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
    33
	STR_ELRAIL_VEHICLES,
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
    34
	STR_MONORAIL_VEHICLES,
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
    35
	STR_MAGLEV_VEHICLES,
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
    36
	INVALID_STRING_ID
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
    37
};
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
    38
8841
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
    39
enum ReplaceVehicleWindowWidgets {
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
    40
	RVW_WIDGET_LEFT_MATRIX = 3,
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
    41
	RVW_WIDGET_LEFT_SCROLLBAR,
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
    42
	RVW_WIDGET_RIGHT_MATRIX,
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
    43
	RVW_WIDGET_RIGHT_SCROLLBAR,
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
    44
	RVW_WIDGET_LEFT_DETAILS,
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
    45
	RVW_WIDGET_RIGHT_DETAILS,
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
    46
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
    47
	/* Button row */
8841
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
    48
	RVW_WIDGET_START_REPLACE,
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
    49
	RVW_WIDGET_INFO_TAB,
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
    50
	RVW_WIDGET_STOP_REPLACE,
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
    51
	RVW_WIDGET_RESIZE,
8841
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
    52
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
    53
	/* Train only widgets */
8841
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
    54
	RVW_WIDGET_TRAIN_ENGINEWAGON_TOGGLE,
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
    55
	RVW_WIDGET_TRAIN_FLUFF_LEFT,
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
    56
	RVW_WIDGET_TRAIN_RAILTYPE_DROPDOWN,
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
    57
	RVW_WIDGET_TRAIN_FLUFF_RIGHT,
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
    58
	RVW_WIDGET_TRAIN_WAGONREMOVE_TOGGLE,
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
    59
};
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
    60
8670
121000504b2c (svn r11737) -Fix: Reinstate NewGRF-specified engine list order in autoreplace window.
peter1138
parents: 8640
diff changeset
    61
static int CDECL TrainEngineNumberSorter(const void *a, const void *b)
121000504b2c (svn r11737) -Fix: Reinstate NewGRF-specified engine list order in autoreplace window.
peter1138
parents: 8640
diff changeset
    62
{
121000504b2c (svn r11737) -Fix: Reinstate NewGRF-specified engine list order in autoreplace window.
peter1138
parents: 8640
diff changeset
    63
	const EngineID va = *(const EngineID*)a;
121000504b2c (svn r11737) -Fix: Reinstate NewGRF-specified engine list order in autoreplace window.
peter1138
parents: 8640
diff changeset
    64
	const EngineID vb = *(const EngineID*)b;
121000504b2c (svn r11737) -Fix: Reinstate NewGRF-specified engine list order in autoreplace window.
peter1138
parents: 8640
diff changeset
    65
	int r = ListPositionOfEngine(va) - ListPositionOfEngine(vb);
121000504b2c (svn r11737) -Fix: Reinstate NewGRF-specified engine list order in autoreplace window.
peter1138
parents: 8640
diff changeset
    66
121000504b2c (svn r11737) -Fix: Reinstate NewGRF-specified engine list order in autoreplace window.
peter1138
parents: 8640
diff changeset
    67
	return r;
121000504b2c (svn r11737) -Fix: Reinstate NewGRF-specified engine list order in autoreplace window.
peter1138
parents: 8640
diff changeset
    68
}
121000504b2c (svn r11737) -Fix: Reinstate NewGRF-specified engine list order in autoreplace window.
peter1138
parents: 8640
diff changeset
    69
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
    70
/** Rebuild the left autoreplace list if an engine is removed or added
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
    71
 * @param e Engine to check if it is removed or added
7592
48055c5dd43d (svn r10363) -Fix [FS#911]: invalidating autoreplace windows didn't take account of vehicle group (Matthias Wolf)
peter1138
parents: 7555
diff changeset
    72
 * @param id_g The group the engine belongs to
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
    73
 *  Note: this function only works if it is called either
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
    74
 *   - when a new vehicle is build, but before it's counted in num_engines
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
    75
 *   - when a vehicle is deleted and after it's substracted from num_engines
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
    76
 *   - when not changing the count (used when changing replace orders)
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
    77
 */
7592
48055c5dd43d (svn r10363) -Fix [FS#911]: invalidating autoreplace windows didn't take account of vehicle group (Matthias Wolf)
peter1138
parents: 7555
diff changeset
    78
void InvalidateAutoreplaceWindow(EngineID e, GroupID id_g)
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
    79
{
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
    80
	Player *p = GetPlayer(_local_player);
7977
b10b1a884892 (svn r10992) -Fix [FS#1132]: huge amount of vehicles in the "ungrouped" group. Patch by frosch.
rubidium
parents: 7837
diff changeset
    81
	uint num_engines = GetGroupNumEngines(_local_player, id_g, e);
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
    82
7592
48055c5dd43d (svn r10363) -Fix [FS#911]: invalidating autoreplace windows didn't take account of vehicle group (Matthias Wolf)
peter1138
parents: 7555
diff changeset
    83
	if (num_engines == 0 || p->num_engines[e] == 0) {
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
    84
		/* We don't have any of this engine type.
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
    85
		 * Either we just sold the last one, we build a new one or we stopped replacing it.
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
    86
		 * In all cases, we need to update the left list */
10492
25ee8db4551e (svn r13035) -Codechange: remove two needless global-ish variables.
rubidium
parents: 10476
diff changeset
    87
		InvalidateWindowData(WC_REPLACE_VEHICLE, GetEngine(e)->type, true);
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
    88
	}
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
    89
}
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
    90
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
    91
/** When an engine is made buildable or is removed from being buildable, add/remove it from the build/autoreplace lists
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
    92
 * @param type The type of engine
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
    93
 */
7134
c5a90dd41166 (svn r9869) -Codechange: replace some bytes with VehicleType, i.e. more type strictness.
rubidium
parents: 6894
diff changeset
    94
void AddRemoveEngineFromAutoreplaceAndBuildWindows(VehicleType type)
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
    95
{
10492
25ee8db4551e (svn r13035) -Codechange: remove two needless global-ish variables.
rubidium
parents: 10476
diff changeset
    96
	InvalidateWindowData(WC_REPLACE_VEHICLE, type, false); // Update the autoreplace window
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
    97
	InvalidateWindowClassesData(WC_BUILD_VEHICLE); // The build windows needs updating as well
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
    98
}
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
    99
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   100
/** Get the default cargo type for an engine
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   101
 * @param engine the EngineID to get the cargo for
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   102
 * @return the cargo type carried by the engine (CT_INVALID if engine got no cargo capacity)
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   103
 */
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   104
static CargoID EngineCargo(EngineID engine)
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   105
{
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   106
	if (engine == INVALID_ENGINE) return CT_INVALID; // surely INVALID_ENGINE can't carry anything but CT_INVALID
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   107
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   108
	switch (GetEngine(engine)->type) {
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   109
		default: NOT_REACHED();
6585
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6573
diff changeset
   110
		case VEH_TRAIN:
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   111
			if (RailVehInfo(engine)->capacity == 0) return CT_INVALID; // no capacity -> can't carry cargo
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   112
			return RailVehInfo(engine)->cargo_type;
6585
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6573
diff changeset
   113
		case VEH_ROAD:       return RoadVehInfo(engine)->cargo_type;
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6573
diff changeset
   114
		case VEH_SHIP:       return ShipVehInfo(engine)->cargo_type;
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6573
diff changeset
   115
		case VEH_AIRCRAFT:   return CT_PASSENGERS; // all planes are build with passengers by default
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   116
	}
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   117
}
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   118
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   119
/** Figure out if two engines got at least one type of cargo in common (refitting if needed)
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   120
 * @param engine_a one of the EngineIDs
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   121
 * @param engine_b the other EngineID
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   122
 * @return true if they can both carry the same type of cargo (or at least one of them got no capacity at all)
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   123
 */
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   124
static bool EnginesGotCargoInCommon(EngineID engine_a, EngineID engine_b)
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   125
{
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   126
	CargoID a = EngineCargo(engine_a);
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   127
	CargoID b = EngineCargo(engine_b);
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   128
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   129
	 /* we should always be able to refit to/from locomotives without capacity
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   130
	  * Because of that, CT_INVALID shoudl always return true */
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   131
	if (a == CT_INVALID || b == CT_INVALID || a == b) return true; // they carry no ro the same type by default
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   132
	if (EngInfo(engine_a)->refit_mask & EngInfo(engine_b)->refit_mask) return true; // both can refit to the same
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   133
	if (CanRefitTo(engine_a, b) || CanRefitTo(engine_b, a)) return true; // one can refit to what the other one carries
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   134
	return false;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   135
}
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   136
10494
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   137
/**
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   138
 * Window for the autoreplacing of vehicles.
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   139
 */
10494
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   140
class ReplaceVehicleWindow : public Window {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   141
	byte sel_index[2];
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   142
	EngineID sel_engine[2];
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   143
	uint16 count[2];
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   144
	bool wagon_btnstate; ///< true means engine is selected
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   145
	EngineList list[2];
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   146
	bool update_left;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   147
	bool update_right;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   148
	bool init_lists;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   149
	GroupID sel_group;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   150
	static RailType sel_railtype;
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   151
10494
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   152
	/** Figure out if an engine should be added to a list
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   153
	 * @param e The EngineID
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   154
	 * @param draw_left If true, then the left list is drawn (the engines specific to the railtype you selected)
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   155
	 * @param show_engines if truem then locomotives are drawn, else wagons (never both)
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   156
	 * @return true if the engine should be in the list (based on this check)
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   157
	 */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   158
	bool GenerateReplaceRailList(EngineID e, bool draw_left, bool show_engines)
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   159
	{
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   160
		const RailVehicleInfo *rvi = RailVehInfo(e);
7139
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 7134
diff changeset
   161
10494
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   162
		/* Ensure that the wagon/engine selection fits the engine. */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   163
		if ((rvi->railveh_type == RAILVEH_WAGON) == show_engines) return false;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   164
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   165
		if (draw_left && show_engines) {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   166
			/* Ensure that the railtype is specific to the selected one */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   167
			if (rvi->railtype != this->sel_railtype) return false;
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   168
		} else {
10494
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   169
			/* Ensure that it's a compatible railtype to the selected one (like electric <-> diesel)
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   170
			 * The vehicle do not have to have power on the railtype in question, only able to drive (pulled if needed) */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   171
			if (!IsCompatibleRail(rvi->railtype, this->sel_railtype)) return false;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   172
		}
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   173
		return true;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   174
	}
7183
23b20a982228 (svn r9919) -Codechange: prepare some more places for more road types.
rubidium
parents: 7139
diff changeset
   175
10494
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   176
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   177
	/** Generate a list
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   178
	 * @param w Window, that contains the list
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   179
	 * @param draw_left true if generating the left list, otherwise false
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   180
	 */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   181
	void GenerateReplaceVehList(Window *w, bool draw_left)
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   182
	{
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   183
		EngineID selected_engine = INVALID_ENGINE;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   184
		VehicleType type = (VehicleType)this->window_number;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   185
		byte i = draw_left ? 0 : 1;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   186
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   187
		EngineList *list = &this->list[i];
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   188
		list->clear();
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   189
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   190
		const Engine *e;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   191
		FOR_ALL_ENGINES_OF_TYPE(e, type) {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   192
			EngineID eid = e->index;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   193
			if (type == VEH_TRAIN && !GenerateReplaceRailList(eid, draw_left, this->wagon_btnstate)) continue; // special rules for trains
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   194
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   195
			if (draw_left) {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   196
				const GroupID selected_group = this->sel_group;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   197
				const uint num_engines = GetGroupNumEngines(_local_player, selected_group, eid);
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   198
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   199
				/* Skip drawing the engines we don't have any of and haven't set for replacement */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   200
				if (num_engines == 0 && EngineReplacementForPlayer(GetPlayer(_local_player), eid, selected_group) == INVALID_ENGINE) continue;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   201
			} else {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   202
				/* This is for engines we can replace to and they should depend on what we selected to replace from */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   203
				if (!IsEngineBuildable(eid, type, _local_player)) continue; // we need to be able to build the engine
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   204
				if (!EnginesGotCargoInCommon(eid, this->sel_engine[0])) continue; // the engines needs to be able to carry the same cargo
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   205
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   206
				/* Road vehicles can't be replaced by trams and vice-versa */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   207
				if (type == VEH_ROAD && HasBit(EngInfo(this->sel_engine[0])->misc_flags, EF_ROAD_TRAM) != HasBit(e->info.misc_flags, EF_ROAD_TRAM)) continue;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   208
				if (eid == this->sel_engine[0]) continue; // we can't replace an engine into itself (that would be autorenew)
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   209
			}
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   210
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   211
			list->push_back(eid);
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   212
			if (eid == this->sel_engine[i]) selected_engine = eid; // The selected engine is still in the list
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   213
		}
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   214
		this->sel_engine[i] = selected_engine; // update which engine we selected (the same or none, if it's not in the list anymore)
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   215
		if (type == VEH_TRAIN) EngList_Sort(list, &TrainEngineNumberSorter);
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   216
	}
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   217
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   218
	/** Generate the lists */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   219
	void GenerateLists()
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   220
	{
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   221
		EngineID e = this->sel_engine[0];
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   222
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   223
		if (this->update_left == true) {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   224
			/* We need to rebuild the left list */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   225
			GenerateReplaceVehList(this, true);
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   226
			SetVScrollCount(this, this->list[0].size());
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   227
			if (this->init_lists && this->sel_engine[0] == INVALID_ENGINE && this->list[0].size() != 0) {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   228
				this->sel_engine[0] = this->list[0][0];
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   229
			}
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   230
		}
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   231
10494
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   232
		if (this->update_right || e != this->sel_engine[0]) {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   233
			/* Either we got a request to rebuild the right list or the left list selected a different engine */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   234
			if (this->sel_engine[0] == INVALID_ENGINE) {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   235
				/* Always empty the right list when nothing is selected in the left list */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   236
				this->list[1].clear();
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   237
				this->sel_engine[1] = INVALID_ENGINE;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   238
			} else {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   239
				GenerateReplaceVehList(this, false);
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   240
				SetVScroll2Count(this, this->list[1].size());
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   241
				if (this->init_lists && this->sel_engine[1] == INVALID_ENGINE && this->list[1].size() != 0) {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   242
					this->sel_engine[1] = this->list[1][0];
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   243
				}
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   244
			}
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   245
		}
10494
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   246
		/* Reset the flags about needed updates */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   247
		this->update_left  = false;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   248
		this->update_right = false;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   249
		this->init_lists   = false;
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   250
	}
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   251
10494
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   252
public:
10532
d95aa7f84bc8 (svn r13076) -Fix [FS#2012]: the wrong autoreplace window would be shown if the vehicle isn't a train.
rubidium
parents: 10525
diff changeset
   253
	ReplaceVehicleWindow(const WindowDesc *desc, VehicleType vehicletype, GroupID id_g) : Window(desc, vehicletype)
10494
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   254
	{
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   255
		this->wagon_btnstate = true; // start with locomotives (all other vehicles will not read this bool)
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   256
		new (&this->list[0]) EngineList();
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   257
		new (&this->list[1]) EngineList();
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   258
		this->update_left   = true;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   259
		this->update_right  = true;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   260
		this->init_lists    = true;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   261
		this->sel_engine[0] = INVALID_ENGINE;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   262
		this->sel_engine[1] = INVALID_ENGINE;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   263
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   264
		this->resize.step_height = GetVehicleListHeight(vehicletype);
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   265
		this->vscroll.cap = this->resize.step_height == 14 ? 8 : 4;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   266
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   267
		Widget *widget = this->widget;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   268
		widget[RVW_WIDGET_LEFT_MATRIX].data = widget[RVW_WIDGET_RIGHT_MATRIX].data = (this->vscroll.cap << 8) + 1;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   269
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   270
		if (vehicletype == VEH_TRAIN) {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   271
			this->wagon_btnstate = true;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   272
			/* The train window is bigger so we will move some of the widgets to fit the new size.
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   273
			* We will start by moving the resize button to the lower right corner.                 */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   274
			widget[RVW_WIDGET_RESIZE].top         = widget[RVW_WIDGET_TRAIN_ENGINEWAGON_TOGGLE].top;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   275
			widget[RVW_WIDGET_RESIZE].bottom      = widget[RVW_WIDGET_TRAIN_ENGINEWAGON_TOGGLE].bottom;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   276
			widget[RVW_WIDGET_STOP_REPLACE].right = widget[RVW_WIDGET_RESIZE].right;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   277
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   278
			/* The detail panel is one line taller for trains so we will move some of the widgets one line (10 pixels) down. */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   279
			widget[RVW_WIDGET_LEFT_DETAILS].bottom  += 10;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   280
			widget[RVW_WIDGET_RIGHT_DETAILS].bottom += 10;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   281
			for (int i = RVW_WIDGET_START_REPLACE; i < RVW_WIDGET_RESIZE; i++) {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   282
				widget[i].top    += 10;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   283
				widget[i].bottom += 10;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   284
			}
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   285
		} else {
10494
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   286
			/* Since it's not a train we will hide the train only widgets. */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   287
			this->SetWidgetsHiddenState(true,
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   288
									RVW_WIDGET_TRAIN_ENGINEWAGON_TOGGLE,
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   289
									RVW_WIDGET_TRAIN_FLUFF_LEFT,
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   290
									RVW_WIDGET_TRAIN_RAILTYPE_DROPDOWN,
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   291
									RVW_WIDGET_TRAIN_FLUFF_RIGHT,
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   292
									RVW_WIDGET_TRAIN_WAGONREMOVE_TOGGLE,
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   293
									WIDGET_LIST_END);
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   294
		}
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   295
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   296
		ResizeWindow(this, 0, this->resize.step_height * this->vscroll.cap);
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   297
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   298
		/* Set the minimum window size to the current window size */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   299
		this->resize.width  = this->width;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   300
		this->resize.height = this->height;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   301
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   302
		this->caption_color = _local_player;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   303
		this->sel_group = id_g;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   304
		this->vscroll2.cap = this->vscroll.cap;   // these two are always the same
10498
f198d0a1aab7 (svn r13041) -Fix: calling a virtual function on a not fully constructed object is bound to cause errors.
rubidium
parents: 10494
diff changeset
   305
f198d0a1aab7 (svn r13041) -Fix: calling a virtual function on a not fully constructed object is bound to cause errors.
rubidium
parents: 10494
diff changeset
   306
		this->FindWindowPlacementAndResize(desc);
10494
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   307
	}
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   308
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   309
	virtual void OnPaint()
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   310
	{
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   311
		static const StringID _vehicle_type_names[] = {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   312
			STR_019F_TRAIN,
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   313
			STR_019C_ROAD_VEHICLE,
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   314
			STR_019E_SHIP,
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   315
			STR_019D_AIRCRAFT
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   316
		};
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   317
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   318
		if (this->update_left || this->update_right) this->GenerateLists();
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   319
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   320
		Player *p = GetPlayer(_local_player);
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   321
		EngineID selected_id[2];
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   322
		const GroupID selected_group = this->sel_group;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   323
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   324
		selected_id[0] = this->sel_engine[0];
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   325
		selected_id[1] = this->sel_engine[1];
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   326
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   327
		/* Disable the "Start Replacing" button if:
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   328
		 *    Either list is empty
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   329
		 * or The selected replacement engine has a replacement (to prevent loops)
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   330
		 * or The right list (new replacement) has the existing replacement vehicle selected */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   331
		this->SetWidgetDisabledState(RVW_WIDGET_START_REPLACE,
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   332
										selected_id[0] == INVALID_ENGINE ||
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   333
										selected_id[1] == INVALID_ENGINE ||
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   334
										EngineReplacementForPlayer(p, selected_id[1], selected_group) != INVALID_ENGINE ||
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   335
										EngineReplacementForPlayer(p, selected_id[0], selected_group) == selected_id[1]);
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   336
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   337
		/* Disable the "Stop Replacing" button if:
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   338
		 *   The left list (existing vehicle) is empty
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   339
		 *   or The selected vehicle has no replacement set up */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   340
		this->SetWidgetDisabledState(RVW_WIDGET_STOP_REPLACE,
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   341
										selected_id[0] == INVALID_ENGINE ||
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   342
										!EngineHasReplacementForPlayer(p, selected_id[0], selected_group));
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   343
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   344
		/* now the actual drawing of the window itself takes place */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   345
		SetDParam(0, _vehicle_type_names[this->window_number]);
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   346
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   347
		if (this->window_number == VEH_TRAIN) {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   348
			/* set on/off for renew_keep_length */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   349
			SetDParam(1, p->renew_keep_length ? STR_CONFIG_PATCHES_ON : STR_CONFIG_PATCHES_OFF);
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   350
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   351
			/* set wagon/engine button */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   352
			SetDParam(2, this->wagon_btnstate ? STR_ENGINES : STR_WAGONS);
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   353
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   354
			/* sets the colour of that art thing */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   355
			this->widget[RVW_WIDGET_TRAIN_FLUFF_LEFT].color  = _player_colors[_local_player];
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   356
			this->widget[RVW_WIDGET_TRAIN_FLUFF_RIGHT].color = _player_colors[_local_player];
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   357
		}
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   358
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   359
		if (this->window_number == VEH_TRAIN) {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   360
			/* Show the selected railtype in the pulldown menu */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   361
			this->widget[RVW_WIDGET_TRAIN_RAILTYPE_DROPDOWN].data = _rail_types_list[sel_railtype];
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   362
		}
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   363
10595
7957c71b0dfe (svn r13139) -Codechange: move DrawWindowWidgets and DrawWindowViewport to the Window class and remove Window from their naming.
rubidium
parents: 10532
diff changeset
   364
		this->DrawWidgets();
10494
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   365
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   366
		/* sets up the string for the vehicle that is being replaced to */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   367
		if (selected_id[0] != INVALID_ENGINE) {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   368
			if (!EngineHasReplacementForPlayer(p, selected_id[0], selected_group)) {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   369
				SetDParam(0, STR_NOT_REPLACING);
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   370
			} else {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   371
				SetDParam(0, STR_ENGINE_NAME);
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   372
				SetDParam(1, EngineReplacementForPlayer(p, selected_id[0], selected_group));
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   373
			}
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   374
		} else {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   375
			SetDParam(0, STR_NOT_REPLACING_VEHICLE_SELECTED);
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   376
		}
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   377
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   378
		DrawString(145, this->widget[RVW_WIDGET_INFO_TAB].top + 1, STR_02BD, TC_BLACK);
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   379
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   380
		/* Draw the lists */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   381
		for (byte i = 0; i < 2; i++) {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   382
			uint widget     = (i == 0) ? RVW_WIDGET_LEFT_MATRIX : RVW_WIDGET_RIGHT_MATRIX;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   383
			EngineList list = this->list[i]; // which list to draw
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   384
			EngineID start  = i == 0 ? this->vscroll.pos : this->vscroll2.pos; // what is the offset for the start (scrolling)
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   385
			EngineID end    = min((i == 0 ? this->vscroll.cap : this->vscroll2.cap) + start, list.size());
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   386
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   387
			/* Do the actual drawing */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   388
			DrawEngineList((VehicleType)this->window_number, this->widget[widget].left + 2, this->widget[widget].top + 1, list, start, end, this->sel_engine[i], i == 0 ? this->widget[RVW_WIDGET_LEFT_MATRIX].right - 2 : 0, selected_group);
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   389
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   390
			/* Also draw the details if an engine is selected */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   391
			if (this->sel_engine[i] != INVALID_ENGINE) {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   392
				const Widget *wi = &this->widget[i == 0 ? RVW_WIDGET_LEFT_DETAILS : RVW_WIDGET_RIGHT_DETAILS];
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   393
				int text_end = DrawVehiclePurchaseInfo(wi->left + 2, wi->top + 1, wi->right - wi->left - 2, this->sel_engine[i]);
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   394
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   395
				if (text_end > wi->bottom) {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   396
					this->SetDirty();
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   397
					ResizeWindowForWidget(this, i == 0 ? RVW_WIDGET_LEFT_DETAILS : RVW_WIDGET_RIGHT_DETAILS, 0, text_end - wi->bottom);
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   398
					this->SetDirty();
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   399
				}
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   400
			}
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   401
		}
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   402
	}
8915
db4c2ae09c4b (svn r11989) -Fix: Resize autoreplace window to fit purchase information text if it is too large.
peter1138
parents: 8848
diff changeset
   403
10494
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   404
	virtual void OnClick(Point pt, int widget)
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   405
	{
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   406
		switch (widget) {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   407
			case RVW_WIDGET_TRAIN_ENGINEWAGON_TOGGLE:
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   408
				this->wagon_btnstate = !(this->wagon_btnstate);
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   409
				this->update_left = true;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   410
				this->init_lists  = true;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   411
				this->SetDirty();
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   412
				break;
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   413
10494
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   414
			case RVW_WIDGET_TRAIN_RAILTYPE_DROPDOWN: /* Railtype selection dropdown menu */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   415
				ShowDropDownMenu(this, _rail_types_list, sel_railtype, RVW_WIDGET_TRAIN_RAILTYPE_DROPDOWN, 0, ~GetPlayer(_local_player)->avail_railtypes);
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   416
				break;
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   417
10494
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   418
			case RVW_WIDGET_TRAIN_WAGONREMOVE_TOGGLE: /* toggle renew_keep_length */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   419
				DoCommandP(0, 5, GetPlayer(_local_player)->renew_keep_length ? 0 : 1, NULL, CMD_SET_AUTOREPLACE);
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   420
				break;
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   421
10494
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   422
			case RVW_WIDGET_START_REPLACE: { /* Start replacing */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   423
				EngineID veh_from = this->sel_engine[0];
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   424
				EngineID veh_to = this->sel_engine[1];
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   425
				DoCommandP(0, 3 + (this->sel_group << 16) , veh_from + (veh_to << 16), NULL, CMD_SET_AUTOREPLACE);
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   426
			} break;
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   427
10494
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   428
			case RVW_WIDGET_STOP_REPLACE: { /* Stop replacing */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   429
				EngineID veh_from = this->sel_engine[0];
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   430
				DoCommandP(0, 3 + (this->sel_group << 16), veh_from + (INVALID_ENGINE << 16), NULL, CMD_SET_AUTOREPLACE);
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   431
			} break;
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   432
10494
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   433
			case RVW_WIDGET_LEFT_MATRIX:
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   434
			case RVW_WIDGET_RIGHT_MATRIX: {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   435
				uint i = (pt.y - 14) / this->resize.step_height;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   436
				uint16 click_scroll_pos = widget == RVW_WIDGET_LEFT_MATRIX ? this->vscroll.pos : this->vscroll2.pos;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   437
				uint16 click_scroll_cap = widget == RVW_WIDGET_LEFT_MATRIX ? this->vscroll.cap : this->vscroll2.cap;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   438
				byte click_side         = widget == RVW_WIDGET_LEFT_MATRIX ? 0 : 1;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   439
				size_t engine_count     = this->list[click_side].size();
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   440
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   441
				if (i < click_scroll_cap) {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   442
					i += click_scroll_pos;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   443
					EngineID e = engine_count > i ? this->list[click_side][i] : INVALID_ENGINE;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   444
					if (e == this->sel_engine[click_side]) break; // we clicked the one we already selected
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   445
					this->sel_engine[click_side] = e;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   446
					if (click_side == 0) {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   447
						this->update_right = true;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   448
						this->init_lists   = true;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   449
					}
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   450
					this->SetDirty();
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   451
					}
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   452
				break;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   453
				}
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   454
		}
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   455
	}
10494
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   456
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   457
	virtual void OnDropdownSelect(int widget, int index)
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   458
	{
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   459
		RailType temp = (RailType)index;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   460
		if (temp == sel_railtype) return; // we didn't select a new one. No need to change anything
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   461
		sel_railtype = temp;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   462
		/* Reset scrollbar positions */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   463
		this->vscroll.pos  = 0;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   464
		this->vscroll2.pos = 0;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   465
		/* Rebuild the lists */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   466
		this->update_left  = true;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   467
		this->update_right = true;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   468
		this->init_lists   = true;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   469
		this->SetDirty();
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   470
	}
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   471
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   472
	virtual void OnResize(Point new_size, Point delta) {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   473
		this->vscroll.cap  += delta.y / (int)this->resize.step_height;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   474
		this->vscroll2.cap += delta.y / (int)this->resize.step_height;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   475
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   476
		Widget *widget = this->widget;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   477
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   478
		widget[RVW_WIDGET_LEFT_MATRIX].data = widget[RVW_WIDGET_RIGHT_MATRIX].data = (this->vscroll2.cap << 8) + 1;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   479
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   480
		if (delta.x != 0) {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   481
			/* We changed the width of the window so we have to resize the lists.
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   482
				* Because ResizeButtons() makes each widget the same size it can't be used on the lists
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   483
				* because then the lists would have the same size as the scrollbars.
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   484
				* Instead we use it on the detail panels.
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   485
				* Afterwards we use the new location of the detail panels (the middle of the window)
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   486
				* to place the lists.
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   487
				* This way the lists will have equal size while keeping the width of the scrollbars unchanged. */
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   488
			ResizeButtons(this, RVW_WIDGET_LEFT_DETAILS, RVW_WIDGET_RIGHT_DETAILS);
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   489
			widget[RVW_WIDGET_RIGHT_MATRIX].left    = widget[RVW_WIDGET_RIGHT_DETAILS].left;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   490
			widget[RVW_WIDGET_LEFT_SCROLLBAR].right = widget[RVW_WIDGET_LEFT_DETAILS].right;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   491
			widget[RVW_WIDGET_LEFT_SCROLLBAR].left  = widget[RVW_WIDGET_LEFT_SCROLLBAR].right - 11;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   492
			widget[RVW_WIDGET_LEFT_MATRIX].right    = widget[RVW_WIDGET_LEFT_SCROLLBAR].left - 1;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   493
		}
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   494
	}
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   495
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   496
	virtual void OnInvalidateData(int data)
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   497
	{
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   498
		if (data != 0) {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   499
			this->update_left = true;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   500
		} else {
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   501
			this->update_right = true;
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   502
		}
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   503
	}
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   504
};
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   505
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   506
static const Widget _replace_vehicle_widgets[] = {
10296
a1b48fc82022 (svn r12837) -Codechange: Alignment of widget array
belugas
parents: 9282
diff changeset
   507
{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,                        STR_018B_CLOSE_WINDOW},
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   508
{    WWT_CAPTION,  RESIZE_RIGHT,    14,    11,   443,     0,    13, STR_REPLACE_VEHICLES_WHITE,      STR_018C_WINDOW_TITLE_DRAG_THIS},
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   509
{  WWT_STICKYBOX,     RESIZE_LR,    14,   444,   455,     0,    13, STR_NULL,                        STR_STICKY_BUTTON},
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   510
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   511
{     WWT_MATRIX, RESIZE_BOTTOM,    14,     0,   215,    14,    13, 0x1,                             STR_REPLACE_HELP_LEFT_ARRAY},
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   512
{  WWT_SCROLLBAR, RESIZE_BOTTOM,    14,   216,   227,    14,    13, STR_NULL,                        STR_0190_SCROLL_BAR_SCROLLS_LIST},
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   513
{     WWT_MATRIX,    RESIZE_LRB,    14,   228,   443,    14,    13, 0x1,                             STR_REPLACE_HELP_RIGHT_ARRAY},
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   514
{ WWT_SCROLL2BAR,    RESIZE_LRB,    14,   444,   455,    14,    13, STR_NULL,                        STR_0190_SCROLL_BAR_SCROLLS_LIST},
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   515
{      WWT_PANEL,     RESIZE_TB,    14,     0,   227,    14,   105, 0x0,                             STR_NULL},
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   516
{      WWT_PANEL,    RESIZE_RTB,    14,   228,   455,    14,   105, 0x0,                             STR_NULL},
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   517
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   518
{ WWT_PUSHTXTBTN,     RESIZE_TB,    14,     0,   138,   106,   117, STR_REPLACE_VEHICLES_START,      STR_REPLACE_HELP_START_BUTTON},
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   519
{      WWT_PANEL,    RESIZE_RTB,    14,   139,   305,   106,   117, 0x0,                             STR_REPLACE_HELP_REPLACE_INFO_TAB},
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   520
{ WWT_PUSHTXTBTN,   RESIZE_LRTB,    14,   306,   443,   106,   117, STR_REPLACE_VEHICLES_STOP,       STR_REPLACE_HELP_STOP_BUTTON},
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   521
{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   444,   455,   106,   117, STR_NULL,                        STR_RESIZE_BUTTON},
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   522
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   523
{ WWT_PUSHTXTBTN,     RESIZE_TB,    14,     0,   138,   128,   139, STR_REPLACE_ENGINE_WAGON_SELECT, STR_REPLACE_ENGINE_WAGON_SELECT_HELP},
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   524
{      WWT_PANEL,     RESIZE_TB,    14,   139,   153,   128,   139, 0x0,                             STR_NULL},
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   525
{   WWT_DROPDOWN,    RESIZE_RTB,    14,   154,   289,   128,   139, 0x0,                             STR_REPLACE_HELP_RAILTYPE},
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   526
{      WWT_PANEL,   RESIZE_LRTB,    14,   290,   305,   128,   139, 0x0,                             STR_NULL},
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   527
{ WWT_PUSHTXTBTN,   RESIZE_LRTB,    14,   306,   443,   128,   139, STR_REPLACE_REMOVE_WAGON,        STR_REPLACE_REMOVE_WAGON_HELP},
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   528
{   WIDGETS_END},
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   529
};
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   530
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   531
static const WindowDesc _replace_rail_vehicle_desc = {
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   532
	WDP_AUTO, WDP_AUTO, 456, 140, 456, 140,
6144
5a0ffbf27ced (svn r8511) -Codechange: make WindowClass an enumerated value.
rubidium
parents: 6119
diff changeset
   533
	WC_REPLACE_VEHICLE, WC_NONE,
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   534
	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE,
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   535
	_replace_vehicle_widgets,
10494
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   536
	NULL
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   537
};
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   538
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   539
static const WindowDesc _replace_vehicle_desc = {
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   540
	WDP_AUTO, WDP_AUTO, 456, 118, 456, 118,
6144
5a0ffbf27ced (svn r8511) -Codechange: make WindowClass an enumerated value.
rubidium
parents: 6119
diff changeset
   541
	WC_REPLACE_VEHICLE, WC_NONE,
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   542
	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE,
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   543
	_replace_vehicle_widgets,
10494
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   544
	NULL
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   545
};
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   546
10494
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   547
RailType ReplaceVehicleWindow::sel_railtype = RAILTYPE_RAIL;
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   548
7139
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 7134
diff changeset
   549
void ShowReplaceGroupVehicleWindow(GroupID id_g, VehicleType vehicletype)
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 7134
diff changeset
   550
{
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 7134
diff changeset
   551
	DeleteWindowById(WC_REPLACE_VEHICLE, vehicletype);
10494
fb0f514eb9b6 (svn r13037) -Codechange: make a class of the ReplaceVehicle window.
rubidium
parents: 10492
diff changeset
   552
	new ReplaceVehicleWindow(vehicletype == VEH_TRAIN ? &_replace_rail_vehicle_desc : &_replace_vehicle_desc, vehicletype, id_g);
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   553
}