00001
00002
00005 #include "stdafx.h"
00006 #include "station_base.h"
00007 #include "industry.h"
00008 #include "town.h"
00009 #include "economy_func.h"
00010 #include "cargotype.h"
00011 #include "window_gui.h"
00012 #include "strings_func.h"
00013 #include "date_func.h"
00014 #include "viewport_func.h"
00015 #include "gfx_func.h"
00016 #include "gui.h"
00017
00018 #include "table/strings.h"
00019
00020 struct SubsidyListWindow : Window {
00021 SubsidyListWindow(const WindowDesc *desc, WindowNumber window_number) : Window(desc, window_number)
00022 {
00023 this->FindWindowPlacementAndResize(desc);
00024 }
00025
00026 virtual void OnClick(Point pt, int widget)
00027 {
00028 if (widget != 3) return;
00029
00030 int y = pt.y - 25;
00031
00032 if (y < 0) return;
00033
00034 uint num = 0;
00035 for (const Subsidy *s = _subsidies; s != endof(_subsidies); s++) {
00036 if (s->cargo_type != CT_INVALID && s->age < 12) {
00037 y -= 10;
00038 if (y < 0) {
00039 this->HandleClick(s);
00040 return;
00041 }
00042 num++;
00043 }
00044 }
00045
00046 if (num == 0) {
00047 y -= 10;
00048 if (y < 0) return;
00049 }
00050
00051 y -= 11;
00052 if (y < 0) return;
00053
00054 for (const Subsidy *s = _subsidies; s != endof(_subsidies); s++) {
00055 if (s->cargo_type != CT_INVALID && s->age >= 12) {
00056 y -= 10;
00057 if (y < 0) {
00058 this->HandleClick(s);
00059 return;
00060 }
00061 }
00062 }
00063 }
00064
00065 void HandleClick(const Subsidy *s)
00066 {
00067 TownEffect te = GetCargo(s->cargo_type)->town_effect;
00068 TileIndex xy;
00069
00070
00071 uint offs = s->from;
00072 if (s->age >= 12) {
00073 xy = GetStation(offs)->xy;
00074 } else if (te == TE_PASSENGERS || te == TE_MAIL) {
00075 xy = GetTown(offs)->xy;
00076 } else {
00077 xy = GetIndustry(offs)->xy;
00078 }
00079
00080 if (_ctrl_pressed || !ScrollMainWindowToTile(xy)) {
00081 if (_ctrl_pressed) ShowExtraViewPortWindow(xy);
00082
00083
00084 offs = s->to;
00085 if (s->age >= 12) {
00086 xy = GetStation(offs)->xy;
00087 } else if (te == TE_PASSENGERS || te == TE_MAIL || te == TE_GOODS || te == TE_FOOD) {
00088 xy = GetTown(offs)->xy;
00089 } else {
00090 xy = GetIndustry(offs)->xy;
00091 }
00092
00093 if (_ctrl_pressed) {
00094 ShowExtraViewPortWindow(xy);
00095 } else {
00096 ScrollMainWindowToTile(xy);
00097 }
00098 }
00099 }
00100
00101 virtual void OnPaint()
00102 {
00103 YearMonthDay ymd;
00104 const Subsidy *s;
00105
00106 this->DrawWidgets();
00107
00108 ConvertDateToYMD(_date, &ymd);
00109
00110 int width = this->width - 13;
00111 int y = 15;
00112 int x = 1;
00113
00114
00115 DrawStringTruncated(x, y, STR_2026_SUBSIDIES_ON_OFFER_FOR, TC_FROMSTRING, width);
00116 y += 10;
00117 uint num = 0;
00118
00119 for (s = _subsidies; s != endof(_subsidies); s++) {
00120 if (s->cargo_type != CT_INVALID && s->age < 12) {
00121 int x2;
00122
00123
00124 SetupSubsidyDecodeParam(s, 1);
00125 x2 = DrawStringTruncated(x + 2, y, STR_2027_FROM_TO, TC_FROMSTRING, width - 2);
00126
00127 if (width - x2 > 10) {
00128
00129 SetDParam(0, _date - ymd.day + 384 - s->age * 32);
00130 DrawStringTruncated(x2, y, STR_2028_BY, TC_FROMSTRING, width - x2);
00131 }
00132
00133 y += 10;
00134 num++;
00135 }
00136 }
00137
00138 if (num == 0) {
00139 DrawStringTruncated(x + 2, y, STR_202A_NONE, TC_FROMSTRING, width - 2);
00140 y += 10;
00141 }
00142
00143
00144 DrawStringTruncated(x, y + 1, STR_202B_SERVICES_ALREADY_SUBSIDISED, TC_FROMSTRING, width);
00145 y += 10;
00146 num = 0;
00147
00148 for (s = _subsidies; s != endof(_subsidies); s++) {
00149 if (s->cargo_type != CT_INVALID && s->age >= 12) {
00150 int xt;
00151
00152 SetupSubsidyDecodeParam(s, 1);
00153
00154 SetDParam(3, GetStation(s->to)->owner);
00155
00156
00157 xt = DrawStringTruncated(x + 2, y, STR_202C_FROM_TO, TC_FROMSTRING, width - 2);
00158
00159
00160 if ((xt > 3) && (width - xt) > 9 ) {
00161 SetDParam(0, _date - ymd.day + 768 - s->age * 32);
00162 DrawStringTruncated(xt, y, STR_202D_UNTIL, TC_FROMSTRING, width - xt);
00163 }
00164 y += 10;
00165 num++;
00166 }
00167 }
00168
00169 if (num == 0) DrawStringTruncated(x + 2, y, STR_202A_NONE, TC_FROMSTRING, width - 2);
00170 }
00171 };
00172
00173 static const Widget _subsidies_list_widgets[] = {
00174 { WWT_CLOSEBOX, RESIZE_NONE, COLOUR_BROWN, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
00175 { WWT_CAPTION, RESIZE_RIGHT, COLOUR_BROWN, 11, 307, 0, 13, STR_2025_SUBSIDIES, STR_018C_WINDOW_TITLE_DRAG_THIS},
00176 { WWT_STICKYBOX, RESIZE_LR, COLOUR_BROWN, 308, 319, 0, 13, STR_NULL, STR_STICKY_BUTTON},
00177 { WWT_PANEL, RESIZE_RB, COLOUR_BROWN, 0, 307, 14, 126, 0x0, STR_01FD_CLICK_ON_SERVICE_TO_CENTER},
00178 { WWT_SCROLLBAR, RESIZE_LRB, COLOUR_BROWN, 308, 319, 14, 114, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST},
00179 { WWT_RESIZEBOX, RESIZE_LRTB, COLOUR_BROWN, 308, 319, 115, 126, 0x0, STR_RESIZE_BUTTON},
00180
00181 { WIDGETS_END},
00182 };
00183
00184 static const WindowDesc _subsidies_list_desc(
00185 WDP_AUTO, WDP_AUTO, 320, 127, 320, 127,
00186 WC_SUBSIDIES_LIST, WC_NONE,
00187 WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON | WDF_RESIZABLE,
00188 _subsidies_list_widgets
00189 );
00190
00191
00192 void ShowSubsidiesList()
00193 {
00194 AllocateWindowDescFront<SubsidyListWindow>(&_subsidies_list_desc, 0);
00195 }