src/station_gui.cpp
author rubidium
Sun, 18 May 2008 12:17:52 +0000
changeset 10614 04d1add9e12d
parent 10595 7957c71b0dfe
child 10621 3edd349d9c14
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: 10411
diff changeset
     3
/** @file station_gui.cpp The GUI for stations. */
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6691
diff changeset
     4
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
     5
#include "stdafx.h"
1891
92a3b0aa0946 (svn r2397) - CodeChange: rename all "ttd" files to "openttd" files.
Darkvater
parents: 1820
diff changeset
     6
#include "openttd.h"
1299
0a6510cc889b (svn r1803) Move debugging stuff into files of it's own
tron
parents: 1272
diff changeset
     7
#include "debug.h"
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
     8
#include "gui.h"
8603
88c5ce6a5215 (svn r11668) -Codechange: more refactoring aimed at reducing compile time and making it more logic where function definitions can be found.
rubidium
parents: 8602
diff changeset
     9
#include "window_gui.h"
88c5ce6a5215 (svn r11668) -Codechange: more refactoring aimed at reducing compile time and making it more logic where function definitions can be found.
rubidium
parents: 8602
diff changeset
    10
#include "textbuf_gui.h"
9281
d8cd9ac52a68 (svn r12489) -Codechange: split station.h into station_base.h and station_func.h.
rubidium
parents: 9258
diff changeset
    11
#include "station_base.h"
8750
fdd6054e7bae (svn r11818) -Codechange: split player.h into smaller pieces.
rubidium
parents: 8720
diff changeset
    12
#include "player_func.h"
8612
6414fc21c2f3 (svn r11677) -Codechange: move price and command related types/functions to their respective places.
rubidium
parents: 8610
diff changeset
    13
#include "economy_func.h"
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    14
#include "town.h"
8612
6414fc21c2f3 (svn r11677) -Codechange: move price and command related types/functions to their respective places.
rubidium
parents: 8610
diff changeset
    15
#include "command_func.h"
2159
3b634157c3b2 (svn r2669) Shuffle some more stuff around to reduce dependencies
tron
parents: 2084
diff changeset
    16
#include "variables.h"
3b634157c3b2 (svn r2669) Shuffle some more stuff around to reduce dependencies
tron
parents: 2084
diff changeset
    17
#include "vehicle_gui.h"
6417
26acff62d001 (svn r8826) -Codechange: Replace _cargoc's separate arrays with a regular struct array (with accessor) and implement new initialization method using cargo labels.
peter1138
parents: 6144
diff changeset
    18
#include "cargotype.h"
8512
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
    19
#include "station_gui.h"
9281
d8cd9ac52a68 (svn r12489) -Codechange: split station.h into station_base.h and station_func.h.
rubidium
parents: 9258
diff changeset
    20
#include "station_func.h"
8610
17cc343a23dd (svn r11675) -Codechange: split the string types from the string functions.
rubidium
parents: 8605
diff changeset
    21
#include "strings_func.h"
8626
440dfcd14c4a (svn r11691) -Codechange: move+rename helpers.hpp and only include it when it is really needed.
rubidium
parents: 8617
diff changeset
    22
#include "core/alloc_func.hpp"
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: 8626
diff changeset
    23
#include "window_func.h"
8720
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8675
diff changeset
    24
#include "viewport_func.h"
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8675
diff changeset
    25
#include "gfx_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: 8764
diff changeset
    26
#include "widgets/dropdown_func.h"
9283
624272490f5a (svn r12495) -Codechange: reduce the dependency on newgrf_station.h (especially because newgrf_station.h includes a lot of stuff).
rubidium
parents: 9281
diff changeset
    27
#include "newgrf_cargo.h"
10484
e8beb2845f13 (svn r13027) -Codechange: use StrEmpty instead of arr[0] == '\0' and remove the need for WE_ON_EDIT_TEXT_CANCEL.
rubidium
parents: 10462
diff changeset
    28
#include "string_func.h"
5271
419c6746fd90 (svn r7413) -Fix[FS#386,#412]: Station list window NONE button now behaves correctly.
belugas
parents: 5247
diff changeset
    29
8760
ce0891c412ce (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8750
diff changeset
    30
#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
    31
#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
    32
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
    33
typedef int CDECL StationSortListingTypeFunction(const void*, const void*);
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
    34
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
    35
static StationSortListingTypeFunction StationNameSorter;
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
    36
static StationSortListingTypeFunction StationTypeSorter;
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
    37
static StationSortListingTypeFunction StationWaitingSorter;
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
    38
static StationSortListingTypeFunction StationRatingMaxSorter;
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
    39
8764
65746a5248ec (svn r11832) -Codechange: get rid of (quite) some VARDEFs.
rubidium
parents: 8760
diff changeset
    40
bool _station_show_coverage;
65746a5248ec (svn r11832) -Codechange: get rid of (quite) some VARDEFs.
rubidium
parents: 8760
diff changeset
    41
8512
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
    42
/**
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
    43
 * Draw small boxes of cargo amount and ratings data at the given
5293
4d59f970b2fe (svn r7446) -Feature: Double the length of the cargo and rating indicators in the station list window,
Darkvater
parents: 5292
diff changeset
    44
 * coordinates. If amount exceeds 576 units, it is shown 'full', same
4d59f970b2fe (svn r7446) -Feature: Double the length of the cargo and rating indicators in the station list window,
Darkvater
parents: 5292
diff changeset
    45
 * goes for the rating: at above 90% orso (224) it is also 'full'
8512
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
    46
 *
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6691
diff changeset
    47
 * @param x coordinate to draw the box at
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6691
diff changeset
    48
 * @param y coordinate to draw the box at
5293
4d59f970b2fe (svn r7446) -Feature: Double the length of the cargo and rating indicators in the station list window,
Darkvater
parents: 5292
diff changeset
    49
 * @param type Cargo type
4d59f970b2fe (svn r7446) -Feature: Double the length of the cargo and rating indicators in the station list window,
Darkvater
parents: 5292
diff changeset
    50
 * @param amount Cargo amount
8512
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
    51
 * @param rating ratings data for that particular cargo
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
    52
 *
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
    53
 * @note Each cargo-bar is 16 pixels wide and 6 pixels high
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
    54
 * @note Each rating 14 pixels wide and 1 pixel high and is 1 pixel below the cargo-bar
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
    55
 */
5293
4d59f970b2fe (svn r7446) -Feature: Double the length of the cargo and rating indicators in the station list window,
Darkvater
parents: 5292
diff changeset
    56
static void StationsWndShowStationRating(int x, int y, CargoID type, uint amount, byte rating)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    57
{
8512
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
    58
	static const uint units_full  = 576; ///< number of units to show station as 'full'
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
    59
	static const uint rating_full = 224; ///< rating needed so it is shown as 'full'
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
    60
6417
26acff62d001 (svn r8826) -Codechange: Replace _cargoc's separate arrays with a regular struct array (with accessor) and implement new initialization method using cargo labels.
peter1138
parents: 6144
diff changeset
    61
	const CargoSpec *cs = GetCargo(type);
6448
a749c78812a7 (svn r8858) -Codechange: Replace magic number test with class method for determining if a cargo is valid/active.
peter1138
parents: 6417
diff changeset
    62
	if (!cs->IsValid()) return;
6417
26acff62d001 (svn r8826) -Codechange: Replace _cargoc's separate arrays with a regular struct array (with accessor) and implement new initialization method using cargo labels.
peter1138
parents: 6144
diff changeset
    63
26acff62d001 (svn r8826) -Codechange: Replace _cargoc's separate arrays with a regular struct array (with accessor) and implement new initialization method using cargo labels.
peter1138
parents: 6144
diff changeset
    64
	int colour = cs->rating_colour;
8512
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
    65
	uint w = (minu(amount, units_full) + 5) / 36;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    66
5293
4d59f970b2fe (svn r7446) -Feature: Double the length of the cargo and rating indicators in the station list window,
Darkvater
parents: 5292
diff changeset
    67
	/* Draw total cargo (limited) on station (fits into 16 pixels) */
4d59f970b2fe (svn r7446) -Feature: Double the length of the cargo and rating indicators in the station list window,
Darkvater
parents: 5292
diff changeset
    68
	if (w != 0) GfxFillRect(x, y, x + w - 1, y + 6, colour);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    69
5293
4d59f970b2fe (svn r7446) -Feature: Double the length of the cargo and rating indicators in the station list window,
Darkvater
parents: 5292
diff changeset
    70
	/* Draw a one pixel-wide bar of additional cargo meter, useful
4d59f970b2fe (svn r7446) -Feature: Double the length of the cargo and rating indicators in the station list window,
Darkvater
parents: 5292
diff changeset
    71
	 * for stations with only a small amount (<=30) */
4d59f970b2fe (svn r7446) -Feature: Double the length of the cargo and rating indicators in the station list window,
Darkvater
parents: 5292
diff changeset
    72
	if (w == 0) {
4d59f970b2fe (svn r7446) -Feature: Double the length of the cargo and rating indicators in the station list window,
Darkvater
parents: 5292
diff changeset
    73
		uint rest = amount / 5;
4d59f970b2fe (svn r7446) -Feature: Double the length of the cargo and rating indicators in the station list window,
Darkvater
parents: 5292
diff changeset
    74
		if (rest != 0) {
4d59f970b2fe (svn r7446) -Feature: Double the length of the cargo and rating indicators in the station list window,
Darkvater
parents: 5292
diff changeset
    75
			w += x;
4d59f970b2fe (svn r7446) -Feature: Double the length of the cargo and rating indicators in the station list window,
Darkvater
parents: 5292
diff changeset
    76
			GfxFillRect(w, y + 6 - rest, w, y + 6, colour);
4d59f970b2fe (svn r7446) -Feature: Double the length of the cargo and rating indicators in the station list window,
Darkvater
parents: 5292
diff changeset
    77
		}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    78
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    79
8320
6ffad7a5d242 (svn r11374) -Codechange: Give meaning to the magical number that specifies the color of the text in a DrawString call.
belugas
parents: 7970
diff changeset
    80
	DrawString(x + 1, y, cs->abbrev, TC_BLACK);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    81
5293
4d59f970b2fe (svn r7446) -Feature: Double the length of the cargo and rating indicators in the station list window,
Darkvater
parents: 5292
diff changeset
    82
	/* Draw green/red ratings bar (fits into 14 pixels) */
4d59f970b2fe (svn r7446) -Feature: Double the length of the cargo and rating indicators in the station list window,
Darkvater
parents: 5292
diff changeset
    83
	y += 8;
4d59f970b2fe (svn r7446) -Feature: Double the length of the cargo and rating indicators in the station list window,
Darkvater
parents: 5292
diff changeset
    84
	GfxFillRect(x + 1, y, x + 14, y, 0xB8);
8512
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
    85
	rating = minu(rating, rating_full) / 16;
5293
4d59f970b2fe (svn r7446) -Feature: Double the length of the cargo and rating indicators in the station list window,
Darkvater
parents: 5292
diff changeset
    86
	if (rating != 0) GfxFillRect(x + 1, y, x + rating, y, 0xD0);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    87
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    88
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
    89
const StringID _station_sort_listing[] = {
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
    90
	STR_SORT_BY_DROPDOWN_NAME,
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
    91
	STR_SORT_BY_FACILITY,
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
    92
	STR_SORT_BY_WAITING,
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
    93
	STR_SORT_BY_RATING_MAX,
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
    94
	INVALID_STRING_ID
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
    95
};
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    96
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    97
static char _bufcache[64];
10224
4f7e3408936b (svn r12756) -Cleanup: variable scope and coding style in station*
smatz
parents: 10083
diff changeset
    98
static const Station *_last_station;
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
    99
static int _internal_sort_order;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   100
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: 69
diff changeset
   101
static int CDECL StationNameSorter(const void *a, const void *b)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   102
{
10224
4f7e3408936b (svn r12756) -Cleanup: variable scope and coding style in station*
smatz
parents: 10083
diff changeset
   103
	const Station *st1 = *(const Station**)a;
4f7e3408936b (svn r12756) -Cleanup: variable scope and coding style in station*
smatz
parents: 10083
diff changeset
   104
	const Station *st2 = *(const Station**)b;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   105
	char buf1[64];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   106
4416
e0e9a72882d0 (svn r6169) -Codechange: Use GetString() instead of GetStringWithArgs() which should be
Darkvater
parents: 4354
diff changeset
   107
	SetDParam(0, st1->index);
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4896
diff changeset
   108
	GetString(buf1, STR_STATION, lastof(buf1));
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: 69
diff changeset
   109
4277
3539bd14f023 (svn r5907) Remove more indirection by using pointers instead of IDs. Also fix some bogus warnings on MSVC by using (void*) casts
tron
parents: 4268
diff changeset
   110
	if (st2 != _last_station) {
3539bd14f023 (svn r5907) Remove more indirection by using pointers instead of IDs. Also fix some bogus warnings on MSVC by using (void*) casts
tron
parents: 4268
diff changeset
   111
		_last_station = st2;
4416
e0e9a72882d0 (svn r6169) -Codechange: Use GetString() instead of GetStringWithArgs() which should be
Darkvater
parents: 4354
diff changeset
   112
		SetDParam(0, st2->index);
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4896
diff changeset
   113
		GetString(_bufcache, STR_STATION, lastof(_bufcache));
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: 69
diff changeset
   114
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   115
10224
4f7e3408936b (svn r12756) -Cleanup: variable scope and coding style in station*
smatz
parents: 10083
diff changeset
   116
	int r = strcmp(buf1, _bufcache); // sort by name
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   117
	return (_internal_sort_order & 1) ? -r : r;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   118
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   119
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   120
static int CDECL StationTypeSorter(const void *a, const void *b)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   121
{
10224
4f7e3408936b (svn r12756) -Cleanup: variable scope and coding style in station*
smatz
parents: 10083
diff changeset
   122
	const Station *st1 = *(const Station**)a;
4f7e3408936b (svn r12756) -Cleanup: variable scope and coding style in station*
smatz
parents: 10083
diff changeset
   123
	const Station *st2 = *(const Station**)b;
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   124
	return (_internal_sort_order & 1) ? st2->facilities - st1->facilities : st1->facilities - st2->facilities;
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   125
}
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   126
10224
4f7e3408936b (svn r12756) -Cleanup: variable scope and coding style in station*
smatz
parents: 10083
diff changeset
   127
static const uint32 _cargo_filter_max = UINT32_MAX;
8382
f1be7a96ac28 (svn r11437) -Change: when sorting stations by cargo sum, only sum the cargos that are selected in the filter. Patch by divide.
rubidium
parents: 8338
diff changeset
   128
static uint32 _cargo_filter = _cargo_filter_max;
f1be7a96ac28 (svn r11437) -Change: when sorting stations by cargo sum, only sum the cargos that are selected in the filter. Patch by divide.
rubidium
parents: 8338
diff changeset
   129
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   130
static int CDECL StationWaitingSorter(const void *a, const void *b)
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   131
{
10224
4f7e3408936b (svn r12756) -Cleanup: variable scope and coding style in station*
smatz
parents: 10083
diff changeset
   132
	const Station *st1 = *(const Station**)a;
4f7e3408936b (svn r12756) -Cleanup: variable scope and coding style in station*
smatz
parents: 10083
diff changeset
   133
	const Station *st2 = *(const Station**)b;
7486
d130c10f4dab (svn r10246) -Fix (r10297): some forgotten money conversions and truncation issues. Thanks to benc for providing the patch.
rubidium
parents: 7153
diff changeset
   134
	Money sum1 = 0, sum2 = 0;
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   135
6528
b705912233fa (svn r8988) -Fix: Indenting, variable scope, variable type and minor duffage
peter1138
parents: 6448
diff changeset
   136
	for (CargoID j = 0; j < NUM_CARGO; j++) {
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8382
diff changeset
   137
		if (!HasBit(_cargo_filter, j)) continue;
7506
e52d89f5c7c1 (svn r10266) -Codechange: keep track of the origin, time of travel and accumulated feeder share (transfers) of individual pieces of cargo. This means that cargo isn't thrown on a big pile when it's put in a station or unloaded at a station, however the GUI does not reflect these changes yet so you will not actually see it.
rubidium
parents: 7486
diff changeset
   138
		if (!st1->goods[j].cargo.Empty()) sum1 += GetTransportedGoodsIncome(st1->goods[j].cargo.Count(), 20, 50, j);
e52d89f5c7c1 (svn r10266) -Codechange: keep track of the origin, time of travel and accumulated feeder share (transfers) of individual pieces of cargo. This means that cargo isn't thrown on a big pile when it's put in a station or unloaded at a station, however the GUI does not reflect these changes yet so you will not actually see it.
rubidium
parents: 7486
diff changeset
   139
		if (!st2->goods[j].cargo.Empty()) sum2 += GetTransportedGoodsIncome(st2->goods[j].cargo.Count(), 20, 50, j);
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   140
	}
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   141
7486
d130c10f4dab (svn r10246) -Fix (r10297): some forgotten money conversions and truncation issues. Thanks to benc for providing the patch.
rubidium
parents: 7153
diff changeset
   142
	return (_internal_sort_order & 1) ? ClampToI32(sum2 - sum1) : ClampToI32(sum1 - sum2);
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   143
}
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   144
6579
2eb90ced504b (svn r9062) -Fix (r4822, FS#595): The station list, sorted by cargo rating, now takes stations into account that have no cargo waiting (KeeperOfTheSoul). While at it, doxygen the function
celestar
parents: 6574
diff changeset
   145
/**
2eb90ced504b (svn r9062) -Fix (r4822, FS#595): The station list, sorted by cargo rating, now takes stations into account that have no cargo waiting (KeeperOfTheSoul). While at it, doxygen the function
celestar
parents: 6574
diff changeset
   146
 * qsort-compatible version of sorting two stations by maximum rating
2eb90ced504b (svn r9062) -Fix (r4822, FS#595): The station list, sorted by cargo rating, now takes stations into account that have no cargo waiting (KeeperOfTheSoul). While at it, doxygen the function
celestar
parents: 6574
diff changeset
   147
 * @param a   First object to be sorted, must be of type (const Station *)
2eb90ced504b (svn r9062) -Fix (r4822, FS#595): The station list, sorted by cargo rating, now takes stations into account that have no cargo waiting (KeeperOfTheSoul). While at it, doxygen the function
celestar
parents: 6574
diff changeset
   148
 * @param b   Second object to be sorted, must be of type (const Station *)
2eb90ced504b (svn r9062) -Fix (r4822, FS#595): The station list, sorted by cargo rating, now takes stations into account that have no cargo waiting (KeeperOfTheSoul). While at it, doxygen the function
celestar
parents: 6574
diff changeset
   149
 * @return    The sort order
2eb90ced504b (svn r9062) -Fix (r4822, FS#595): The station list, sorted by cargo rating, now takes stations into account that have no cargo waiting (KeeperOfTheSoul). While at it, doxygen the function
celestar
parents: 6574
diff changeset
   150
 * @retval >0 a should come before b in the list
2eb90ced504b (svn r9062) -Fix (r4822, FS#595): The station list, sorted by cargo rating, now takes stations into account that have no cargo waiting (KeeperOfTheSoul). While at it, doxygen the function
celestar
parents: 6574
diff changeset
   151
 * @retval <0 b should come before a in the list
2eb90ced504b (svn r9062) -Fix (r4822, FS#595): The station list, sorted by cargo rating, now takes stations into account that have no cargo waiting (KeeperOfTheSoul). While at it, doxygen the function
celestar
parents: 6574
diff changeset
   152
 */
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   153
static int CDECL StationRatingMaxSorter(const void *a, const void *b)
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   154
{
10224
4f7e3408936b (svn r12756) -Cleanup: variable scope and coding style in station*
smatz
parents: 10083
diff changeset
   155
	const Station *st1 = *(const Station**)a;
4f7e3408936b (svn r12756) -Cleanup: variable scope and coding style in station*
smatz
parents: 10083
diff changeset
   156
	const Station *st2 = *(const Station**)b;
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   157
	byte maxr1 = 0;
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   158
	byte maxr2 = 0;
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   159
6528
b705912233fa (svn r8988) -Fix: Indenting, variable scope, variable type and minor duffage
peter1138
parents: 6448
diff changeset
   160
	for (CargoID j = 0; j < NUM_CARGO; j++) {
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8382
diff changeset
   161
		if (HasBit(st1->goods[j].acceptance_pickup, GoodsEntry::PICKUP)) maxr1 = max(maxr1, st1->goods[j].rating);
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8382
diff changeset
   162
		if (HasBit(st2->goods[j].acceptance_pickup, GoodsEntry::PICKUP)) maxr2 = max(maxr2, st2->goods[j].rating);
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   163
	}
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   164
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   165
	return (_internal_sort_order & 1) ? maxr2 - maxr1 : maxr1 - maxr2;
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   166
}
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   167
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   168
typedef GUIList<const Station*> GUIStationList;
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   169
8512
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   170
/**
10255
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10224
diff changeset
   171
 * Set the station sort flag for all station-list windows.
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10224
diff changeset
   172
 * @param sl_flag Sort list flag to set for all station-list windows
8512
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   173
 */
10510
3a236c24ff88 (svn r13053) -Codechange: station sorting used it's own implementation of GUIList and the associated enums, now it doesn't anymore.
rubidium
parents: 10505
diff changeset
   174
static void SetStationListsFlag(SortListFlags sl_flag)
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   175
{
10224
4f7e3408936b (svn r12756) -Cleanup: variable scope and coding style in station*
smatz
parents: 10083
diff changeset
   176
	Window *const *wz;
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   177
5124
d30772d0e9e1 (svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents: 5070
diff changeset
   178
	FOR_ALL_WINDOWS(wz) {
d30772d0e9e1 (svn r7205) -Fix [FS#350, SF#1560913]: Window allocation and deletion messed with the actual window
Darkvater
parents: 5070
diff changeset
   179
		Window *w = *wz;
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   180
		if (w->window_class == WC_STATION_LIST) {
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   181
			dynamic_cast<GUIStationList*>(w)->flags |= sl_flag;
10434
d6accd017341 (svn r12976) -Codechange: use w->SetDirty() instead of SetWindowDirty(w) when it's certain that w != NULL.
rubidium
parents: 10429
diff changeset
   182
			w->SetDirty();
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   183
		}
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   184
	}
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   185
}
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   186
8512
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   187
/**
10510
3a236c24ff88 (svn r13053) -Codechange: station sorting used it's own implementation of GUIList and the associated enums, now it doesn't anymore.
rubidium
parents: 10505
diff changeset
   188
 * Set the 'VL_REBUILD' flag for all station lists
10255
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10224
diff changeset
   189
 */
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10224
diff changeset
   190
void RebuildStationLists()
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10224
diff changeset
   191
{
10510
3a236c24ff88 (svn r13053) -Codechange: station sorting used it's own implementation of GUIList and the associated enums, now it doesn't anymore.
rubidium
parents: 10505
diff changeset
   192
	SetStationListsFlag(VL_REBUILD);
10255
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10224
diff changeset
   193
}
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10224
diff changeset
   194
5600b575e6e7 (svn r12787) -Documentation: add/fix documentation of some functions. Patch by Alberth.
rubidium
parents: 10224
diff changeset
   195
/**
10510
3a236c24ff88 (svn r13053) -Codechange: station sorting used it's own implementation of GUIList and the associated enums, now it doesn't anymore.
rubidium
parents: 10505
diff changeset
   196
 * Set the 'VL_RESORT' flag for all station lists
8512
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   197
 */
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6528
diff changeset
   198
void ResortStationLists()
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   199
{
10510
3a236c24ff88 (svn r13053) -Codechange: station sorting used it's own implementation of GUIList and the associated enums, now it doesn't anymore.
rubidium
parents: 10505
diff changeset
   200
	SetStationListsFlag(VL_RESORT);
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   201
}
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   202
8512
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   203
/**
10510
3a236c24ff88 (svn r13053) -Codechange: station sorting used it's own implementation of GUIList and the associated enums, now it doesn't anymore.
rubidium
parents: 10505
diff changeset
   204
 * Rebuild station list if the VL_REBUILD flag is set
8512
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   205
 *
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   206
 * @param sl pointer to plstations_d (station list and flags)
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   207
 * @param owner player whose stations are to be in list
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   208
 * @param facilities types of stations of interest
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   209
 * @param cargo_filter bitmap of cargo types to include
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   210
 * @param include_empty whether we should include stations without waiting cargo
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   211
 */
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   212
static void BuildStationsList(GUIStationList *sl, PlayerID owner, byte facilities, uint32 cargo_filter, bool include_empty)
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   213
{
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   214
	uint n = 0;
243
9a40daa560ae (svn r244) -Fix: Stations were not sorted for non-player-0 players
darkvater
parents: 222
diff changeset
   215
	const Station *st;
9a40daa560ae (svn r244) -Fix: Stations were not sorted for non-player-0 players
darkvater
parents: 222
diff changeset
   216
10510
3a236c24ff88 (svn r13053) -Codechange: station sorting used it's own implementation of GUIList and the associated enums, now it doesn't anymore.
rubidium
parents: 10505
diff changeset
   217
	if (!(sl->flags & VL_REBUILD)) return;
919
b0d6c7642f99 (svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents: 893
diff changeset
   218
b0d6c7642f99 (svn r1407) -Codechange: changed a lot around _stations, _vehicles, _towns and _industries
truelight
parents: 893
diff changeset
   219
	/* Create array for sorting */
10224
4f7e3408936b (svn r12756) -Cleanup: variable scope and coding style in station*
smatz
parents: 10083
diff changeset
   220
	const Station **station_sort = MallocT<const Station*>(GetMaxStationIndex() + 1);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   221
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5293
diff changeset
   222
	DEBUG(misc, 3, "Building station list for player %d", owner);
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   223
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   224
	FOR_ALL_STATIONS(st) {
8605
b1f538188811 (svn r11670) -Feature [FS#1565]: list neutral stations where the player has service in the station list too
smatz
parents: 8603
diff changeset
   225
		if (st->owner == owner || (st->owner == OWNER_NONE && !st->IsBuoy() && HasStationInUse(st->index, owner))) {
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   226
			if (facilities & st->facilities) { //only stations with selected facilities
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   227
				int num_waiting_cargo = 0;
6528
b705912233fa (svn r8988) -Fix: Indenting, variable scope, variable type and minor duffage
peter1138
parents: 6448
diff changeset
   228
				for (CargoID j = 0; j < NUM_CARGO; j++) {
7506
e52d89f5c7c1 (svn r10266) -Codechange: keep track of the origin, time of travel and accumulated feeder share (transfers) of individual pieces of cargo. This means that cargo isn't thrown on a big pile when it's put in a station or unloaded at a station, however the GUI does not reflect these changes yet so you will not actually see it.
rubidium
parents: 7486
diff changeset
   229
					if (!st->goods[j].cargo.Empty()) {
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   230
						num_waiting_cargo++; //count number of waiting cargo
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8382
diff changeset
   231
						if (HasBit(cargo_filter, j)) {
4268
78373df5a67a (svn r5896) Remove pointless indirection similar to r5894 and remove an unnecessary global variable
tron
parents: 4261
diff changeset
   232
							station_sort[n++] = st;
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   233
							break;
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   234
						}
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   235
					}
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   236
				}
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6691
diff changeset
   237
				/* stations without waiting cargo */
6597
e4ce4b1aa3bf (svn r9080) -Codechange: dynamically build cargo filter buttons in the station list window.
peter1138
parents: 6586
diff changeset
   238
				if (num_waiting_cargo == 0 && include_empty) {
4268
78373df5a67a (svn r5896) Remove pointless indirection similar to r5894 and remove an unnecessary global variable
tron
parents: 4261
diff changeset
   239
					station_sort[n++] = st;
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   240
				}
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   241
			}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   242
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   243
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   244
4277
3539bd14f023 (svn r5907) Remove more indirection by using pointers instead of IDs. Also fix some bogus warnings on MSVC by using (void*) casts
tron
parents: 4268
diff changeset
   245
	free((void*)sl->sort_list);
5860
7fdc9b423ba1 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5859
diff changeset
   246
	sl->sort_list = MallocT<const Station*>(n);
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   247
	sl->list_length = n;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   248
6528
b705912233fa (svn r8988) -Fix: Indenting, variable scope, variable type and minor duffage
peter1138
parents: 6448
diff changeset
   249
	for (uint i = 0; i < n; ++i) sl->sort_list[i] = station_sort[i];
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: 69
diff changeset
   250
10510
3a236c24ff88 (svn r13053) -Codechange: station sorting used it's own implementation of GUIList and the associated enums, now it doesn't anymore.
rubidium
parents: 10505
diff changeset
   251
	sl->flags &= ~VL_REBUILD;
3a236c24ff88 (svn r13053) -Codechange: station sorting used it's own implementation of GUIList and the associated enums, now it doesn't anymore.
rubidium
parents: 10505
diff changeset
   252
	sl->flags |= VL_RESORT;
4277
3539bd14f023 (svn r5907) Remove more indirection by using pointers instead of IDs. Also fix some bogus warnings on MSVC by using (void*) casts
tron
parents: 4268
diff changeset
   253
	free((void*)station_sort);
243
9a40daa560ae (svn r244) -Fix: Stations were not sorted for non-player-0 players
darkvater
parents: 222
diff changeset
   254
}
9a40daa560ae (svn r244) -Fix: Stations were not sorted for non-player-0 players
darkvater
parents: 222
diff changeset
   255
8512
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   256
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   257
/**
10510
3a236c24ff88 (svn r13053) -Codechange: station sorting used it's own implementation of GUIList and the associated enums, now it doesn't anymore.
rubidium
parents: 10505
diff changeset
   258
 * Sort station list if the VL_RESORT flag is set
8512
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   259
 *
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   260
 * @param sl pointer to plstations_d (station list and flags)
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   261
 */
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   262
static void SortStationsList(GUIStationList *sl)
243
9a40daa560ae (svn r244) -Fix: Stations were not sorted for non-player-0 players
darkvater
parents: 222
diff changeset
   263
{
10224
4f7e3408936b (svn r12756) -Cleanup: variable scope and coding style in station*
smatz
parents: 10083
diff changeset
   264
	static StationSortListingTypeFunction *const _station_sorter[] = {
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   265
		&StationNameSorter,
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   266
		&StationTypeSorter,
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   267
		&StationWaitingSorter,
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   268
		&StationRatingMaxSorter
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   269
	};
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: 69
diff changeset
   270
10510
3a236c24ff88 (svn r13053) -Codechange: station sorting used it's own implementation of GUIList and the associated enums, now it doesn't anymore.
rubidium
parents: 10505
diff changeset
   271
	if (!(sl->flags & VL_RESORT)) return;
174
bd79fb899824 (svn r175) -Fix: [1023771] inconsistent/missing stations in station list. Forgot to change owner-sort after changing function.
darkvater
parents: 164
diff changeset
   272
10510
3a236c24ff88 (svn r13053) -Codechange: station sorting used it's own implementation of GUIList and the associated enums, now it doesn't anymore.
rubidium
parents: 10505
diff changeset
   273
	_internal_sort_order = sl->flags & VL_DESC;
4277
3539bd14f023 (svn r5907) Remove more indirection by using pointers instead of IDs. Also fix some bogus warnings on MSVC by using (void*) casts
tron
parents: 4268
diff changeset
   274
	_last_station = NULL; // used for "cache" in namesorting
4280
3265e76b7016 (svn r5910) Fix some more warnings on MSVC by using (void*) casts. Followup of r5907.
Darkvater
parents: 4277
diff changeset
   275
	qsort((void*)sl->sort_list, sl->list_length, sizeof(sl->sort_list[0]), _station_sorter[sl->sort_type]);
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 176
diff changeset
   276
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   277
	sl->resort_timer = DAY_TICKS * PERIODIC_RESORT_DAYS;
10510
3a236c24ff88 (svn r13053) -Codechange: station sorting used it's own implementation of GUIList and the associated enums, now it doesn't anymore.
rubidium
parents: 10505
diff changeset
   278
	sl->flags &= ~VL_RESORT;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   279
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   280
8512
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   281
/**
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   282
 * The list of stations per player.
8512
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   283
 */
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   284
struct PlayerStationsWindow : public Window, public GUIStationList
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   285
{
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   286
	static Listing station_sort;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   287
	static byte facilities;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   288
	static bool include_empty;
8512
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   289
10525
da5bc725cda4 (svn r13069) -Codechange: it is no longer needed to pass a void *data pointer with the WE_CREATE message because nothing uses it anymore.
rubidium
parents: 10511
diff changeset
   290
	PlayerStationsWindow(const WindowDesc *desc, WindowNumber window_number) : Window(desc, window_number)
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   291
	{
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   292
		this->caption_color = (byte)this->window_number;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   293
		this->vscroll.cap = 12;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   294
		this->resize.step_height = 10;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   295
		this->resize.height = this->height - 10 * 7; // minimum if 5 in the list
8834
ef15cacd6894 (svn r11904) -Codechange: use dropdown widget in 3 more windows, build vehicle, group vehicle list and station list.
peter1138
parents: 8780
diff changeset
   296
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   297
		/* Add cargo filter buttons */
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   298
		uint num_active = 0;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   299
		for (CargoID c = 0; c < NUM_CARGO; c++) {
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   300
			if (GetCargo(c)->IsValid()) num_active++;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   301
		}
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   302
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   303
		this->widget_count += num_active;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   304
		this->widget = ReallocT(this->widget, this->widget_count + 1);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   305
		this->widget[this->widget_count].type = WWT_LAST;
6597
e4ce4b1aa3bf (svn r9080) -Codechange: dynamically build cargo filter buttons in the station list window.
peter1138
parents: 6586
diff changeset
   306
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   307
		uint i = 0;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   308
		for (CargoID c = 0; c < NUM_CARGO; c++) {
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   309
			if (!GetCargo(c)->IsValid()) continue;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   310
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   311
			Widget *wi = &this->widget[SLW_CARGOSTART + i];
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   312
			wi->type     = WWT_PANEL;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   313
			wi->display_flags = RESIZE_NONE;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   314
			wi->color    = 14;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   315
			wi->left     = 89 + i * 14;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   316
			wi->right    = wi->left + 13;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   317
			wi->top      = 14;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   318
			wi->bottom   = 24;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   319
			wi->data     = 0;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   320
			wi->tooltips = STR_USE_CTRL_TO_SELECT_MORE;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   321
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   322
			if (HasBit(_cargo_filter, c)) this->LowerWidget(SLW_CARGOSTART + i);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   323
			i++;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   324
		}
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   325
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   326
		this->widget[SLW_NOCARGOWAITING].left += num_active * 14;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   327
		this->widget[SLW_NOCARGOWAITING].right += num_active * 14;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   328
		this->widget[SLW_CARGOALL].left += num_active * 14;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   329
		this->widget[SLW_CARGOALL].right += num_active * 14;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   330
		this->widget[SLW_PAN_RIGHT].left += num_active * 14;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   331
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   332
		if (num_active > 15) {
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   333
			/* Resize and fix the minimum width, if necessary */
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   334
			ResizeWindow(this, (num_active - 15) * 14, 0);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   335
			this->resize.width = this->width;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   336
		}
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   337
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   338
		if (_cargo_filter == _cargo_filter_max) _cargo_filter = _cargo_mask;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   339
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   340
		for (uint i = 0; i < 5; i++) {
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   341
			if (HasBit(facilities, i)) this->LowerWidget(i + SLW_TRAIN);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   342
		}
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   343
		this->SetWidgetLoweredState(SLW_FACILALL, facilities == (FACIL_TRAIN | FACIL_TRUCK_STOP | FACIL_BUS_STOP | FACIL_AIRPORT | FACIL_DOCK));
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   344
		this->SetWidgetLoweredState(SLW_CARGOALL, _cargo_filter == _cargo_mask && include_empty);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   345
		this->SetWidgetLoweredState(SLW_NOCARGOWAITING, include_empty);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   346
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   347
		this->sort_list = NULL;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   348
		this->flags = VL_REBUILD;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   349
		this->sort_type = station_sort.criteria;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   350
		if (station_sort.order) this->flags |= VL_DESC;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   351
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   352
		/* set up resort timer */
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   353
		this->resort_timer = DAY_TICKS * PERIODIC_RESORT_DAYS;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   354
	}
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   355
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   356
	virtual void OnPaint()
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   357
	{
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   358
		PlayerID owner = (PlayerID)this->window_number;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   359
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   360
		BuildStationsList(this, owner, facilities, _cargo_filter, include_empty);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   361
		SortStationsList(this);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   362
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   363
		SetVScrollCount(this, this->list_length);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   364
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   365
		/* draw widgets, with player's name in the caption */
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   366
		SetDParam(0, owner);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   367
		SetDParam(1, this->vscroll.count);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   368
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   369
		/* Set text of sort by dropdown */
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   370
		this->widget[SLW_SORTDROPBTN].data = _station_sort_listing[this->sort_type];
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   371
10595
7957c71b0dfe (svn r13139) -Codechange: move DrawWindowWidgets and DrawWindowViewport to the Window class and remove Window from their naming.
rubidium
parents: 10536
diff changeset
   372
		this->DrawWidgets();
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   373
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   374
		/* draw arrow pointing up/down for ascending/descending sorting */
10595
7957c71b0dfe (svn r13139) -Codechange: move DrawWindowWidgets and DrawWindowViewport to the Window class and remove Window from their naming.
rubidium
parents: 10536
diff changeset
   375
		this->DrawSortButtonState(SLW_SORTBY, this->flags & VL_DESC ? SBS_DOWN : SBS_UP);
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   376
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   377
		int cg_ofst;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   378
		int x = 89;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   379
		int y = 14;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   380
		int xb = 2; ///< offset from left of widget
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   381
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   382
		uint i = 0;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   383
		for (CargoID c = 0; c < NUM_CARGO; c++) {
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   384
			const CargoSpec *cs = GetCargo(c);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   385
			if (!cs->IsValid()) continue;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   386
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   387
			cg_ofst = HasBit(_cargo_filter, c) ? 2 : 1;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   388
			GfxFillRect(x + cg_ofst, y + cg_ofst, x + cg_ofst + 10 , y + cg_ofst + 7, cs->rating_colour);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   389
			DrawStringCentered(x + 6 + cg_ofst, y + cg_ofst, cs->abbrev, TC_BLACK);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   390
			x += 14;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   391
			i++;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   392
		}
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   393
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   394
		x += 6;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   395
		cg_ofst = this->IsWidgetLowered(SLW_NOCARGOWAITING) ? 2 : 1;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   396
		DrawStringCentered(x + cg_ofst, y + cg_ofst, STR_ABBREV_NONE, TC_BLACK);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   397
		x += 14;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   398
		cg_ofst = this->IsWidgetLowered(SLW_CARGOALL) ? 2 : 1;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   399
		DrawStringCentered(x + cg_ofst, y + cg_ofst, STR_ABBREV_ALL, TC_BLACK);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   400
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   401
		cg_ofst = this->IsWidgetLowered(SLW_FACILALL) ? 2 : 1;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   402
		DrawString(71 + cg_ofst, y + cg_ofst, STR_ABBREV_ALL, TC_BLACK);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   403
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   404
		if (this->vscroll.count == 0) { // player has no stations
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   405
			DrawString(xb, 40, STR_304A_NONE, TC_FROMSTRING);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   406
			return;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   407
		}
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   408
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   409
		int max = min(this->vscroll.pos + this->vscroll.cap, this->list_length);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   410
		y = 40; // start of the list-widget
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   411
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   412
		for (int i = this->vscroll.pos; i < max; ++i) { // do until max number of stations of owner
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   413
			const Station *st = this->sort_list[i];
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   414
			int x;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   415
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   416
			assert(st->xy != 0);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   417
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   418
			/* Do not do the complex check HasStationInUse here, it may be even false
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   419
				* when the order had been removed and the station list hasn't been removed yet */
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   420
			assert(st->owner == owner || (st->owner == OWNER_NONE && !st->IsBuoy()));
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   421
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   422
			SetDParam(0, st->index);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   423
			SetDParam(1, st->facilities);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   424
			x = DrawString(xb, y, STR_3049_0, TC_FROMSTRING) + 5;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   425
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   426
			/* show cargo waiting and station ratings */
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   427
			for (CargoID j = 0; j < NUM_CARGO; j++) {
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   428
				if (!st->goods[j].cargo.Empty()) {
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   429
					StationsWndShowStationRating(x, y, j, st->goods[j].cargo.Count(), st->goods[j].rating);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   430
					x += 20;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   431
				}
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   432
			}
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   433
			y += 10;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   434
		}
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   435
	}
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   436
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   437
	virtual void OnClick(Point pt, int widget)
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   438
	{
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   439
		switch (widget) {
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   440
			case SLW_LIST: {
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   441
				uint32 id_v = (pt.y - 41) / 10;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   442
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   443
				if (id_v >= this->vscroll.cap) return; // click out of bounds
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   444
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   445
				id_v += this->vscroll.pos;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   446
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   447
				if (id_v >= this->list_length) return; // click out of list bound
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   448
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   449
				const Station *st = this->sort_list[id_v];
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   450
				/* do not check HasStationInUse - it is slow and may be invalid */
10536
6824a85fa05e (svn r13080) -Fix: warning about unused variable when compiling without asserts
smatz
parents: 10525
diff changeset
   451
				assert(st->owner == (PlayerID)this->window_number || (st->owner == OWNER_NONE && !st->IsBuoy()));
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   452
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   453
				if (_ctrl_pressed) {
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   454
					ShowExtraViewPortWindow(st->xy);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   455
				} else {
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   456
					ScrollMainWindowToTile(st->xy);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   457
				}
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   458
				break;
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   459
			}
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   460
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   461
			case SLW_TRAIN:
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   462
			case SLW_TRUCK:
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   463
			case SLW_BUS:
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   464
			case SLW_AIRPLANE:
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   465
			case SLW_SHIP:
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   466
				if (_ctrl_pressed) {
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   467
					ToggleBit(facilities, widget - SLW_TRAIN);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   468
					this->ToggleWidgetLoweredState(widget);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   469
				} else {
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   470
					uint i;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   471
					FOR_EACH_SET_BIT(i, facilities) {
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   472
						this->RaiseWidget(i + SLW_TRAIN);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   473
					}
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   474
					SetBit(facilities, widget - SLW_TRAIN);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   475
					this->LowerWidget(widget);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   476
				}
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   477
				this->SetWidgetLoweredState(SLW_FACILALL, facilities == (FACIL_TRAIN | FACIL_TRUCK_STOP | FACIL_BUS_STOP | FACIL_AIRPORT | FACIL_DOCK));
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   478
				this->flags |= VL_REBUILD;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   479
				this->SetDirty();
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   480
				break;
5271
419c6746fd90 (svn r7413) -Fix[FS#386,#412]: Station list window NONE button now behaves correctly.
belugas
parents: 5247
diff changeset
   481
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   482
			case SLW_FACILALL:
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   483
				for (uint i = 0; i < 5; i++) {
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   484
					this->LowerWidget(i + SLW_TRAIN);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   485
				}
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   486
				this->LowerWidget(SLW_FACILALL);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   487
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   488
				facilities = FACIL_TRAIN | FACIL_TRUCK_STOP | FACIL_BUS_STOP | FACIL_AIRPORT | FACIL_DOCK;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   489
				this->flags |= VL_REBUILD;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   490
				this->SetDirty();
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   491
				break;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   492
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   493
			case SLW_CARGOALL: {
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   494
				uint i = 0;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   495
				for (CargoID c = 0; c < NUM_CARGO; c++) {
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   496
					if (!GetCargo(c)->IsValid()) continue;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   497
					this->LowerWidget(i + SLW_CARGOSTART);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   498
					i++;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   499
				}
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   500
				this->LowerWidget(SLW_NOCARGOWAITING);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   501
				this->LowerWidget(SLW_CARGOALL);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   502
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   503
				_cargo_filter = _cargo_mask;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   504
				include_empty = true;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   505
				this->flags |= VL_REBUILD;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   506
				this->SetDirty();
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   507
				break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   508
			}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 176
diff changeset
   509
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   510
			case SLW_SORTBY: // flip sorting method asc/desc
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   511
				this->flags ^= VL_DESC; //DESC-flag
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   512
				station_sort.order = HasBit(this->flags, 0);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   513
				this->flags |= VL_RESORT;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   514
				this->flags4 |= 5 << WF_TIMEOUT_SHL;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   515
				this->LowerWidget(SLW_SORTBY);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   516
				this->SetDirty();
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   517
				break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   518
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   519
			case SLW_SORTDROPBTN: // select sorting criteria dropdown menu
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   520
				ShowDropDownMenu(this, _station_sort_listing, this->sort_type, SLW_SORTDROPBTN, 0, 0);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   521
				break;
174
bd79fb899824 (svn r175) -Fix: [1023771] inconsistent/missing stations in station list. Forgot to change owner-sort after changing function.
darkvater
parents: 164
diff changeset
   522
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   523
			case SLW_NOCARGOWAITING:
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   524
				if (_ctrl_pressed) {
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   525
					include_empty = !include_empty;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   526
					this->ToggleWidgetLoweredState(SLW_NOCARGOWAITING);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   527
				} else {
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   528
					for (uint i = SLW_CARGOSTART; i < this->widget_count; i++) {
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   529
						this->RaiseWidget(i);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   530
					}
6528
b705912233fa (svn r8988) -Fix: Indenting, variable scope, variable type and minor duffage
peter1138
parents: 6448
diff changeset
   531
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   532
					_cargo_filter = 0;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   533
					include_empty = true;
6528
b705912233fa (svn r8988) -Fix: Indenting, variable scope, variable type and minor duffage
peter1138
parents: 6448
diff changeset
   534
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   535
					this->LowerWidget(SLW_NOCARGOWAITING);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   536
				}
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   537
				this->flags |= VL_REBUILD;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   538
				this->SetWidgetLoweredState(SLW_CARGOALL, _cargo_filter == _cargo_mask && include_empty);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   539
				this->SetDirty();
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   540
				break;
6528
b705912233fa (svn r8988) -Fix: Indenting, variable scope, variable type and minor duffage
peter1138
parents: 6448
diff changeset
   541
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   542
			default:
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   543
				if (widget >= SLW_CARGOSTART) { // change cargo_filter
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   544
					/* Determine the selected cargo type */
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   545
					CargoID c;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   546
					int i = 0;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   547
					for (c = 0; c < NUM_CARGO; c++) {
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   548
						if (!GetCargo(c)->IsValid()) continue;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   549
						if (widget - SLW_CARGOSTART == i) break;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   550
						i++;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   551
					}
10411
efe3b7a2746f (svn r12953) -Feature: Open a new viewport when ctrl-clicking on a 'Location' button, a town/station/industry list, or some news items.
peter1138
parents: 10255
diff changeset
   552
efe3b7a2746f (svn r12953) -Feature: Open a new viewport when ctrl-clicking on a 'Location' button, a town/station/industry list, or some news items.
peter1138
parents: 10255
diff changeset
   553
					if (_ctrl_pressed) {
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   554
						ToggleBit(_cargo_filter, c);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   555
						this->ToggleWidgetLoweredState(widget);
10411
efe3b7a2746f (svn r12953) -Feature: Open a new viewport when ctrl-clicking on a 'Location' button, a town/station/industry list, or some news items.
peter1138
parents: 10255
diff changeset
   556
					} else {
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   557
						for (uint i = SLW_CARGOSTART; i < this->widget_count; i++) {
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   558
							this->RaiseWidget(i);
6528
b705912233fa (svn r8988) -Fix: Indenting, variable scope, variable type and minor duffage
peter1138
parents: 6448
diff changeset
   559
						}
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   560
						this->RaiseWidget(SLW_NOCARGOWAITING);
6597
e4ce4b1aa3bf (svn r9080) -Codechange: dynamically build cargo filter buttons in the station list window.
peter1138
parents: 6586
diff changeset
   561
e4ce4b1aa3bf (svn r9080) -Codechange: dynamically build cargo filter buttons in the station list window.
peter1138
parents: 6586
diff changeset
   562
						_cargo_filter = 0;
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   563
						include_empty = false;
6597
e4ce4b1aa3bf (svn r9080) -Codechange: dynamically build cargo filter buttons in the station list window.
peter1138
parents: 6586
diff changeset
   564
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   565
						SetBit(_cargo_filter, c);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   566
						this->LowerWidget(widget);
6528
b705912233fa (svn r8988) -Fix: Indenting, variable scope, variable type and minor duffage
peter1138
parents: 6448
diff changeset
   567
					}
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   568
					this->flags |= VL_REBUILD;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   569
					this->SetWidgetLoweredState(SLW_CARGOALL, _cargo_filter == _cargo_mask && include_empty);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   570
					this->SetDirty();
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   571
				}
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   572
				break;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   573
		}
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   574
	}
6528
b705912233fa (svn r8988) -Fix: Indenting, variable scope, variable type and minor duffage
peter1138
parents: 6448
diff changeset
   575
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   576
	virtual void OnDropdownSelect(int widget, int index)
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   577
	{
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   578
		if (this->sort_type != index) {
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   579
			/* value has changed -> resort */
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   580
			this->sort_type = index;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   581
			station_sort.criteria = this->sort_type;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   582
			this->flags |= VL_RESORT;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   583
		}
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   584
		this->SetDirty();
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   585
	}
5271
419c6746fd90 (svn r7413) -Fix[FS#386,#412]: Station list window NONE button now behaves correctly.
belugas
parents: 5247
diff changeset
   586
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   587
	virtual void OnTick()
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   588
	{
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   589
		if (_pause_game != 0) return;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   590
		if (--this->resort_timer == 0) {
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   591
			DEBUG(misc, 3, "Periodic rebuild station list player %d", this->window_number);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   592
			this->resort_timer = DAY_TICKS * PERIODIC_RESORT_DAYS;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   593
			this->flags |= VL_REBUILD;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   594
			this->SetDirty();
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   595
		}
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   596
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   597
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   598
	virtual void OnTimeout()
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   599
	{
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   600
		this->RaiseWidget(SLW_SORTBY);
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   601
		this->SetDirty();
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   602
	}
867
581154a08a78 (svn r1348) -Feature: resizable windows. Read the comment in window.h to find out
truelight
parents: 817
diff changeset
   603
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   604
	virtual void OnResize(Point new_size, Point delta)
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   605
	{
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   606
		this->vscroll.cap += delta.y / 10;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   607
	}
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   608
};
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   609
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   610
Listing PlayerStationsWindow::station_sort = {0, 0};
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   611
byte PlayerStationsWindow::facilities = FACIL_TRAIN | FACIL_TRUCK_STOP | FACIL_BUS_STOP | FACIL_AIRPORT | FACIL_DOCK;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   612
bool PlayerStationsWindow::include_empty = true;
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   613
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   614
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   615
static const Widget _player_stations_widgets[] = {
8512
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   616
{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,          STR_018B_CLOSE_WINDOW},            // SLW_CLOSEBOX
3554
c16eadc2d060 (svn r4426) Code Cleaning : replacing tabs with spaces, removing obvious comments, aligning arrays etc...
belugas
parents: 2725
diff changeset
   617
{    WWT_CAPTION,  RESIZE_RIGHT,    14,    11,   345,     0,    13, STR_3048_STATIONS, STR_018C_WINDOW_TITLE_DRAG_THIS},
c16eadc2d060 (svn r4426) Code Cleaning : replacing tabs with spaces, removing obvious comments, aligning arrays etc...
belugas
parents: 2725
diff changeset
   618
{  WWT_STICKYBOX,     RESIZE_LR,    14,   346,   357,     0,    13, 0x0,               STR_STICKY_BUTTON},
8512
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   619
{      WWT_PANEL,     RESIZE_RB,    14,     0,   345,    37,   161, 0x0,               STR_3057_STATION_NAMES_CLICK_ON},  // SLW_LIST
5128
c75525088fb9 (svn r7209) -Codechange: Alter position of scroll bar in the station list; the filter line isn't scrollable...
peter1138
parents: 5124
diff changeset
   620
{  WWT_SCROLLBAR,    RESIZE_LRB,    14,   346,   357,    37,   149, 0x0,               STR_0190_SCROLL_BAR_SCROLLS_LIST},
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   621
{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   346,   357,   150,   161, 0x0,               STR_RESIZE_BUTTON},
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   622
8512
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   623
{    WWT_TEXTBTN,   RESIZE_NONE,    14,     0,    13,    14,    24, STR_TRAIN,         STR_USE_CTRL_TO_SELECT_MORE},      // SLW_TRAIN
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   624
{    WWT_TEXTBTN,   RESIZE_NONE,    14,    14,    27,    14,    24, STR_LORRY,         STR_USE_CTRL_TO_SELECT_MORE},      // SLW_TRUCK
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   625
{    WWT_TEXTBTN,   RESIZE_NONE,    14,    28,    41,    14,    24, STR_BUS,           STR_USE_CTRL_TO_SELECT_MORE},      // SLW_BUS
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   626
{    WWT_TEXTBTN,   RESIZE_NONE,    14,    42,    55,    14,    24, STR_PLANE,         STR_USE_CTRL_TO_SELECT_MORE},      // SLW_AIRPLANE
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   627
{    WWT_TEXTBTN,   RESIZE_NONE,    14,    56,    69,    14,    24, STR_SHIP,          STR_USE_CTRL_TO_SELECT_MORE},      // SLW_SHIP
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   628
{      WWT_PANEL,   RESIZE_NONE,    14,    70,    83,    14,    24, 0x0,               STR_SELECT_ALL_FACILITIES},        // SLW_FACILALL
3812
d9b3041ee3d0 (svn r4822) -Feature: Station List View can now be sorted and filtered (by waiting cargo type and facilities)
celestar
parents: 3554
diff changeset
   629
8512
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   630
{      WWT_PANEL,   RESIZE_NONE,    14,    83,    88,    14,    24, 0x0,               STR_NULL},                         // SLW_PAN_BETWEEN
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   631
{      WWT_PANEL,   RESIZE_NONE,    14,    89,   102,    14,    24, 0x0,               STR_NO_WAITING_CARGO},             // SLW_NOCARGOWAITING
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   632
{      WWT_PANEL,   RESIZE_NONE,    14,   103,   116,    14,    24, 0x0,               STR_SELECT_ALL_TYPES},             // SLW_CARGOALL
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   633
{      WWT_PANEL,  RESIZE_RIGHT,    14,   117,   357,    14,    24, 0x0,               STR_NULL},                         // SLW_PAN_RIGHT
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   634
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   635
{    WWT_TEXTBTN,   RESIZE_NONE,    14,     0,    80,    25,    36, STR_SORT_BY,       STR_SORT_ORDER_TIP},               // SLW_SORTBY
8834
ef15cacd6894 (svn r11904) -Codechange: use dropdown widget in 3 more windows, build vehicle, group vehicle list and station list.
peter1138
parents: 8780
diff changeset
   636
{   WWT_DROPDOWN,   RESIZE_NONE,    14,    81,   243,    25,    36, 0x0,               STR_SORT_CRITERIA_TIP},            // SLW_SORTDROPBTN
8512
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   637
{      WWT_PANEL,  RESIZE_RIGHT,    14,   244,   357,    25,    36, 0x0,               STR_NULL},                         // SLW_PAN_SORT_RIGHT
176
84990c4b9212 (svn r177) -Fix: padded out Widget code to solve warnings on C99 compiler (Tron)
darkvater
parents: 174
diff changeset
   638
{   WIDGETS_END},
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   639
};
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   640
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   641
static const WindowDesc _player_stations_desc = {
7837
65d7362153a6 (svn r10704) -Codechange: provide an infrastructure to have resizable windows that are smaller than the default window size.
rubidium
parents: 7554
diff changeset
   642
	WDP_AUTO, WDP_AUTO, 358, 162, 358, 162,
6144
5a0ffbf27ced (svn r8511) -Codechange: make WindowClass an enumerated value.
rubidium
parents: 5996
diff changeset
   643
	WC_STATION_LIST, WC_NONE,
5271
419c6746fd90 (svn r7413) -Fix[FS#386,#412]: Station list window NONE button now behaves correctly.
belugas
parents: 5247
diff changeset
   644
	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON | WDF_RESIZABLE,
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   645
	_player_stations_widgets,
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   646
	NULL
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   647
};
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   648
8512
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   649
/**
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   650
 * Opens window with list of player's stations
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   651
 *
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   652
 * @param player player whose stations' list show
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   653
 */
2475
8443e1eefe1b (svn r3001) s/Player*/const Player*/
tron
parents: 2186
diff changeset
   654
void ShowPlayerStations(PlayerID player)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   655
{
5005
21e84e53c732 (svn r7022) -Fix [FS#292]: Properly guard against viewing company-sensitive information from
Darkvater
parents: 4938
diff changeset
   656
	if (!IsValidPlayer(player)) return;
21e84e53c732 (svn r7022) -Fix [FS#292]: Properly guard against viewing company-sensitive information from
Darkvater
parents: 4938
diff changeset
   657
10511
c625d173480f (svn r13054) -Codechange: make a class of the PlayerStationsWindow.
rubidium
parents: 10510
diff changeset
   658
	AllocateWindowDescFront<PlayerStationsWindow>(&_player_stations_desc, player);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   659
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   660
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   661
static const Widget _station_view_widgets[] = {
8512
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   662
{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,          STR_018B_CLOSE_WINDOW},                // SVW_CLOSEBOX
8916
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   663
{    WWT_CAPTION,  RESIZE_RIGHT,    14,    11,   236,     0,    13, STR_300A_0,        STR_018C_WINDOW_TITLE_DRAG_THIS},
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   664
{  WWT_STICKYBOX,     RESIZE_LR,    14,   237,   248,     0,    13, 0x0,               STR_STICKY_BUTTON},
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   665
{      WWT_PANEL,     RESIZE_RB,    14,     0,   236,    14,    65, 0x0,               STR_NULL},                             // SVW_WAITING
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   666
{  WWT_SCROLLBAR,    RESIZE_LRB,    14,   237,   248,    14,    65, 0x0,               STR_0190_SCROLL_BAR_SCROLLS_LIST},
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   667
{      WWT_PANEL,    RESIZE_RTB,    14,     0,   248,    66,    97, 0x0,               STR_NULL},                             // SVW_ACCEPTLIST / SVW_RATINGLIST
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   668
{ WWT_PUSHTXTBTN,     RESIZE_TB,    14,     0,    59,    98,   109, STR_00E4_LOCATION, STR_3053_CENTER_MAIN_VIEW_ON_STATION}, // SVW_LOCATION
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   669
{ WWT_PUSHTXTBTN,     RESIZE_TB,    14,    60,   120,    98,   109, STR_3032_RATINGS,  STR_3054_SHOW_STATION_RATINGS},        // SVW_RATINGS / SVW_ACCEPTS
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   670
{ WWT_PUSHTXTBTN,    RESIZE_RTB,    14,   121,   180,    98,   109, STR_0130_RENAME,   STR_3055_CHANGE_NAME_OF_STATION},      // SVW_RENAME
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   671
{ WWT_PUSHTXTBTN,   RESIZE_LRTB,    14,   181,   194,    98,   109, STR_TRAIN,         STR_SCHEDULED_TRAINS_TIP },            // SVW_TRAINS
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   672
{ WWT_PUSHTXTBTN,   RESIZE_LRTB,    14,   195,   208,    98,   109, STR_LORRY,         STR_SCHEDULED_ROAD_VEHICLES_TIP },     // SVW_ROADVEHS
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   673
{ WWT_PUSHTXTBTN,   RESIZE_LRTB,    14,   209,   222,    98,   109, STR_PLANE,         STR_SCHEDULED_AIRCRAFT_TIP },          // SVW_PLANES
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   674
{ WWT_PUSHTXTBTN,   RESIZE_LRTB,    14,   223,   236,    98,   109, STR_SHIP,          STR_SCHEDULED_SHIPS_TIP },             // SVW_SHIPS
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   675
{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   237,   248,    98,   109, 0x0,               STR_RESIZE_BUTTON},
176
84990c4b9212 (svn r177) -Fix: padded out Widget code to solve warnings on C99 compiler (Tron)
darkvater
parents: 174
diff changeset
   676
{   WIDGETS_END},
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   677
};
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   678
9258
c00ebaa5bf90 (svn r12458) -Codechange: split acquiring the sprite ID for cargos from the actual drawing of them.
rubidium
parents: 9246
diff changeset
   679
SpriteID GetCargoSprite(CargoID i)
6690
d037c31fd4cf (svn r9417) -Fix (r1): Waiting cargo icons in the station view window were incorrectly drawn if the cargo list was scrolled, resulting in overlapping images
peter1138
parents: 6676
diff changeset
   680
{
d037c31fd4cf (svn r9417) -Fix (r1): Waiting cargo icons in the station view window were incorrectly drawn if the cargo list was scrolled, resulting in overlapping images
peter1138
parents: 6676
diff changeset
   681
	const CargoSpec *cs = GetCargo(i);
6691
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6690
diff changeset
   682
	SpriteID sprite;
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6690
diff changeset
   683
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6690
diff changeset
   684
	if (cs->sprite == 0xFFFF) {
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6690
diff changeset
   685
		/* A value of 0xFFFF indicates we should draw a custom icon */
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6690
diff changeset
   686
		sprite = GetCustomCargoSprite(cs);
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6690
diff changeset
   687
	} else {
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6690
diff changeset
   688
		sprite = cs->sprite;
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6690
diff changeset
   689
	}
e8c27a509894 (svn r9418) -Codechange: Implement actions 1/2/3 for cargos, callback handler and custom icon sprites
peter1138
parents: 6690
diff changeset
   690
7153
85b73fcc076b (svn r9888) -Codechange: [NewGRF] allow non-spec cargo action2s to work, and using the goods sprite if really nothing is returned.
peter1138
parents: 6916
diff changeset
   691
	if (sprite == 0) sprite = SPR_CARGO_GOODS;
6690
d037c31fd4cf (svn r9417) -Fix (r1): Waiting cargo icons in the station view window were incorrectly drawn if the cargo list was scrolled, resulting in overlapping images
peter1138
parents: 6676
diff changeset
   692
9258
c00ebaa5bf90 (svn r12458) -Codechange: split acquiring the sprite ID for cargos from the actual drawing of them.
rubidium
parents: 9246
diff changeset
   693
	return sprite;
c00ebaa5bf90 (svn r12458) -Codechange: split acquiring the sprite ID for cargos from the actual drawing of them.
rubidium
parents: 9246
diff changeset
   694
}
c00ebaa5bf90 (svn r12458) -Codechange: split acquiring the sprite ID for cargos from the actual drawing of them.
rubidium
parents: 9246
diff changeset
   695
c00ebaa5bf90 (svn r12458) -Codechange: split acquiring the sprite ID for cargos from the actual drawing of them.
rubidium
parents: 9246
diff changeset
   696
/**
c00ebaa5bf90 (svn r12458) -Codechange: split acquiring the sprite ID for cargos from the actual drawing of them.
rubidium
parents: 9246
diff changeset
   697
 * Draws icons of waiting cargo in the StationView window
c00ebaa5bf90 (svn r12458) -Codechange: split acquiring the sprite ID for cargos from the actual drawing of them.
rubidium
parents: 9246
diff changeset
   698
 *
c00ebaa5bf90 (svn r12458) -Codechange: split acquiring the sprite ID for cargos from the actual drawing of them.
rubidium
parents: 9246
diff changeset
   699
 * @param i type of cargo
c00ebaa5bf90 (svn r12458) -Codechange: split acquiring the sprite ID for cargos from the actual drawing of them.
rubidium
parents: 9246
diff changeset
   700
 * @param waiting number of waiting units
c00ebaa5bf90 (svn r12458) -Codechange: split acquiring the sprite ID for cargos from the actual drawing of them.
rubidium
parents: 9246
diff changeset
   701
 * @param x x on-screen coordinate where to start with drawing icons
c00ebaa5bf90 (svn r12458) -Codechange: split acquiring the sprite ID for cargos from the actual drawing of them.
rubidium
parents: 9246
diff changeset
   702
 * @param y y coordinate
c00ebaa5bf90 (svn r12458) -Codechange: split acquiring the sprite ID for cargos from the actual drawing of them.
rubidium
parents: 9246
diff changeset
   703
 */
c00ebaa5bf90 (svn r12458) -Codechange: split acquiring the sprite ID for cargos from the actual drawing of them.
rubidium
parents: 9246
diff changeset
   704
static void DrawCargoIcons(CargoID i, uint waiting, int x, int y, uint width)
c00ebaa5bf90 (svn r12458) -Codechange: split acquiring the sprite ID for cargos from the actual drawing of them.
rubidium
parents: 9246
diff changeset
   705
{
c00ebaa5bf90 (svn r12458) -Codechange: split acquiring the sprite ID for cargos from the actual drawing of them.
rubidium
parents: 9246
diff changeset
   706
	uint num = min((waiting + 5) / 10, width / 10); // maximum is width / 10 icons so it won't overflow
c00ebaa5bf90 (svn r12458) -Codechange: split acquiring the sprite ID for cargos from the actual drawing of them.
rubidium
parents: 9246
diff changeset
   707
	if (num == 0) return;
c00ebaa5bf90 (svn r12458) -Codechange: split acquiring the sprite ID for cargos from the actual drawing of them.
rubidium
parents: 9246
diff changeset
   708
c00ebaa5bf90 (svn r12458) -Codechange: split acquiring the sprite ID for cargos from the actual drawing of them.
rubidium
parents: 9246
diff changeset
   709
	SpriteID sprite = GetCargoSprite(i);
c00ebaa5bf90 (svn r12458) -Codechange: split acquiring the sprite ID for cargos from the actual drawing of them.
rubidium
parents: 9246
diff changeset
   710
6690
d037c31fd4cf (svn r9417) -Fix (r1): Waiting cargo icons in the station view window were incorrectly drawn if the cargo list was scrolled, resulting in overlapping images
peter1138
parents: 6676
diff changeset
   711
	do {
d037c31fd4cf (svn r9417) -Fix (r1): Waiting cargo icons in the station view window were incorrectly drawn if the cargo list was scrolled, resulting in overlapping images
peter1138
parents: 6676
diff changeset
   712
		DrawSprite(sprite, PAL_NONE, x, y);
d037c31fd4cf (svn r9417) -Fix (r1): Waiting cargo icons in the station view window were incorrectly drawn if the cargo list was scrolled, resulting in overlapping images
peter1138
parents: 6676
diff changeset
   713
		x += 10;
d037c31fd4cf (svn r9417) -Fix (r1): Waiting cargo icons in the station view window were incorrectly drawn if the cargo list was scrolled, resulting in overlapping images
peter1138
parents: 6676
diff changeset
   714
	} while (--num);
d037c31fd4cf (svn r9417) -Fix (r1): Waiting cargo icons in the station view window were incorrectly drawn if the cargo list was scrolled, resulting in overlapping images
peter1138
parents: 6676
diff changeset
   715
}
d037c31fd4cf (svn r9417) -Fix (r1): Waiting cargo icons in the station view window were incorrectly drawn if the cargo list was scrolled, resulting in overlapping images
peter1138
parents: 6676
diff changeset
   716
8916
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   717
struct CargoData {
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   718
	CargoID cargo;
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   719
	StationID source;
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   720
	uint count;
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   721
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   722
	CargoData(CargoID cargo, StationID source, uint count) :
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   723
		cargo(cargo),
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   724
		source(source),
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   725
		count(count)
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   726
	{ }
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   727
};
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   728
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   729
typedef std::list<CargoData> CargoDataList;
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   730
8512
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   731
/**
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   732
 * The StationView window
8512
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
   733
 */
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   734
struct StationViewWindow : public Window {
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   735
	uint32 cargo;                 ///< Bitmask of cargo types to expand
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   736
	uint16 cargo_rows[NUM_CARGO]; ///< Header row for each cargo type
9246
14265864e804 (svn r12446) -Feature: Add +/- toggle buttons to station cargo waiting list to show/hide the detailed transferred cargo information.
peter1138
parents: 9215
diff changeset
   737
10525
da5bc725cda4 (svn r13069) -Codechange: it is no longer needed to pass a void *data pointer with the WE_CREATE message because nothing uses it anymore.
rubidium
parents: 10511
diff changeset
   738
	StationViewWindow(const WindowDesc *desc, WindowNumber window_number) : Window(desc, window_number)
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   739
	{
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   740
		PlayerID owner = GetStation(window_number)->owner;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   741
		if (owner != OWNER_NONE) this->caption_color = owner;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   742
		this->vscroll.cap = 5;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   743
		this->resize.step_height = 10;
9246
14265864e804 (svn r12446) -Feature: Add +/- toggle buttons to station cargo waiting list to show/hide the detailed transferred cargo information.
peter1138
parents: 9215
diff changeset
   744
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   745
		this->FindWindowPlacementAndResize(desc);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   746
	}
9246
14265864e804 (svn r12446) -Feature: Add +/- toggle buttons to station cargo waiting list to show/hide the detailed transferred cargo information.
peter1138
parents: 9215
diff changeset
   747
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   748
	~StationViewWindow()
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   749
	{
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   750
		WindowNumber wno =
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   751
			(this->window_number << 16) | VLW_STATION_LIST | GetStation(this->window_number)->owner;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   752
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   753
		DeleteWindowById(WC_TRAINS_LIST, wno);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   754
		DeleteWindowById(WC_ROADVEH_LIST, wno);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   755
		DeleteWindowById(WC_SHIPS_LIST, wno);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   756
		DeleteWindowById(WC_AIRCRAFT_LIST, wno);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   757
	}
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   758
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   759
	virtual void OnPaint()
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   760
	{
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   761
		StationID station_id = this->window_number;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   762
		const Station *st = GetStation(station_id);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   763
		CargoDataList cargolist;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   764
		uint32 transfers = 0;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   765
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   766
		/* count types of cargos waiting in station */
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   767
		for (CargoID i = 0; i < NUM_CARGO; i++) {
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   768
			if (st->goods[i].cargo.Empty()) {
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   769
				this->cargo_rows[i] = 0;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   770
			} else {
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   771
				/* Add an entry for total amount of cargo of this type waiting. */
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   772
				cargolist.push_back(CargoData(i, INVALID_STATION, st->goods[i].cargo.Count()));
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   773
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   774
				/* Set the row for this cargo entry for the expand/hide button */
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   775
				this->cargo_rows[i] = cargolist.size();
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   776
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   777
				/* Add an entry for each distinct cargo source. */
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   778
				const CargoList::List *packets = st->goods[i].cargo.Packets();
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   779
				for (CargoList::List::const_iterator it = packets->begin(); it != packets->end(); it++) {
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   780
					const CargoPacket *cp = *it;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   781
					if (cp->source != station_id) {
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   782
						bool added = false;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   783
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   784
						/* Enable the expand/hide button for this cargo type */
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   785
						SetBit(transfers, i);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   786
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   787
						/* Don't add cargo lines if not expanded */
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   788
						if (!HasBit(this->cargo, i)) break;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   789
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   790
						/* Check if we already have this source in the list */
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   791
						for (CargoDataList::iterator jt = cargolist.begin(); jt != cargolist.end(); jt++) {
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   792
							CargoData *cd = &(*jt);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   793
							if (cd->cargo == i && cd->source == cp->source) {
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   794
								cd->count += cp->count;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   795
								added = true;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   796
								break;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   797
							}
8916
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   798
						}
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   799
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   800
						if (!added) cargolist.push_back(CargoData(i, cp->source, cp->count));
8916
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   801
					}
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   802
				}
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   803
			}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   804
		}
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   805
		SetVScrollCount(this, cargolist.size() + 1); // update scrollbar
10224
4f7e3408936b (svn r12756) -Cleanup: variable scope and coding style in station*
smatz
parents: 10083
diff changeset
   806
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   807
		/* disable some buttons */
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   808
		this->SetWidgetDisabledState(SVW_RENAME,   st->owner != _local_player);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   809
		this->SetWidgetDisabledState(SVW_TRAINS,   !(st->facilities & FACIL_TRAIN));
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   810
		this->SetWidgetDisabledState(SVW_ROADVEHS, !(st->facilities & FACIL_TRUCK_STOP) && !(st->facilities & FACIL_BUS_STOP));
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   811
		this->SetWidgetDisabledState(SVW_PLANES,   !(st->facilities & FACIL_AIRPORT));
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   812
		this->SetWidgetDisabledState(SVW_SHIPS,    !(st->facilities & FACIL_DOCK));
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   813
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   814
		SetDParam(0, st->index);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   815
		SetDParam(1, st->facilities);
10595
7957c71b0dfe (svn r13139) -Codechange: move DrawWindowWidgets and DrawWindowViewport to the Window class and remove Window from their naming.
rubidium
parents: 10536
diff changeset
   816
		this->DrawWidgets();
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   817
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   818
		int x = 2;  ///< coordinates used for printing waiting/accepted/rating of cargo
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   819
		int y = 15;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   820
		int pos = this->vscroll.pos; ///< = this->vscroll.pos
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   821
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   822
		uint width = this->widget[SVW_WAITING].right - this->widget[SVW_WAITING].left - 4;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   823
		int maxrows = this->vscroll.cap;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   824
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   825
		StringID str;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   826
8916
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   827
		if (--pos < 0) {
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   828
			str = STR_00D0_NOTHING;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   829
			for (CargoID i = 0; i < NUM_CARGO; i++) {
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   830
				if (!st->goods[i].cargo.Empty()) str = STR_EMPTY;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   831
			}
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   832
			SetDParam(0, str);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   833
			DrawString(x, y, STR_0008_WAITING, TC_FROMSTRING);
8916
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   834
			y += 10;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   835
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   836
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   837
		for (CargoDataList::const_iterator it = cargolist.begin(); it != cargolist.end() && pos > -maxrows; ++it) {
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   838
			if (--pos < 0) {
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   839
				const CargoData *cd = &(*it);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   840
				if (cd->source == INVALID_STATION) {
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   841
					/* Heading */
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   842
					DrawCargoIcons(cd->cargo, cd->count, x, y, width);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   843
					SetDParam(0, cd->cargo);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   844
					SetDParam(1, cd->count);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   845
					if (HasBit(transfers, cd->cargo)) {
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   846
						/* This cargo has transfers waiting so show the expand or shrink 'button' */
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   847
						const char *sym = HasBit(this->cargo, cd->cargo) ? "-" : "+";
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   848
						DrawStringRightAligned(x + width - 8, y, STR_0009, TC_FROMSTRING);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   849
						DoDrawString(sym, x + width - 6, y, TC_YELLOW);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   850
					} else {
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   851
						DrawStringRightAligned(x + width, y, STR_0009, TC_FROMSTRING);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   852
					}
5038
cd0a32afb616 (svn r7080) -Codechange: Remove negative array indexes, and only add ", " when needed, when building station acceptance lists.
peter1138
parents: 5005
diff changeset
   853
				} else {
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   854
					SetDParam(0, cd->cargo);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   855
					SetDParam(1, cd->count);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   856
					SetDParam(2, cd->source);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   857
					DrawStringRightAlignedTruncated(x + width, y, STR_EN_ROUTE_FROM, TC_FROMSTRING, width);
5038
cd0a32afb616 (svn r7080) -Codechange: Remove negative array indexes, and only add ", " when needed, when building station acceptance lists.
peter1138
parents: 5005
diff changeset
   858
				}
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   859
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   860
				y += 10;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   861
			}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   862
		}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 176
diff changeset
   863
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   864
		if (this->widget[SVW_ACCEPTS].data == STR_3032_RATINGS) { // small window with list of accepted cargo
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   865
			char *b = _userstring;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   866
			bool first = true;
6623
1115fe0767a9 (svn r9127) -Codechange: Check if a cargo is valid before displaying it in a station's cargo rating list. (And duff up the block a little)
peter1138
parents: 6611
diff changeset
   867
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   868
			b = InlineString(b, STR_000C_ACCEPTS);
6623
1115fe0767a9 (svn r9127) -Codechange: Check if a cargo is valid before displaying it in a station's cargo rating list. (And duff up the block a little)
peter1138
parents: 6611
diff changeset
   869
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   870
			for (CargoID i = 0; i < NUM_CARGO; i++) {
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   871
				if (b >= lastof(_userstring) - (1 + 2 * 4)) break; // ',' or ' ' and two calls to Utf8Encode()
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   872
				if (HasBit(st->goods[i].acceptance_pickup, GoodsEntry::ACCEPTANCE)) {
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   873
					if (first) {
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   874
						first = false;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   875
					} else {
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   876
						/* Add a comma if this is not the first item */
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   877
						*b++ = ',';
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   878
						*b++ = ' ';
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   879
					}
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   880
					b = InlineString(b, GetCargo(i)->name);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   881
				}
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   882
			}
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   883
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   884
			/* If first is still true then no cargo is accepted */
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   885
			if (first) b = InlineString(b, STR_00D0_NOTHING);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   886
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   887
			*b = '\0';
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   888
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   889
			/* Make sure we detect any buffer overflow */
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   890
			assert(b < endof(_userstring));
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   891
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   892
			DrawStringMultiLine(2, this->widget[SVW_ACCEPTLIST].top + 1, STR_SPEC_USERSTRING, this->widget[SVW_ACCEPTLIST].right - this->widget[SVW_ACCEPTLIST].left);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   893
		} else { // extended window with list of cargo ratings
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   894
			y = this->widget[SVW_RATINGLIST].top + 1;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   895
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   896
			DrawString(2, y, STR_3034_LOCAL_RATING_OF_TRANSPORT, TC_FROMSTRING);
6623
1115fe0767a9 (svn r9127) -Codechange: Check if a cargo is valid before displaying it in a station's cargo rating list. (And duff up the block a little)
peter1138
parents: 6611
diff changeset
   897
			y += 10;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   898
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   899
			for (CargoID i = 0; i < NUM_CARGO; i++) {
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   900
				const CargoSpec *cs = GetCargo(i);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   901
				if (!cs->IsValid()) continue;
9246
14265864e804 (svn r12446) -Feature: Add +/- toggle buttons to station cargo waiting list to show/hide the detailed transferred cargo information.
peter1138
parents: 9215
diff changeset
   902
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   903
				const GoodsEntry *ge = &st->goods[i];
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   904
				if (!HasBit(ge->acceptance_pickup, GoodsEntry::PICKUP)) continue;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   905
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   906
				SetDParam(0, cs->name);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   907
				SetDParam(2, ge->rating * 101 >> 8);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   908
				SetDParam(1, STR_3035_APPALLING + (ge->rating >> 5));
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   909
				DrawString(8, y, STR_303D, TC_FROMSTRING);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   910
				y += 10;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   911
			}
9246
14265864e804 (svn r12446) -Feature: Add +/- toggle buttons to station cargo waiting list to show/hide the detailed transferred cargo information.
peter1138
parents: 9215
diff changeset
   912
		}
14265864e804 (svn r12446) -Feature: Add +/- toggle buttons to station cargo waiting list to show/hide the detailed transferred cargo information.
peter1138
parents: 9215
diff changeset
   913
	}
14265864e804 (svn r12446) -Feature: Add +/- toggle buttons to station cargo waiting list to show/hide the detailed transferred cargo information.
peter1138
parents: 9215
diff changeset
   914
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   915
	void HandleCargoWaitingClick(int row)
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   916
	{
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   917
		if (row == 0) return;
6528
b705912233fa (svn r8988) -Fix: Indenting, variable scope, variable type and minor duffage
peter1138
parents: 6448
diff changeset
   918
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   919
		for (CargoID c = 0; c < NUM_CARGO; c++) {
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   920
			if (this->cargo_rows[c] == row) {
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   921
				ToggleBit(this->cargo, c);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   922
				this->InvalidateWidget(SVW_WAITING);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   923
				break;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   924
			}
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   925
		}
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   926
	}
6528
b705912233fa (svn r8988) -Fix: Indenting, variable scope, variable type and minor duffage
peter1138
parents: 6448
diff changeset
   927
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   928
	virtual void OnClick(Point pt, int widget)
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   929
	{
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   930
		switch (widget) {
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   931
			case SVW_WAITING:
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   932
				this->HandleCargoWaitingClick((pt.y - this->widget[SVW_WAITING].top) / 10 + this->vscroll.pos);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   933
				break;
6528
b705912233fa (svn r8988) -Fix: Indenting, variable scope, variable type and minor duffage
peter1138
parents: 6448
diff changeset
   934
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   935
			case SVW_LOCATION:
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   936
				if (_ctrl_pressed) {
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   937
					ShowExtraViewPortWindow(GetStation(this->window_number)->xy);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   938
				} else {
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   939
					ScrollMainWindowToTile(GetStation(this->window_number)->xy);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   940
				}
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   941
				break;
6528
b705912233fa (svn r8988) -Fix: Indenting, variable scope, variable type and minor duffage
peter1138
parents: 6448
diff changeset
   942
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   943
			case SVW_RATINGS:
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   944
				this->SetDirty();
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   945
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   946
				if (this->widget[SVW_RATINGS].data == STR_3032_RATINGS) {
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   947
					/* Switch to ratings view */
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   948
					this->widget[SVW_RATINGS].data = STR_3033_ACCEPTS;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   949
					this->widget[SVW_RATINGS].tooltips = STR_3056_SHOW_LIST_OF_ACCEPTED_CARGO;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   950
					ResizeWindowForWidget(this, SVW_ACCEPTLIST, 0, 100);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   951
				} else {
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   952
					/* Switch to accepts view */
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   953
					this->widget[SVW_RATINGS].data = STR_3032_RATINGS;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   954
					this->widget[SVW_RATINGS].tooltips = STR_3054_SHOW_STATION_RATINGS;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   955
					ResizeWindowForWidget(this, SVW_ACCEPTLIST, 0, -100);
6528
b705912233fa (svn r8988) -Fix: Indenting, variable scope, variable type and minor duffage
peter1138
parents: 6448
diff changeset
   956
				}
b705912233fa (svn r8988) -Fix: Indenting, variable scope, variable type and minor duffage
peter1138
parents: 6448
diff changeset
   957
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   958
				this->SetDirty();
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   959
				break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   960
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   961
			case SVW_RENAME:
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   962
				SetDParam(0, this->window_number);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   963
				ShowQueryString(STR_STATION, STR_3030_RENAME_STATION_LOADING, 31, 180, this, CS_ALPHANUMERAL);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   964
				break;
6528
b705912233fa (svn r8988) -Fix: Indenting, variable scope, variable type and minor duffage
peter1138
parents: 6448
diff changeset
   965
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   966
			case SVW_TRAINS: { // Show a list of scheduled trains to this station
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   967
				const Station *st = GetStation(this->window_number);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   968
				ShowVehicleListWindow(st->owner, VEH_TRAIN, (StationID)this->window_number);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   969
				break;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   970
			}
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   971
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   972
			case SVW_ROADVEHS: { // Show a list of scheduled road-vehicles to this station
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   973
				const Station *st = GetStation(this->window_number);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   974
				ShowVehicleListWindow(st->owner, VEH_ROAD, (StationID)this->window_number);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   975
				break;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   976
			}
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   977
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   978
			case SVW_PLANES: { // Show a list of scheduled aircraft to this station
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   979
				const Station *st = GetStation(this->window_number);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   980
				/* Since oilrigs have no owners, show the scheduled aircraft of current player */
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   981
				PlayerID owner = (st->owner == OWNER_NONE) ? _current_player : st->owner;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   982
				ShowVehicleListWindow(owner, VEH_AIRCRAFT, (StationID)this->window_number);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   983
				break;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   984
			}
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   985
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   986
			case SVW_SHIPS: { // Show a list of scheduled ships to this station
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   987
				const Station *st = GetStation(this->window_number);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   988
				/* Since oilrigs/bouys have no owners, show the scheduled ships of current player */
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   989
				PlayerID owner = (st->owner == OWNER_NONE) ? _current_player : st->owner;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   990
				ShowVehicleListWindow(owner, VEH_SHIP, (StationID)this->window_number);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   991
				break;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   992
			}
588
1b60458bdc29 (svn r1009) -Feature: per-station vehicle lists
tron
parents: 534
diff changeset
   993
		}
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   994
	}
8916
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
   995
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   996
	virtual void OnQueryTextFinished(char *str)
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   997
	{
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   998
		if (!StrEmpty(str)) {
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
   999
			_cmd_text = str;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
  1000
			DoCommandP(0, this->window_number, 0, NULL,
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
  1001
				CMD_RENAME_STATION | CMD_MSG(STR_3031_CAN_T_RENAME_STATION));
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
  1002
		}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1003
	}
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
  1004
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
  1005
	virtual void OnResize(Point new_size, Point delta)
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
  1006
	{
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
  1007
		if (delta.x != 0) ResizeButtons(this, SVW_LOCATION, SVW_RENAME);
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
  1008
		this->vscroll.cap += delta.y / (int)this->resize.step_height;
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
  1009
	}
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
  1010
};
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1011
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1012
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1013
static const WindowDesc _station_view_desc = {
7837
65d7362153a6 (svn r10704) -Codechange: provide an infrastructure to have resizable windows that are smaller than the default window size.
rubidium
parents: 7554
diff changeset
  1014
	WDP_AUTO, WDP_AUTO, 249, 110, 249, 110,
6144
5a0ffbf27ced (svn r8511) -Codechange: make WindowClass an enumerated value.
rubidium
parents: 5996
diff changeset
  1015
	WC_STATION_VIEW, WC_NONE,
8916
383cb2ffdb2f (svn r11990) -Codechange: Show all cargo sources (en-route from) in the station view
peter1138
parents: 8845
diff changeset
  1016
	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE,
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1017
	_station_view_widgets,
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
  1018
	NULL
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1019
};
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1020
8512
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
  1021
/**
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
  1022
 * Opens StationViewWindow for given station
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
  1023
 *
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
  1024
 * @param station station which window should be opened
e77c8fb7c0ed (svn r11576) -Codechange: enumerize and comment station GUI
smatz
parents: 8501
diff changeset
  1025
 */
2498
befad2fe53d2 (svn r3024) -Codechange: Another batch of replacements of int/uint/int16/byte/-1 with proper types and constants
tron
parents: 2484
diff changeset
  1026
void ShowStationViewWindow(StationID station)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1027
{
10505
4dc656969d0d (svn r13048) -Codechange: make a class of the StationViewWindow.
rubidium
parents: 10484
diff changeset
  1028
	AllocateWindowDescFront<StationViewWindow>(&_station_view_desc, station);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1029
}