102     return DropDownListStringItem::Width() + this->checkmark_width;
 
  105   void Draw(
int left, 
int right, 
int top, 
int bottom, 
bool sel, 
int bg_colour)
 const 
  130   bool Selectable()
 const 
  143   uint Height(uint width)
 const 
  148   void Draw(
int left, 
int right, 
int top, 
int bottom, 
bool sel, 
int bg_colour)
 const 
  156     int icon_offset = (bottom - top - icon_size.height) / 2;
 
  167       col = sel ? TC_WHITE : TC_BLACK;
 
  196   for (
int i = 0; i < count; i++) {
 
  219 #ifdef ENABLE_NETWORK 
  226     if (include_spectator) {
 
  258     return CBF_PLACE_SIGN;
 
  282   _fast_forward ^= 
true;
 
  297   OME_SHOW_STATIONNAMES,
 
  298   OME_SHOW_WAYPOINTNAMES,
 
  300   OME_SHOW_COMPETITOR_SIGNS,
 
  303   OME_TRANSPARENTBUILDINGS,
 
  304   OME_SHOW_STATIONSIGNS,
 
  359     case OME_SHOW_COMPETITOR_SIGNS:
 
  376   SLEME_SAVE_SCENARIO   = 0,
 
  378   SLEME_SAVE_HEIGHTMAP,
 
  379   SLEME_LOAD_HEIGHTMAP,
 
  428   if (_game_mode == GM_EDITOR) {
 
  434       case SLEME_EXIT_TOINTRO:   AskExitToGameMenu();                    
break;
 
  435       case SLEME_EXIT_GAME:      HandleExitGameRequest();                
break;
 
  441       case SLNME_EXIT_TOINTRO:   AskExitToGameMenu();               
break;
 
  442       case SLNME_EXIT_GAME:      HandleExitGameRequest();           
break;
 
  450 enum MapMenuEntries {
 
  451   MME_SHOW_SMALLMAP        = 0,
 
  452   MME_SHOW_EXTRAVIEWPORTS,
 
  455   MME_SHOW_TOWNDIRECTORY,
 
  456   MME_SHOW_INDUSTRYDIRECTORY,
 
  495     case MME_SHOW_TOWNDIRECTORY:  ShowTownDirectory();       
break;
 
  496     case MME_SHOW_INDUSTRYDIRECTORY: ShowIndustryDirectory(); 
break;
 
  518     case 0: ShowTownDirectory(); 
break;
 
  543     case 0: ShowSubsidiesList(); 
break;
 
  604 #ifdef ENABLE_NETWORK 
  691     case 0: ShowOperatingProfitGraph();    
break;
 
  692     case 1: ShowIncomeGraph();             
break;
 
  693     case 2: ShowDeliveredCargoGraph();     
break;
 
  694     case 3: ShowPerformanceHistoryGraph(); 
break;
 
  695     case 4: ShowCompanyValueGraph();       
break;
 
  696     case 5: ShowCargoPaymentRates();       
break;
 
  698     case 6: ShowCompanyLeagueTable();      
break;
 
  699     case 7: ShowPerformanceRatingDetail(); 
break;
 
  721     case 0: ShowCompanyLeagueTable();      
break;
 
  722     case 1: ShowPerformanceRatingDetail(); 
break;
 
  746     case 0: ShowIndustryDirectory();     
break;
 
  748     case 2: ShowBuildIndustryWindow();   
break;
 
  884   _last_built_railtype = (
RailType)index;
 
  901   FOR_ALL_ENGINES_OF_TYPE(e, 
VEH_ROAD) {
 
  921   _last_built_roadtype = (
RoadType)index;
 
  984     case 1: ShowBuildTreesToolbar(); 
break;
 
  985     case 2: 
return SelectSignTool();
 
 1042     return CBF_PLACE_LANDINFO;
 
 1052 static void MenuClickSmallScreenshot()
 
 1076   if ((uint64)vp.
width * (uint64)vp.
height > 8192 * 8192) {
 
 1097   extern bool _draw_bounding_boxes;
 
 1100     _draw_bounding_boxes = !_draw_bounding_boxes;
 
 1114   extern bool _draw_dirty_blocks;
 
 1117     _draw_dirty_blocks = !_draw_dirty_blocks;
 
 1143     case  0: 
return PlaceLandBlockInfo();
 
 1146     case  4: MenuClickSmallScreenshot();       
break;
 
 1150     case  8: ShowAboutWindow();                
break;
 
 1162   if (_toolbar_mode != TB_LOWER) {
 
 1163     _toolbar_mode = TB_LOWER;
 
 1165     _toolbar_mode = TB_UPPER;
 
 1227   ShowFoundTownWindow();
 
 1235   ShowBuildIndustryWindow();
 
 1259   ShowBuildTreesToolbar();
 
 1267   return SelectSignTool();
 
 1277 static MenuClickedProc * 
const _menu_clicked_procs[] = {
 
 1342     for (
NWidgetBase *child_wid = this->
head; child_wid != NULL; child_wid = child_wid->
next) {
 
 1343       child_wid->SetupSmallestSize(w, init_array);
 
 1344       this->
smallest_y = 
max(this->
smallest_y, child_wid->smallest_y + child_wid->padding_top + child_wid->padding_bottom);
 
 1345       if (this->
IsButton(child_wid->type)) {
 
 1347         this->
smallest_x = 
max(this->
smallest_x, child_wid->smallest_x + child_wid->padding_left + child_wid->padding_right);
 
 1354     for (
NWidgetBase *child_wid = this->
head; child_wid != NULL; child_wid = child_wid->
next) {
 
 1356       if (!this->
IsButton(child_wid->type)) {
 
 1357         child_wid->current_x = child_wid->smallest_x;
 
 1374     uint arrangable_count, button_count, spacer_count;
 
 1375     const byte *arrangement = 
GetButtonArrangement(given_width, arrangable_count, button_count, spacer_count);
 
 1376     for (uint i = 0; i < arrangable_count; i++) {
 
 1377       this->
visible[arrangement[i]] = 
true;
 
 1382     for (
NWidgetBase *child_wid = this->
head; child_wid != NULL; child_wid = child_wid->
next) {
 
 1384       widgets[((
NWidgetCore*)child_wid)->index] = child_wid;
 
 1389     uint spacer_space = 
max(0, (
int)given_width - (
int)(button_count * this->
smallest_x)); 
 
 1390     uint button_space = given_width - spacer_space; 
 
 1395     const byte *cur_wid = rtl ? &arrangement[arrangable_count - 1] : arrangement;
 
 1396     for (uint i = 0; i < arrangable_count; i++) {
 
 1399       if (spacer_space != 0) {
 
 1401         if (possible_spacer != NULL && possible_spacer->
type == 
NWID_SPACER) {
 
 1402           uint add = spacer_space / (spacer_count - spacer_i);
 
 1404           spacer_space -= add;
 
 1411         child_wid->
current_x = button_space / (button_count - button_i);
 
 1433     for (
NWidgetBase *child_wid = rtl ? this->
tail : this->
head; child_wid != NULL; child_wid = rtl ? child_wid->
prev : child_wid->
next) {
 
 1445     for (
NWidgetBase *child_wid = this->
head; child_wid != NULL; child_wid = child_wid->
next) {
 
 1450       if (nwid != NULL) 
return nwid;
 
 1463   virtual const byte *
GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) 
const = 0;
 
 1468    const byte *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count)
 const 
 1470     static const uint SMALLEST_ARRANGEMENT = 14;
 
 1471     static const uint BIGGEST_ARRANGEMENT  = 20;
 
 1479     static const byte arrange14[] = {
 
 1510     static const byte arrange15[] = {
 
 1543     static const byte arrange16[] = {
 
 1578     static const byte arrange17[] = {
 
 1615     static const byte arrange18[] = {
 
 1654     static const byte arrange19[] = {
 
 1695     static const byte arrange20[] = {
 
 1738     static const byte arrange_all[] = {
 
 1772     if (full_buttons > BIGGEST_ARRANGEMENT) {
 
 1773       button_count = arrangable_count = 
lengthof(arrange_all);
 
 1779     static const byte * 
const arrangements[] = { arrange14, arrange15, arrange16, arrange17, arrange18, arrange19, arrange20 };
 
 1781     button_count = arrangable_count = full_buttons;
 
 1783     return arrangements[full_buttons - SMALLEST_ARRANGEMENT] + ((_toolbar_mode == TB_LOWER) ? full_buttons : 0);
 
 1791   void SetupSmallestSize(
Window *w, 
bool init_array)
 
 1797     for (
NWidgetBase *child_wid = this->
head; child_wid != NULL; child_wid = child_wid->
next) {
 
 1798       if (child_wid->type == 
NWID_SPACER || this->IsButton(child_wid->type)) 
continue;
 
 1806    const byte *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count)
 const 
 1808     static const byte arrange_all[] = {
 
 1828     static const byte arrange_nopanel[] = {
 
 1847     static const byte arrange_switch[] = {
 
 1872     if (width >= min_full_width) {
 
 1874       arrangable_count = 
lengthof(arrange_all);
 
 1875       button_count = arrangable_count - 2;
 
 1882     if (width > min_small_width) {
 
 1884       arrangable_count = 
lengthof(arrange_nopanel);
 
 1885       button_count = arrangable_count - 1;
 
 1886       spacer_count = this->
spacers - 1;
 
 1887       return arrange_nopanel;
 
 1892     arrangable_count = 
lengthof(arrange_switch) / 2;
 
 1893     button_count = arrangable_count - 1;
 
 1895     return arrange_switch + ((_toolbar_mode == TB_LOWER) ? arrangable_count : 0);
 
 1903 static ToolbarButtonProc * 
const _toolbar_button_procs[] = {
 
 1910   ToolbarSubsidiesClick,
 
 1911   ToolbarStationsClick,
 
 1912   ToolbarFinancesClick,
 
 1913   ToolbarCompaniesClick,
 
 1918   ToolbarIndustryClick,
 
 1924   ToolbarZoomOutClick,
 
 1925   ToolbarBuildRailClick,
 
 1926   ToolbarBuildRoadClick,
 
 1927   ToolbarBuildWaterClick,
 
 1928   ToolbarBuildAirClick,
 
 1931   ToolbarNewspaperClick,
 
 1936 enum MainToolbarHotkeys {
 
 1966   MTHK_SMALL_SCREENSHOT,
 
 1967   MTHK_ZOOMEDIN_SCREENSHOT,
 
 1968   MTHK_DEFAULTZOOM_SCREENSHOT,
 
 1969   MTHK_GIANT_SCREENSHOT,
 
 1972   MTHK_EXTRA_VIEWPORT,
 
 2016     if (_game_mode != GM_MENU && !this->
IsWidgetDisabled(widget)) _toolbar_button_procs[widget](
this);
 
 2028       case MTHK_PAUSE: ToolbarPauseClick(
this); 
break;
 
 2034       case MTHK_TOWNDIRECTORY: ShowTownDirectory(); 
break;
 
 2035       case MTHK_SUBSIDIES: ShowSubsidiesList(); 
break;
 
 2041       case MTHK_GRAPHS: ShowOperatingProfitGraph(); 
break;
 
 2042       case MTHK_LEAGUE: ShowCompanyLeagueTable(); 
break;
 
 2043       case MTHK_INDUSTRIES: ShowBuildIndustryWindow(); 
break;
 
 2048       case MTHK_ZOOM_IN: ToolbarZoomInClick(
this); 
break;
 
 2049       case MTHK_ZOOM_OUT: ToolbarZoomOutClick(
this); 
break;
 
 2054       case MTHK_BUILD_TREES: ShowBuildTreesToolbar(); 
break;
 
 2055       case MTHK_MUSIC: ShowMusicWindow(); 
break;
 
 2057       case MTHK_SMALL_SCREENSHOT: MenuClickSmallScreenshot(); 
break;
 
 2064 #ifdef ENABLE_NETWORK 
 2065       case MTHK_CLIENT_LIST: 
if (
_networking) ShowClientList(); 
break;
 
 2076       case CBF_PLACE_SIGN:
 
 2080       case CBF_PLACE_LANDINFO:
 
 2084       default: NOT_REACHED();
 
 2125     if (!gui_scope) 
return;
 
 2132 const uint16 _maintoolbar_pause_keys[] = {WKC_F1, WKC_PAUSE, 0};
 
 2133 const uint16 _maintoolbar_zoomin_keys[] = {WKC_NUM_PLUS, 
WKC_EQUALS, WKC_SHIFT | 
WKC_EQUALS, WKC_SHIFT | WKC_F5, 0};
 
 2134 const uint16 _maintoolbar_zoomout_keys[] = {WKC_NUM_MINUS, 
WKC_MINUS, WKC_SHIFT | 
WKC_MINUS, WKC_SHIFT | WKC_F6, 0};
 
 2135 const uint16 _maintoolbar_smallmap_keys[] = {WKC_F4, 
'M', 0};
 
 2137 static Hotkey maintoolbar_hotkeys[] = {
 
 2138   Hotkey(_maintoolbar_pause_keys, 
"pause", MTHK_PAUSE),
 
 2139   Hotkey((uint16)0, 
"fastforward", MTHK_FASTFORWARD),
 
 2140   Hotkey(WKC_F2, 
"settings", MTHK_SETTINGS),
 
 2141   Hotkey(WKC_F3, 
"saveload", MTHK_SAVEGAME),
 
 2142   Hotkey((uint16)0, 
"load_game", MTHK_LOADGAME),
 
 2143   Hotkey(_maintoolbar_smallmap_keys, 
"smallmap", MTHK_SMALLMAP),
 
 2144   Hotkey(WKC_F5, 
"town_list", MTHK_TOWNDIRECTORY),
 
 2145   Hotkey(WKC_F6, 
"subsidies", MTHK_SUBSIDIES),
 
 2146   Hotkey(WKC_F7, 
"station_list", MTHK_STATIONS),
 
 2147   Hotkey(WKC_F8, 
"finances", MTHK_FINANCES),
 
 2148   Hotkey(WKC_F9, 
"companies", MTHK_COMPANIES),
 
 2149   Hotkey((uint16)0, 
"story_book", MTHK_STORY),
 
 2150   Hotkey((uint16)0, 
"goal_list", MTHK_GOAL),
 
 2151   Hotkey(WKC_F10, 
"graphs", MTHK_GRAPHS),
 
 2152   Hotkey(WKC_F11, 
"league", MTHK_LEAGUE),
 
 2153   Hotkey(WKC_F12, 
"industry_list", MTHK_INDUSTRIES),
 
 2154   Hotkey(WKC_SHIFT | WKC_F1, 
"train_list", MTHK_TRAIN_LIST),
 
 2155   Hotkey(WKC_SHIFT | WKC_F2, 
"roadveh_list", MTHK_ROADVEH_LIST),
 
 2156   Hotkey(WKC_SHIFT | WKC_F3, 
"ship_list", MTHK_SHIP_LIST),
 
 2157   Hotkey(WKC_SHIFT | WKC_F4, 
"aircraft_list", MTHK_AIRCRAFT_LIST),
 
 2158   Hotkey(_maintoolbar_zoomin_keys, 
"zoomin", MTHK_ZOOM_IN),
 
 2159   Hotkey(_maintoolbar_zoomout_keys, 
"zoomout", MTHK_ZOOM_OUT),
 
 2160   Hotkey(WKC_SHIFT | WKC_F7, 
"build_rail", MTHK_BUILD_RAIL),
 
 2161   Hotkey(WKC_SHIFT | WKC_F8, 
"build_road", MTHK_BUILD_ROAD),
 
 2162   Hotkey(WKC_SHIFT | WKC_F9, 
"build_docks", MTHK_BUILD_DOCKS),
 
 2163   Hotkey(WKC_SHIFT | WKC_F10, 
"build_airport", MTHK_BUILD_AIRPORT),
 
 2164   Hotkey(WKC_SHIFT | WKC_F11, 
"build_trees", MTHK_BUILD_TREES),
 
 2165   Hotkey(WKC_SHIFT | WKC_F12, 
"music", MTHK_MUSIC),
 
 2166   Hotkey((uint16)0, 
"ai_debug", MTHK_AI_DEBUG),
 
 2167   Hotkey(WKC_CTRL  | 
'S', 
"small_screenshot", MTHK_SMALL_SCREENSHOT),
 
 2168   Hotkey(WKC_CTRL  | 
'P', 
"zoomedin_screenshot", MTHK_ZOOMEDIN_SCREENSHOT),
 
 2169   Hotkey(WKC_CTRL  | 
'D', 
"defaultzoom_screenshot", MTHK_DEFAULTZOOM_SCREENSHOT),
 
 2170   Hotkey((uint16)0, 
"giant_screenshot", MTHK_GIANT_SCREENSHOT),
 
 2171   Hotkey(WKC_CTRL | WKC_ALT | 
'C', 
"cheats", MTHK_CHEATS),
 
 2172   Hotkey(
'L', 
"terraform", MTHK_TERRAFORM),
 
 2173   Hotkey(
'V', 
"extra_viewport", MTHK_EXTRA_VIEWPORT),
 
 2174 #ifdef ENABLE_NETWORK 
 2175   Hotkey((uint16)0, 
"client_list", MTHK_CLIENT_LIST),
 
 2177   Hotkey((uint16)0, 
"sign_list", MTHK_SIGN_LIST),
 
 2180 HotkeyList MainToolbarWindow::hotkeys(
"maintoolbar", maintoolbar_hotkeys);
 
 2185   static const SpriteID toolbar_button_sprites[] = {
 
 2187     SPR_IMG_FASTFORWARD,     
 
 2193     SPR_IMG_COMPANY_LIST,    
 
 2194     SPR_IMG_COMPANY_FINANCE, 
 
 2195     SPR_IMG_COMPANY_GENERAL, 
 
 2199     SPR_IMG_COMPANY_LEAGUE,  
 
 2204     SPR_IMG_AIRPLANESLIST,   
 
 2211     SPR_IMG_LANDSCAPING,     
 
 2215     SPR_IMG_SWITCH_TOOLBAR,  
 
 2237 static const NWidgetPart _nested_toolbar_normal_widgets[] = {
 
 2245   _nested_toolbar_normal_widgets, 
lengthof(_nested_toolbar_normal_widgets),
 
 2246   &MainToolbarWindow::hotkeys
 
 2252 static ToolbarButtonProc * 
const _scen_toolbar_button_procs[] = {
 
 2259   ToolbarScenDateBackward,
 
 2260   ToolbarScenDateForward,
 
 2261   ToolbarScenMapTownDir,
 
 2263   ToolbarZoomOutClick,
 
 2266   ToolbarScenGenIndustry,
 
 2267   ToolbarScenBuildRoad,
 
 2268   ToolbarScenBuildDocks,
 
 2269   ToolbarScenPlantTrees,
 
 2270   ToolbarScenPlaceSign,
 
 2285 enum MainToolbarEditorHotkeys {
 
 2299   MTEHK_SMALL_SCREENSHOT,
 
 2300   MTEHK_ZOOMEDIN_SCREENSHOT,
 
 2301   MTEHK_DEFAULTZOOM_SCREENSHOT,
 
 2302   MTEHK_GIANT_SCREENSHOT,
 
 2307   MTEHK_EXTRA_VIEWPORT,
 
 2343         int height = r.bottom - r.top;
 
 2346           DrawString(r.left, r.right, (height + 1) / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, 
SA_HOR_CENTER);
 
 2372     if (_game_mode == GM_MENU) 
return;
 
 2391       case MTEHK_PAUSE:                  ToolbarPauseClick(
this); 
break;
 
 2395       case MTEHK_GENLAND:                ToolbarScenGenLand(
this); 
break;
 
 2396       case MTEHK_GENTOWN:                ToolbarScenGenTown(
this); 
break;
 
 2397       case MTEHK_GENINDUSTRY:            ToolbarScenGenIndustry(
this); 
break;
 
 2398       case MTEHK_BUILD_ROAD:             ToolbarScenBuildRoad(
this); 
break;
 
 2399       case MTEHK_BUILD_DOCKS:            ToolbarScenBuildDocks(
this); 
break;
 
 2400       case MTEHK_BUILD_TREES:            ToolbarScenPlantTrees(
this); 
break;
 
 2401       case MTEHK_SIGN:                   cbf = ToolbarScenPlaceSign(
this); 
break;
 
 2402       case MTEHK_MUSIC:                  ShowMusicWindow(); 
break;
 
 2403       case MTEHK_LANDINFO:               cbf = PlaceLandBlockInfo(); 
break;
 
 2404       case MTEHK_SMALL_SCREENSHOT:       MenuClickSmallScreenshot(); 
break;
 
 2408       case MTEHK_ZOOM_IN:                ToolbarZoomInClick(
this); 
break;
 
 2409       case MTEHK_ZOOM_OUT:               ToolbarZoomOutClick(
this); 
break;
 
 2422       case CBF_PLACE_SIGN:
 
 2426       case CBF_PLACE_LANDINFO:
 
 2430       default: NOT_REACHED();
 
 2466     if (!gui_scope) 
return;
 
 2473     if (str == NULL) 
return;
 
 2490 static Hotkey scenedit_maintoolbar_hotkeys[] = {
 
 2491   Hotkey(_maintoolbar_pause_keys, 
"pause", MTEHK_PAUSE),
 
 2492   Hotkey((uint16)0, 
"fastforward", MTEHK_FASTFORWARD),
 
 2493   Hotkey(WKC_F2, 
"settings", MTEHK_SETTINGS),
 
 2494   Hotkey(WKC_F3, 
"saveload", MTEHK_SAVEGAME),
 
 2495   Hotkey(WKC_F4, 
"gen_land", MTEHK_GENLAND),
 
 2496   Hotkey(WKC_F5, 
"gen_town", MTEHK_GENTOWN),
 
 2497   Hotkey(WKC_F6, 
"gen_industry", MTEHK_GENINDUSTRY),
 
 2498   Hotkey(WKC_F7, 
"build_road", MTEHK_BUILD_ROAD),
 
 2499   Hotkey(WKC_F8, 
"build_docks", MTEHK_BUILD_DOCKS),
 
 2500   Hotkey(WKC_F9, 
"build_trees", MTEHK_BUILD_TREES),
 
 2501   Hotkey(WKC_F10, 
"build_sign", MTEHK_SIGN),
 
 2502   Hotkey(WKC_F11, 
"music", MTEHK_MUSIC),
 
 2503   Hotkey(WKC_F12, 
"land_info", MTEHK_LANDINFO),
 
 2504   Hotkey(WKC_CTRL  | 
'S', 
"small_screenshot", MTEHK_SMALL_SCREENSHOT),
 
 2505   Hotkey(WKC_CTRL  | 
'P', 
"zoomedin_screenshot", MTEHK_ZOOMEDIN_SCREENSHOT),
 
 2506   Hotkey(WKC_CTRL  | 
'D', 
"defaultzoom_screenshot", MTEHK_DEFAULTZOOM_SCREENSHOT),
 
 2507   Hotkey((uint16)0, 
"giant_screenshot", MTEHK_GIANT_SCREENSHOT),
 
 2508   Hotkey(_maintoolbar_zoomin_keys, 
"zoomin", MTEHK_ZOOM_IN),
 
 2509   Hotkey(_maintoolbar_zoomout_keys, 
"zoomout", MTEHK_ZOOM_OUT),
 
 2510   Hotkey(
'L', 
"terraform", MTEHK_TERRAFORM),
 
 2511   Hotkey(
'M', 
"smallmap", MTEHK_SMALLMAP),
 
 2512   Hotkey(
'V', 
"extra_viewport", MTEHK_EXTRA_VIEWPORT),
 
 2515 HotkeyList ScenarioEditorToolbarWindow::hotkeys(
"scenedit_maintoolbar", scenedit_maintoolbar_hotkeys);
 
 2517 static const NWidgetPart _nested_toolb_scen_inner_widgets[] = {
 
 2551 static NWidgetBase *MakeScenarioToolbar(
int *biggest_index)
 
 2556 static const NWidgetPart _nested_toolb_scen_widgets[] = {
 
 2564   _nested_toolb_scen_widgets, 
lengthof(_nested_toolb_scen_widgets),
 
 2565   &ScenarioEditorToolbarWindow::hotkeys
 
 2574   if (_game_mode == GM_EDITOR) {