toolbar_gui.cpp

Go to the documentation of this file.
00001 /* $Id$ */
00002 
00003 /*
00004  * This file is part of OpenTTD.
00005  * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
00006  * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
00007  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
00008  */
00009 
00012 #include "stdafx.h"
00013 #include "gui.h"
00014 #include "window_gui.h"
00015 #include "window_func.h"
00016 #include "viewport_func.h"
00017 #include "command_func.h"
00018 #include "vehicle_gui.h"
00019 #include "rail_gui.h"
00020 #include "road_gui.h"
00021 #include "date_func.h"
00022 #include "vehicle_func.h"
00023 #include "sound_func.h"
00024 #include "terraform_gui.h"
00025 #include "transparency.h"
00026 #include "strings_func.h"
00027 #include "company_func.h"
00028 #include "company_gui.h"
00029 #include "vehicle_base.h"
00030 #include "cheat_func.h"
00031 #include "transparency_gui.h"
00032 #include "screenshot.h"
00033 #include "signs_func.h"
00034 #include "fios.h"
00035 #include "console_gui.h"
00036 #include "news_gui.h"
00037 #include "ai/ai_gui.hpp"
00038 #include "tilehighlight_func.h"
00039 #include "smallmap_gui.h"
00040 #include "graph_gui.h"
00041 #include "textbuf_gui.h"
00042 #include "linkgraph_gui.h"
00043 #include "newgrf_debug.h"
00044 #include "hotkeys.h"
00045 #include "engine_base.h"
00046 
00047 #include "network/network.h"
00048 #include "network/network_gui.h"
00049 #include "network/network_func.h"
00050 
00051 #include "table/strings.h"
00052 #include "table/sprites.h"
00053 
00054 RailType _last_built_railtype;
00055 RoadType _last_built_roadtype;
00056 
00057 enum ToolbarMode {
00058   TB_NORMAL,
00059   TB_UPPER,
00060   TB_LOWER
00061 };
00062 
00064 enum CallBackFunction {
00065   CBF_NONE,
00066   CBF_PLACE_SIGN,
00067   CBF_PLACE_LANDINFO,
00068 };
00069 
00070 enum ToolbarNormalWidgets {
00071   TBN_PAUSE         = 0,
00072   TBN_FASTFORWARD,
00073   TBN_SETTINGS,
00074   TBN_SAVEGAME,
00075   TBN_SMALLMAP,
00076   TBN_TOWNDIRECTORY,
00077   TBN_SUBSIDIES,
00078   TBN_STATIONS,
00079   TBN_FINANCES,
00080   TBN_COMPANIES,
00081   TBN_GRAPHICS,
00082   TBN_LEAGUE,
00083   TBN_INDUSTRIES,
00084   TBN_VEHICLESTART,      
00085   TBN_TRAINS        = TBN_VEHICLESTART,
00086   TBN_ROADVEHS,
00087   TBN_SHIPS,
00088   TBN_AIRCRAFTS,
00089   TBN_ZOOMIN,
00090   TBN_ZOOMOUT,
00091   TBN_RAILS,
00092   TBN_ROADS,
00093   TBN_WATER,
00094   TBN_AIR,
00095   TBN_LANDSCAPE,
00096   TBN_MUSICSOUND,
00097   TBN_NEWSREPORT,
00098   TBN_HELP,
00099   TBN_SWITCHBAR,         
00100   TBN_END                
00101 };
00102 
00103 enum ToolbarScenEditorWidgets {
00104   TBSE_PAUSE        = 0,
00105   TBSE_FASTFORWARD,
00106   TBSE_SETTINGS,
00107   TBSE_SAVESCENARIO,
00108   TBSE_SPACERPANEL,
00109   TBSE_DATEPANEL,
00110   TBSE_DATEBACKWARD,
00111   TBSE_DATEFORWARD,
00112   TBSE_SMALLMAP,
00113   TBSE_ZOOMIN,
00114   TBSE_ZOOMOUT,
00115   TBSE_LANDGENERATE,
00116   TBSE_TOWNGENERATE,
00117   TBSE_INDUSTRYGENERATE,
00118   TBSE_BUILDROAD,
00119   TBSE_BUILDDOCKS,
00120   TBSE_PLANTTREES,
00121   TBSE_PLACESIGNS,
00122   TBSE_DATEPANEL_CONTAINER,
00123 };
00124 
00128 class DropDownListCheckedItem : public DropDownListStringItem {
00129   uint checkmark_width;
00130 public:
00131   bool checked;
00132 
00133   DropDownListCheckedItem(StringID string, int result, bool masked, bool checked) : DropDownListStringItem(string, result, masked), checked(checked)
00134   {
00135     this->checkmark_width = GetStringBoundingBox(STR_JUST_CHECKMARK).width + 3;
00136   }
00137 
00138   virtual ~DropDownListCheckedItem() {}
00139 
00140   uint Width() const
00141   {
00142     return DropDownListStringItem::Width() + this->checkmark_width;
00143   }
00144 
00145   void Draw(int left, int right, int top, int bottom, bool sel, int bg_colour) const
00146   {
00147     bool rtl = _current_text_dir == TD_RTL;
00148     if (this->checked) {
00149       DrawString(left + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, top, STR_JUST_CHECKMARK, sel ? TC_WHITE : TC_BLACK);
00150     }
00151     DrawString(left + WD_FRAMERECT_LEFT + (rtl ? 0 : this->checkmark_width), right - WD_FRAMERECT_RIGHT - (rtl ? this->checkmark_width : 0), top, this->String(), sel ? TC_WHITE : TC_BLACK);
00152   }
00153 };
00154 
00158 class DropDownListCompanyItem : public DropDownListItem {
00159   uint icon_width;
00160 public:
00161   bool greyed;
00162 
00163   DropDownListCompanyItem(int result, bool masked, bool greyed) : DropDownListItem(result, masked), greyed(greyed)
00164   {
00165     this->icon_width = GetSpriteSize(SPR_COMPANY_ICON).width;
00166   }
00167 
00168   virtual ~DropDownListCompanyItem() {}
00169 
00170   bool Selectable() const
00171   {
00172     return true;
00173   }
00174 
00175   uint Width() const
00176   {
00177     CompanyID company = (CompanyID)this->result;
00178     SetDParam(0, company);
00179     SetDParam(1, company);
00180     return GetStringBoundingBox(STR_COMPANY_NAME_COMPANY_NUM).width + this->icon_width + 3;
00181   }
00182 
00183   void Draw(int left, int right, int top, int bottom, bool sel, int bg_colour) const
00184   {
00185     CompanyID company = (CompanyID)this->result;
00186     bool rtl = _current_text_dir == TD_RTL;
00187 
00188     /* It's possible the company is deleted while the dropdown is open */
00189     if (!Company::IsValidID(company)) return;
00190 
00191     DrawCompanyIcon(company, rtl ? right - this->icon_width - WD_FRAMERECT_RIGHT : left + WD_FRAMERECT_LEFT, top + 1 + (FONT_HEIGHT_NORMAL - 10) / 2);
00192 
00193     SetDParam(0, company);
00194     SetDParam(1, company);
00195     TextColour col;
00196     if (this->greyed) {
00197       col = TC_GREY;
00198     } else {
00199       col = sel ? TC_WHITE : TC_BLACK;
00200     }
00201     DrawString(left + WD_FRAMERECT_LEFT + (rtl ? 0 : 3 + this->icon_width), right - WD_FRAMERECT_RIGHT - (rtl ? 3 + this->icon_width : 0), top, STR_COMPANY_NAME_COMPANY_NUM, col);
00202   }
00203 };
00204 
00208 static void PopupMainToolbMenu(Window *w, int widget, StringID string, int count)
00209 {
00210   DropDownList *list = new DropDownList();
00211   for (int i = 0; i < count; i++) {
00212     list->push_back(new DropDownListStringItem(string + i, i, false));
00213   }
00214   ShowDropDownList(w, list, 0, widget, 140, true, true);
00215   SndPlayFx(SND_15_BEEP);
00216 }
00217 
00219 static const int CTMN_CLIENT_LIST = -1; 
00220 static const int CTMN_NEW_COMPANY = -2; 
00221 static const int CTMN_SPECTATE    = -3; 
00222 
00226 static void PopupMainCompanyToolbMenu(Window *w, int widget, int grey = 0)
00227 {
00228   DropDownList *list = new DropDownList();
00229 
00230 #ifdef ENABLE_NETWORK
00231   if (widget == TBN_COMPANIES && _networking) {
00232     /* Add the client list button for the companies menu */
00233     list->push_back(new DropDownListStringItem(STR_NETWORK_COMPANY_LIST_CLIENT_LIST, CTMN_CLIENT_LIST, false));
00234 
00235     if (_local_company == COMPANY_SPECTATOR) {
00236       list->push_back(new DropDownListStringItem(STR_NETWORK_COMPANY_LIST_NEW_COMPANY, CTMN_NEW_COMPANY, NetworkMaxCompaniesReached()));
00237     } else {
00238       list->push_back(new DropDownListStringItem(STR_NETWORK_COMPANY_LIST_SPECTATE, CTMN_SPECTATE, NetworkMaxSpectatorsReached()));
00239     }
00240   }
00241 #endif /* ENABLE_NETWORK */
00242 
00243   for (CompanyID c = COMPANY_FIRST; c < MAX_COMPANIES; c++) {
00244     if (!Company::IsValidID(c)) continue;
00245     list->push_back(new DropDownListCompanyItem(c, false, HasBit(grey, c)));
00246   }
00247 
00248   ShowDropDownList(w, list, _local_company == COMPANY_SPECTATOR ? CTMN_CLIENT_LIST : (int)_local_company, widget, 240, true, true);
00249   SndPlayFx(SND_15_BEEP);
00250 }
00251 
00252 
00253 static ToolbarMode _toolbar_mode;
00254 
00255 static CallBackFunction SelectSignTool()
00256 {
00257   if (_cursor.sprite == SPR_CURSOR_SIGN) {
00258     ResetObjectToPlace();
00259     return CBF_NONE;
00260   } else {
00261     SetObjectToPlace(SPR_CURSOR_SIGN, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0);
00262     return CBF_PLACE_SIGN;
00263   }
00264 }
00265 
00266 /* --- Pausing --- */
00267 
00268 static CallBackFunction ToolbarPauseClick(Window *w)
00269 {
00270   if (_networking && !_network_server) return CBF_NONE; // only server can pause the game
00271 
00272   if (DoCommandP(0, PM_PAUSED_NORMAL, _pause_mode == PM_UNPAUSED, CMD_PAUSE)) SndPlayFx(SND_15_BEEP);
00273   return CBF_NONE;
00274 }
00275 
00276 /* --- Fast forwarding --- */
00277 
00278 static CallBackFunction ToolbarFastForwardClick(Window *w)
00279 {
00280   _fast_forward ^= true;
00281   SndPlayFx(SND_15_BEEP);
00282   return CBF_NONE;
00283 }
00284 
00285 /* --- Options button menu --- */
00286 
00287 enum OptionMenuEntries {
00288   OME_GAMEOPTIONS,
00289   OME_DIFFICULTIES,
00290   OME_SETTINGS,
00291   OME_AI_SETTINGS,
00292   OME_NEWGRFSETTINGS,
00293   OME_TRANSPARENCIES,
00294   OME_SHOW_TOWNNAMES,
00295   OME_SHOW_STATIONNAMES,
00296   OME_SHOW_WAYPOINTNAMES,
00297   OME_SHOW_SIGNS,
00298   OME_FULL_ANIMATION,
00299   OME_FULL_DETAILS,
00300   OME_TRANSPARENTBUILDINGS,
00301   OME_SHOW_STATIONSIGNS,
00302 };
00303 
00304 static CallBackFunction ToolbarOptionsClick(Window *w)
00305 {
00306   DropDownList *list = new DropDownList();
00307   list->push_back(new DropDownListStringItem(STR_SETTINGS_MENU_GAME_OPTIONS,             OME_GAMEOPTIONS, false));
00308   list->push_back(new DropDownListStringItem(STR_SETTINGS_MENU_DIFFICULTY_SETTINGS,      OME_DIFFICULTIES, false));
00309   list->push_back(new DropDownListStringItem(STR_SETTINGS_MENU_CONFIG_SETTINGS,          OME_SETTINGS, false));
00310   /* Changes to the per-AI settings don't get send from the server to the clients. Clients get
00311    * the settings once they join but never update it. As such don't show the window at all
00312    * to network clients. */
00313   if (!_networking || _network_server) list->push_back(new DropDownListStringItem(STR_SETTINGS_MENU_AI_SETTINGS, OME_AI_SETTINGS, false));
00314   list->push_back(new DropDownListStringItem(STR_SETTINGS_MENU_NEWGRF_SETTINGS,          OME_NEWGRFSETTINGS, false));
00315   list->push_back(new DropDownListStringItem(STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS,     OME_TRANSPARENCIES, false));
00316   list->push_back(new DropDownListItem(-1, false));
00317   list->push_back(new DropDownListCheckedItem(STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED,    OME_SHOW_TOWNNAMES, false, HasBit(_display_opt, DO_SHOW_TOWN_NAMES)));
00318   list->push_back(new DropDownListCheckedItem(STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED, OME_SHOW_STATIONNAMES, false, HasBit(_display_opt, DO_SHOW_STATION_NAMES)));
00319   list->push_back(new DropDownListCheckedItem(STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED,     OME_SHOW_WAYPOINTNAMES, false, HasBit(_display_opt, DO_SHOW_WAYPOINT_NAMES)));
00320   list->push_back(new DropDownListCheckedItem(STR_SETTINGS_MENU_SIGNS_DISPLAYED,         OME_SHOW_SIGNS, false, HasBit(_display_opt, DO_SHOW_SIGNS)));
00321   list->push_back(new DropDownListCheckedItem(STR_SETTINGS_MENU_FULL_ANIMATION,          OME_FULL_ANIMATION, false, HasBit(_display_opt, DO_FULL_ANIMATION)));
00322   list->push_back(new DropDownListCheckedItem(STR_SETTINGS_MENU_FULL_DETAIL,             OME_FULL_DETAILS, false, HasBit(_display_opt, DO_FULL_DETAIL)));
00323   list->push_back(new DropDownListCheckedItem(STR_SETTINGS_MENU_TRANSPARENT_BUILDINGS,   OME_TRANSPARENTBUILDINGS, false, IsTransparencySet(TO_HOUSES)));
00324   list->push_back(new DropDownListCheckedItem(STR_SETTINGS_MENU_TRANSPARENT_SIGNS,       OME_SHOW_STATIONSIGNS, false, IsTransparencySet(TO_SIGNS)));
00325 
00326   ShowDropDownList(w, list, 0, TBN_SETTINGS, 140, true, true);
00327   SndPlayFx(SND_15_BEEP);
00328   return CBF_NONE;
00329 }
00330 
00331 static CallBackFunction MenuClickSettings(int index)
00332 {
00333   switch (index) {
00334     case OME_GAMEOPTIONS:          ShowGameOptions();                               return CBF_NONE;
00335     case OME_DIFFICULTIES:         ShowGameDifficulty();                            return CBF_NONE;
00336     case OME_SETTINGS:             ShowGameSettings();                              return CBF_NONE;
00337     case OME_AI_SETTINGS:          ShowAIConfigWindow();                            return CBF_NONE;
00338     case OME_NEWGRFSETTINGS:       ShowNewGRFSettings(!_networking && _settings_client.gui.UserIsAllowedToChangeNewGRFs(), true, true, &_grfconfig); return CBF_NONE;
00339     case OME_TRANSPARENCIES:       ShowTransparencyToolbar();                       break;
00340 
00341     case OME_SHOW_TOWNNAMES:       ToggleBit(_display_opt, DO_SHOW_TOWN_NAMES);     break;
00342     case OME_SHOW_STATIONNAMES:    ToggleBit(_display_opt, DO_SHOW_STATION_NAMES);  break;
00343     case OME_SHOW_WAYPOINTNAMES:   ToggleBit(_display_opt, DO_SHOW_WAYPOINT_NAMES); break;
00344     case OME_SHOW_SIGNS:           ToggleBit(_display_opt, DO_SHOW_SIGNS);          break;
00345     case OME_FULL_ANIMATION:       ToggleBit(_display_opt, DO_FULL_ANIMATION);      break;
00346     case OME_FULL_DETAILS:         ToggleBit(_display_opt, DO_FULL_DETAIL);         break;
00347     case OME_TRANSPARENTBUILDINGS: ToggleTransparency(TO_HOUSES);                   break;
00348     case OME_SHOW_STATIONSIGNS:    ToggleTransparency(TO_SIGNS);                    break;
00349   }
00350   MarkWholeScreenDirty();
00351   return CBF_NONE;
00352 }
00353 
00354 /* --- Saving/loading button menu --- */
00355 
00356 enum SaveLoadEditorMenuEntries {
00357   SLEME_SAVE_SCENARIO   = 0,
00358   SLEME_LOAD_SCENARIO,
00359   SLEME_LOAD_HEIGHTMAP,
00360   SLEME_EXIT_TOINTRO,
00361   SLEME_EXIT_GAME       = 5,
00362   SLEME_MENUCOUNT,
00363 };
00364 
00365 enum SaveLoadNormalMenuEntries {
00366   SLNME_SAVE_GAME   = 0,
00367   SLNME_LOAD_GAME,
00368   SLNME_EXIT_TOINTRO,
00369   SLNME_EXIT_GAME,
00370   SLNME_MENUCOUNT,
00371 };
00372 
00373 static CallBackFunction ToolbarSaveClick(Window *w)
00374 {
00375   PopupMainToolbMenu(w, TBN_SAVEGAME, STR_FILE_MENU_SAVE_GAME, SLNME_MENUCOUNT);
00376   return CBF_NONE;
00377 }
00378 
00379 static CallBackFunction ToolbarScenSaveOrLoad(Window *w)
00380 {
00381   PopupMainToolbMenu(w, TBSE_SAVESCENARIO, STR_SCENEDIT_FILE_MENU_SAVE_SCENARIO, SLEME_MENUCOUNT);
00382   return CBF_NONE;
00383 }
00384 
00385 static CallBackFunction MenuClickSaveLoad(int index = 0)
00386 {
00387   if (_game_mode == GM_EDITOR) {
00388     switch (index) {
00389       case SLEME_SAVE_SCENARIO:  ShowSaveLoadDialog(SLD_SAVE_SCENARIO);  break;
00390       case SLEME_LOAD_SCENARIO:  ShowSaveLoadDialog(SLD_LOAD_SCENARIO);  break;
00391       case SLEME_LOAD_HEIGHTMAP: ShowSaveLoadDialog(SLD_LOAD_HEIGHTMAP); break;
00392       case SLEME_EXIT_TOINTRO:   AskExitToGameMenu();                    break;
00393       case SLEME_EXIT_GAME:      HandleExitGameRequest();                break;
00394     }
00395   } else {
00396     switch (index) {
00397       case SLNME_SAVE_GAME:      ShowSaveLoadDialog(SLD_SAVE_GAME); break;
00398       case SLNME_LOAD_GAME:      ShowSaveLoadDialog(SLD_LOAD_GAME); break;
00399       case SLNME_EXIT_TOINTRO:   AskExitToGameMenu();               break;
00400       case SLNME_EXIT_GAME:      HandleExitGameRequest();           break;
00401     }
00402   }
00403   return CBF_NONE;
00404 }
00405 
00406 /* --- Map button menu --- */
00407 
00408 enum MapMenuEntries {
00409   MME_SHOW_SMALLMAP        = 0,
00410   MME_SHOW_EXTRAVIEWPORTS,
00411   MME_SHOW_LINKGRAPH,
00412   MME_SHOW_SIGNLISTS,
00413   MME_SHOW_TOWNDIRECTORY,    
00414   MME_MENUCOUNT_NORMAL     = 4,
00415   MME_MENUCOUNT_EDITOR     = 5,
00416 };
00417 
00418 static CallBackFunction ToolbarMapClick(Window *w)
00419 {
00420   PopupMainToolbMenu(w, TBN_SMALLMAP, STR_MAP_MENU_MAP_OF_WORLD, MME_MENUCOUNT_NORMAL);
00421   return CBF_NONE;
00422 }
00423 
00424 static CallBackFunction ToolbarScenMapTownDir(Window *w)
00425 {
00426   PopupMainToolbMenu(w, TBSE_SMALLMAP, STR_MAP_MENU_MAP_OF_WORLD, MME_MENUCOUNT_EDITOR);
00427   return CBF_NONE;
00428 }
00429 
00430 static CallBackFunction MenuClickMap(int index)
00431 {
00432   switch (index) {
00433     case MME_SHOW_SMALLMAP:       ShowSmallMap();            break;
00434     case MME_SHOW_EXTRAVIEWPORTS: ShowExtraViewPortWindow(); break;
00435     case MME_SHOW_LINKGRAPH:      ShowLinkGraphLegend();     break;
00436     case MME_SHOW_SIGNLISTS:      ShowSignList();            break;
00437     case MME_SHOW_TOWNDIRECTORY:  if (_game_mode == GM_EDITOR) ShowTownDirectory(); break;
00438   }
00439   return CBF_NONE;
00440 }
00441 
00442 /* --- Town button menu --- */
00443 
00444 static CallBackFunction ToolbarTownClick(Window *w)
00445 {
00446   PopupMainToolbMenu(w, TBN_TOWNDIRECTORY, STR_TOWN_MENU_TOWN_DIRECTORY, (_settings_game.economy.found_town == TF_FORBIDDEN) ? 1 : 2);
00447   return CBF_NONE;
00448 }
00449 
00450 static CallBackFunction MenuClickTown(int index)
00451 {
00452   switch (index) {
00453     case 0: ShowTownDirectory(); break;
00454     case 1: // setting could be changed when the dropdown was open
00455       if (_settings_game.economy.found_town != TF_FORBIDDEN) ShowFoundTownWindow();
00456       break;
00457   }
00458   return CBF_NONE;
00459 }
00460 
00461 /* --- Subidies button menu --- */
00462 
00463 static CallBackFunction ToolbarSubsidiesClick(Window *w)
00464 {
00465   PopupMainToolbMenu(w, TBN_SUBSIDIES, STR_SUBSIDIES_MENU_SUBSIDIES, 1);
00466   return CBF_NONE;
00467 }
00468 
00469 static CallBackFunction MenuClickSubsidies(int index)
00470 {
00471   ShowSubsidiesList();
00472   return CBF_NONE;
00473 }
00474 
00475 /* --- Stations button menu --- */
00476 
00477 static CallBackFunction ToolbarStationsClick(Window *w)
00478 {
00479   PopupMainCompanyToolbMenu(w, TBN_STATIONS);
00480   return CBF_NONE;
00481 }
00482 
00483 static CallBackFunction MenuClickStations(int index)
00484 {
00485   ShowCompanyStations((CompanyID)index);
00486   return CBF_NONE;
00487 }
00488 
00489 /* --- Finances button menu --- */
00490 
00491 static CallBackFunction ToolbarFinancesClick(Window *w)
00492 {
00493   PopupMainCompanyToolbMenu(w, TBN_FINANCES);
00494   return CBF_NONE;
00495 }
00496 
00497 static CallBackFunction MenuClickFinances(int index)
00498 {
00499   ShowCompanyFinances((CompanyID)index);
00500   return CBF_NONE;
00501 }
00502 
00503 /* --- Company's button menu --- */
00504 
00505 static CallBackFunction ToolbarCompaniesClick(Window *w)
00506 {
00507   PopupMainCompanyToolbMenu(w, TBN_COMPANIES);
00508   return CBF_NONE;
00509 }
00510 
00511 static CallBackFunction MenuClickCompany(int index)
00512 {
00513 #ifdef ENABLE_NETWORK
00514   if (_networking) {
00515     switch (index) {
00516       case CTMN_CLIENT_LIST:
00517         ShowClientList();
00518         return CBF_NONE;
00519 
00520       case CTMN_NEW_COMPANY:
00521         if (_network_server) {
00522           DoCommandP(0, 0, _network_own_client_id, CMD_COMPANY_CTRL);
00523         } else {
00524           NetworkSendCommand(0, 0, 0, CMD_COMPANY_CTRL, NULL, NULL, _local_company);
00525         }
00526         return CBF_NONE;
00527 
00528       case CTMN_SPECTATE:
00529         if (_network_server) {
00530           NetworkServerDoMove(CLIENT_ID_SERVER, COMPANY_SPECTATOR);
00531           MarkWholeScreenDirty();
00532         } else {
00533           NetworkClientRequestMove(COMPANY_SPECTATOR);
00534         }
00535         return CBF_NONE;
00536     }
00537   }
00538 #endif /* ENABLE_NETWORK */
00539   ShowCompany((CompanyID)index);
00540   return CBF_NONE;
00541 }
00542 
00543 /* --- Graphs button menu --- */
00544 
00545 static CallBackFunction ToolbarGraphsClick(Window *w)
00546 {
00547   PopupMainToolbMenu(w, TBN_GRAPHICS, STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH, (_toolbar_mode == TB_NORMAL) ? 6 : 8);
00548   return CBF_NONE;
00549 }
00550 
00551 static CallBackFunction MenuClickGraphs(int index)
00552 {
00553   switch (index) {
00554     case 0: ShowOperatingProfitGraph();    break;
00555     case 1: ShowIncomeGraph();             break;
00556     case 2: ShowDeliveredCargoGraph();     break;
00557     case 3: ShowPerformanceHistoryGraph(); break;
00558     case 4: ShowCompanyValueGraph();       break;
00559     case 5: ShowCargoPaymentRates();       break;
00560     /* functions for combined graphs/league button */
00561     case 6: ShowCompanyLeagueTable();      break;
00562     case 7: ShowPerformanceRatingDetail(); break;
00563   }
00564   return CBF_NONE;
00565 }
00566 
00567 /* --- League button menu --- */
00568 
00569 static CallBackFunction ToolbarLeagueClick(Window *w)
00570 {
00571   PopupMainToolbMenu(w, TBN_LEAGUE, STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE, 2);
00572   return CBF_NONE;
00573 }
00574 
00575 static CallBackFunction MenuClickLeague(int index)
00576 {
00577   switch (index) {
00578     case 0: ShowCompanyLeagueTable();      break;
00579     case 1: ShowPerformanceRatingDetail(); break;
00580   }
00581   return CBF_NONE;
00582 }
00583 
00584 /* --- Industries button menu --- */
00585 
00586 static CallBackFunction ToolbarIndustryClick(Window *w)
00587 {
00588   /* Disable build-industry menu if we are a spectator */
00589   PopupMainToolbMenu(w, TBN_INDUSTRIES, STR_INDUSTRY_MENU_INDUSTRY_DIRECTORY, (_local_company == COMPANY_SPECTATOR) ? 1 : 2);
00590   return CBF_NONE;
00591 }
00592 
00593 static CallBackFunction MenuClickIndustry(int index)
00594 {
00595   switch (index) {
00596     case 0: ShowIndustryDirectory();   break;
00597     case 1: ShowBuildIndustryWindow(); break;
00598   }
00599   return CBF_NONE;
00600 }
00601 
00602 /* --- Trains button menu + 1 helper function for all vehicles. --- */
00603 
00604 static void ToolbarVehicleClick(Window *w, VehicleType veh)
00605 {
00606   const Vehicle *v;
00607   int dis = ~0;
00608 
00609   FOR_ALL_VEHICLES(v) {
00610     if (v->type == veh && v->IsPrimaryVehicle()) ClrBit(dis, v->owner);
00611   }
00612   PopupMainCompanyToolbMenu(w, TBN_VEHICLESTART + veh, dis);
00613 }
00614 
00615 
00616 static CallBackFunction ToolbarTrainClick(Window *w)
00617 {
00618   ToolbarVehicleClick(w, VEH_TRAIN);
00619   return CBF_NONE;
00620 }
00621 
00622 static CallBackFunction MenuClickShowTrains(int index)
00623 {
00624   ShowVehicleListWindow((CompanyID)index, VEH_TRAIN);
00625   return CBF_NONE;
00626 }
00627 
00628 /* --- Road vehicle button menu --- */
00629 
00630 static CallBackFunction ToolbarRoadClick(Window *w)
00631 {
00632   ToolbarVehicleClick(w, VEH_ROAD);
00633   return CBF_NONE;
00634 }
00635 
00636 static CallBackFunction MenuClickShowRoad(int index)
00637 {
00638   ShowVehicleListWindow((CompanyID)index, VEH_ROAD);
00639   return CBF_NONE;
00640 }
00641 
00642 /* --- Ship button menu --- */
00643 
00644 static CallBackFunction ToolbarShipClick(Window *w)
00645 {
00646   ToolbarVehicleClick(w, VEH_SHIP);
00647   return CBF_NONE;
00648 }
00649 
00650 static CallBackFunction MenuClickShowShips(int index)
00651 {
00652   ShowVehicleListWindow((CompanyID)index, VEH_SHIP);
00653   return CBF_NONE;
00654 }
00655 
00656 /* --- Aircraft button menu --- */
00657 
00658 static CallBackFunction ToolbarAirClick(Window *w)
00659 {
00660   ToolbarVehicleClick(w, VEH_AIRCRAFT);
00661   return CBF_NONE;
00662 }
00663 
00664 static CallBackFunction MenuClickShowAir(int index)
00665 {
00666   ShowVehicleListWindow((CompanyID)index, VEH_AIRCRAFT);
00667   return CBF_NONE;
00668 }
00669 
00670 /* --- Zoom in button --- */
00671 
00672 static CallBackFunction ToolbarZoomInClick(Window *w)
00673 {
00674   if (DoZoomInOutWindow(ZOOM_IN, FindWindowById(WC_MAIN_WINDOW, 0))) {
00675     w->HandleButtonClick((_game_mode == GM_EDITOR) ? (byte)TBSE_ZOOMIN : (byte)TBN_ZOOMIN);
00676     SndPlayFx(SND_15_BEEP);
00677   }
00678   return CBF_NONE;
00679 }
00680 
00681 /* --- Zoom out button --- */
00682 
00683 static CallBackFunction ToolbarZoomOutClick(Window *w)
00684 {
00685   if (DoZoomInOutWindow(ZOOM_OUT, FindWindowById(WC_MAIN_WINDOW, 0))) {
00686     w->HandleButtonClick((_game_mode == GM_EDITOR) ? (byte)TBSE_ZOOMOUT : (byte)TBN_ZOOMOUT);
00687     SndPlayFx(SND_15_BEEP);
00688   }
00689   return CBF_NONE;
00690 }
00691 
00692 /* --- Rail button menu --- */
00693 
00694 static CallBackFunction ToolbarBuildRailClick(Window *w)
00695 {
00696   ShowDropDownList(w, GetRailTypeDropDownList(), _last_built_railtype, TBN_RAILS, 140, true, true);
00697   SndPlayFx(SND_15_BEEP);
00698   return CBF_NONE;
00699 }
00700 
00701 static CallBackFunction MenuClickBuildRail(int index)
00702 {
00703   _last_built_railtype = (RailType)index;
00704   ShowBuildRailToolbar(_last_built_railtype);
00705   return CBF_NONE;
00706 }
00707 
00708 /* --- Road button menu --- */
00709 
00710 static CallBackFunction ToolbarBuildRoadClick(Window *w)
00711 {
00712   const Company *c = Company::Get(_local_company);
00713   DropDownList *list = new DropDownList();
00714 
00715   /* Road is always visible and available. */
00716   list->push_back(new DropDownListStringItem(STR_ROAD_MENU_ROAD_CONSTRUCTION, ROADTYPE_ROAD, false));
00717 
00718   /* Tram is only visible when there will be a tram, and available when that has been introduced. */
00719   Engine *e;
00720   FOR_ALL_ENGINES_OF_TYPE(e, VEH_ROAD) {
00721     if (!HasBit(e->info.climates, _settings_game.game_creation.landscape)) continue;
00722     if (!HasBit(e->info.misc_flags, EF_ROAD_TRAM)) continue;
00723 
00724     list->push_back(new DropDownListStringItem(STR_ROAD_MENU_TRAM_CONSTRUCTION, ROADTYPE_TRAM, !HasBit(c->avail_roadtypes, ROADTYPE_TRAM)));
00725     break;
00726   }
00727   ShowDropDownList(w, list, _last_built_roadtype, TBN_ROADS, 140, true, true);
00728   SndPlayFx(SND_15_BEEP);
00729   return CBF_NONE;
00730 }
00731 
00732 static CallBackFunction MenuClickBuildRoad(int index)
00733 {
00734   _last_built_roadtype = (RoadType)index;
00735   ShowBuildRoadToolbar(_last_built_roadtype);
00736   return CBF_NONE;
00737 }
00738 
00739 /* --- Water button menu --- */
00740 
00741 static CallBackFunction ToolbarBuildWaterClick(Window *w)
00742 {
00743   PopupMainToolbMenu(w, TBN_WATER, STR_WATERWAYS_MENU_WATERWAYS_CONSTRUCTION, 1);
00744   return CBF_NONE;
00745 }
00746 
00747 static CallBackFunction MenuClickBuildWater(int index)
00748 {
00749   ShowBuildDocksToolbar();
00750   return CBF_NONE;
00751 }
00752 
00753 /* --- Airport button menu --- */
00754 
00755 static CallBackFunction ToolbarBuildAirClick(Window *w)
00756 {
00757   PopupMainToolbMenu(w, TBN_AIR, STR_AIRCRAFT_MENU_AIRPORT_CONSTRUCTION, 1);
00758   return CBF_NONE;
00759 }
00760 
00761 static CallBackFunction MenuClickBuildAir(int index)
00762 {
00763   ShowBuildAirToolbar();
00764   return CBF_NONE;
00765 }
00766 
00767 /* --- Forest button menu --- */
00768 
00769 static CallBackFunction ToolbarForestClick(Window *w)
00770 {
00771   PopupMainToolbMenu(w, TBN_LANDSCAPE, STR_LANDSCAPING_MENU_LANDSCAPING, 3);
00772   return CBF_NONE;
00773 }
00774 
00775 static CallBackFunction MenuClickForest(int index)
00776 {
00777   switch (index) {
00778     case 0: ShowTerraformToolbar();  break;
00779     case 1: ShowBuildTreesToolbar(); break;
00780     case 2: return SelectSignTool();
00781   }
00782   return CBF_NONE;
00783 }
00784 
00785 /* --- Music button menu --- */
00786 
00787 static CallBackFunction ToolbarMusicClick(Window *w)
00788 {
00789   PopupMainToolbMenu(w, TBN_MUSICSOUND, STR_TOOLBAR_SOUND_MUSIC, 1);
00790   return CBF_NONE;
00791 }
00792 
00793 static CallBackFunction MenuClickMusicWindow(int index)
00794 {
00795   ShowMusicWindow();
00796   return CBF_NONE;
00797 }
00798 
00799 /* --- Newspaper button menu --- */
00800 
00801 static CallBackFunction ToolbarNewspaperClick(Window *w)
00802 {
00803   PopupMainToolbMenu(w, TBN_NEWSREPORT, STR_NEWS_MENU_LAST_MESSAGE_NEWS_REPORT, 3);
00804   return CBF_NONE;
00805 }
00806 
00807 static CallBackFunction MenuClickNewspaper(int index)
00808 {
00809   switch (index) {
00810     case 0: ShowLastNewsMessage(); break;
00811     case 1: ShowMessageOptions();  break;
00812     case 2: ShowMessageHistory();  break;
00813   }
00814   return CBF_NONE;
00815 }
00816 
00817 /* --- Help button menu --- */
00818 
00819 static CallBackFunction PlaceLandBlockInfo()
00820 {
00821   if (_cursor.sprite == SPR_CURSOR_QUERY) {
00822     ResetObjectToPlace();
00823     return CBF_NONE;
00824   } else {
00825     SetObjectToPlace(SPR_CURSOR_QUERY, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0);
00826     return CBF_PLACE_LANDINFO;
00827   }
00828 }
00829 
00830 static CallBackFunction ToolbarHelpClick(Window *w)
00831 {
00832   PopupMainToolbMenu(w, TBN_HELP, STR_ABOUT_MENU_LAND_BLOCK_INFO, _settings_client.gui.newgrf_developer_tools ? 9 : 8);
00833   return CBF_NONE;
00834 }
00835 
00836 static void MenuClickSmallScreenshot()
00837 {
00838   MakeScreenshot(SC_VIEWPORT, NULL);
00839 }
00840 
00841 static void MenuClickZoomedInScreenshot()
00842 {
00843   MakeScreenshot(SC_ZOOMEDIN, NULL);
00844 }
00845 
00846 static void MenuClickWorldScreenshot()
00847 {
00848   MakeScreenshot(SC_WORLD, NULL);
00849 }
00850 
00851 static CallBackFunction MenuClickHelp(int index)
00852 {
00853   switch (index) {
00854     case 0: return PlaceLandBlockInfo();
00855     case 2: IConsoleSwitch();              break;
00856     case 3: ShowAIDebugWindow();           break;
00857     case 4: MenuClickSmallScreenshot();    break;
00858     case 5: MenuClickZoomedInScreenshot(); break;
00859     case 6: MenuClickWorldScreenshot();    break;
00860     case 7: ShowAboutWindow();             break;
00861     case 8: ShowSpriteAlignerWindow();     break;
00862   }
00863   return CBF_NONE;
00864 }
00865 
00866 /* --- Switch toolbar button --- */
00867 
00868 static CallBackFunction ToolbarSwitchClick(Window *w)
00869 {
00870   if (_toolbar_mode != TB_LOWER) {
00871     _toolbar_mode = TB_LOWER;
00872   } else {
00873     _toolbar_mode = TB_UPPER;
00874   }
00875 
00876   w->ReInit();
00877   w->SetWidgetLoweredState(TBN_SWITCHBAR, _toolbar_mode == TB_LOWER);
00878   SndPlayFx(SND_15_BEEP);
00879   return CBF_NONE;
00880 }
00881 
00882 /* --- Scenario editor specific handlers. */
00883 
00887 static CallBackFunction ToolbarScenDatePanel(Window *w)
00888 {
00889   SetDParam(0, _settings_game.game_creation.starting_year);
00890   ShowQueryString(STR_JUST_INT, STR_MAPGEN_START_DATE_QUERY_CAPT, 8, w, CS_NUMERAL, QSF_ENABLE_DEFAULT);
00891   _left_button_clicked = false;
00892   return CBF_NONE;
00893 }
00894 
00895 static CallBackFunction ToolbarScenDateBackward(Window *w)
00896 {
00897   /* don't allow too fast scrolling */
00898   if ((w->flags4 & WF_TIMEOUT_MASK) <= WF_TIMEOUT_TRIGGER) {
00899     w->HandleButtonClick(TBSE_DATEBACKWARD);
00900     w->SetDirty();
00901 
00902     _settings_game.game_creation.starting_year = Clamp(_settings_game.game_creation.starting_year - 1, MIN_YEAR, MAX_YEAR);
00903     SetDate(ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1), 0);
00904   }
00905   _left_button_clicked = false;
00906   return CBF_NONE;
00907 }
00908 
00909 static CallBackFunction ToolbarScenDateForward(Window *w)
00910 {
00911   /* don't allow too fast scrolling */
00912   if ((w->flags4 & WF_TIMEOUT_MASK) <= WF_TIMEOUT_TRIGGER) {
00913     w->HandleButtonClick(TBSE_DATEFORWARD);
00914     w->SetDirty();
00915 
00916     _settings_game.game_creation.starting_year = Clamp(_settings_game.game_creation.starting_year + 1, MIN_YEAR, MAX_YEAR);
00917     SetDate(ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1), 0);
00918   }
00919   _left_button_clicked = false;
00920   return CBF_NONE;
00921 }
00922 
00923 static CallBackFunction ToolbarScenGenLand(Window *w)
00924 {
00925   w->HandleButtonClick(TBSE_LANDGENERATE);
00926   SndPlayFx(SND_15_BEEP);
00927 
00928   ShowEditorTerraformToolbar();
00929   return CBF_NONE;
00930 }
00931 
00932 
00933 static CallBackFunction ToolbarScenGenTown(Window *w)
00934 {
00935   w->HandleButtonClick(TBSE_TOWNGENERATE);
00936   SndPlayFx(SND_15_BEEP);
00937   ShowFoundTownWindow();
00938   return CBF_NONE;
00939 }
00940 
00941 static CallBackFunction ToolbarScenGenIndustry(Window *w)
00942 {
00943   w->HandleButtonClick(TBSE_INDUSTRYGENERATE);
00944   SndPlayFx(SND_15_BEEP);
00945   ShowBuildIndustryWindow();
00946   return CBF_NONE;
00947 }
00948 
00949 static CallBackFunction ToolbarScenBuildRoad(Window *w)
00950 {
00951   w->HandleButtonClick(TBSE_BUILDROAD);
00952   SndPlayFx(SND_15_BEEP);
00953   ShowBuildRoadScenToolbar();
00954   return CBF_NONE;
00955 }
00956 
00957 static CallBackFunction ToolbarScenBuildDocks(Window *w)
00958 {
00959   w->HandleButtonClick(TBSE_BUILDDOCKS);
00960   SndPlayFx(SND_15_BEEP);
00961   ShowBuildDocksScenToolbar();
00962   return CBF_NONE;
00963 }
00964 
00965 static CallBackFunction ToolbarScenPlantTrees(Window *w)
00966 {
00967   w->HandleButtonClick(TBSE_PLANTTREES);
00968   SndPlayFx(SND_15_BEEP);
00969   ShowBuildTreesToolbar();
00970   return CBF_NONE;
00971 }
00972 
00973 static CallBackFunction ToolbarScenPlaceSign(Window *w)
00974 {
00975   w->HandleButtonClick(TBSE_PLACESIGNS);
00976   SndPlayFx(SND_15_BEEP);
00977   return SelectSignTool();
00978 }
00979 
00980 static CallBackFunction ToolbarBtn_NULL(Window *w)
00981 {
00982   return CBF_NONE;
00983 }
00984 
00985 typedef CallBackFunction MenuClickedProc(int index);
00986 
00987 static MenuClickedProc * const _menu_clicked_procs[] = {
00988   NULL,                 // 0
00989   NULL,                 // 1
00990   MenuClickSettings,    // 2
00991   MenuClickSaveLoad,    // 3
00992   MenuClickMap,         // 4
00993   MenuClickTown,        // 5
00994   MenuClickSubsidies,   // 6
00995   MenuClickStations,    // 7
00996   MenuClickFinances,    // 8
00997   MenuClickCompany,     // 9
00998   MenuClickGraphs,      // 10
00999   MenuClickLeague,      // 11
01000   MenuClickIndustry,    // 12
01001   MenuClickShowTrains,  // 13
01002   MenuClickShowRoad,    // 14
01003   MenuClickShowShips,   // 15
01004   MenuClickShowAir,     // 16
01005   MenuClickMap,         // 17
01006   NULL,                 // 18
01007   MenuClickBuildRail,   // 19
01008   MenuClickBuildRoad,   // 20
01009   MenuClickBuildWater,  // 21
01010   MenuClickBuildAir,    // 22
01011   MenuClickForest,      // 23
01012   MenuClickMusicWindow, // 24
01013   MenuClickNewspaper,   // 25
01014   MenuClickHelp,        // 26
01015 };
01016 
01017 int16 *_preferred_toolbar_size = NULL; 
01018 
01020 class NWidgetToolbarContainer : public NWidgetContainer {
01021   bool visible[TBN_END]; 
01022 protected:
01023   uint spacers;          
01024 
01025 public:
01026   NWidgetToolbarContainer() : NWidgetContainer(NWID_HORIZONTAL)
01027   {
01028   }
01029 
01035   bool IsButton(WidgetType type) const
01036   {
01037     return type == WWT_IMGBTN || type == WWT_IMGBTN_2 || type == WWT_PUSHIMGBTN;
01038   }
01039 
01040   void SetupSmallestSize(Window *w, bool init_array)
01041   {
01042     this->smallest_x = 0; // Biggest child
01043     this->smallest_y = 0; // Biggest child
01044     this->fill_x = 1;
01045     this->fill_y = 0;
01046     this->resize_x = 1; // We only resize in this direction
01047     this->resize_y = 0; // We never resize in this direction
01048     this->spacers = 0;
01049 
01050     uint nbuttons = 0;
01051     /* First initialise some variables... */
01052     for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
01053       child_wid->SetupSmallestSize(w, init_array);
01054       this->smallest_y = max(this->smallest_y, child_wid->smallest_y + child_wid->padding_top + child_wid->padding_bottom);
01055       if (this->IsButton(child_wid->type)) {
01056         nbuttons++;
01057         this->smallest_x = max(this->smallest_x, child_wid->smallest_x + child_wid->padding_left + child_wid->padding_right);
01058       } else if (child_wid->type == NWID_SPACER) {
01059         this->spacers++;
01060       }
01061     }
01062 
01063     /* ... then in a second pass make sure the 'current' heights are set. Won't change ever. */
01064     for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
01065       child_wid->current_y = this->smallest_y;
01066       if (!this->IsButton(child_wid->type)) {
01067         child_wid->current_x = child_wid->smallest_x;
01068       }
01069     }
01070     *_preferred_toolbar_size = nbuttons * this->smallest_x;
01071   }
01072 
01073   void AssignSizePosition(SizingType sizing, uint x, uint y, uint given_width, uint given_height, bool rtl)
01074   {
01075     assert(given_width >= this->smallest_x && given_height >= this->smallest_y);
01076 
01077     this->pos_x = x;
01078     this->pos_y = y;
01079     this->current_x = given_width;
01080     this->current_y = given_height;
01081 
01082     /* Figure out what are the visible buttons */
01083     memset(this->visible, 0, sizeof(this->visible));
01084     uint arrangable_count, button_count, spacer_count;
01085     const byte *arrangement = GetButtonArrangement(given_width, arrangable_count, button_count, spacer_count);
01086     for (uint i = 0; i < arrangable_count; i++) {
01087       this->visible[arrangement[i]] = true;
01088     }
01089 
01090     /* Create us ourselves a quick lookup table */
01091     NWidgetBase *widgets[TBN_END];
01092     for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
01093       if (child_wid->type == NWID_SPACER) continue;
01094       widgets[((NWidgetCore*)child_wid)->index] = child_wid;
01095     }
01096 
01097     /* Now assign the widgets to their rightful place */
01098     uint position = 0; // Place to put next child relative to origin of the container.
01099     uint spacer_space = max(0, (int)given_width - (int)(button_count * this->smallest_x)); // Remaining spacing for 'spacer' widgets
01100     uint button_space = given_width - spacer_space; // Remaining spacing for the buttons
01101     uint spacer_i = 0;
01102     uint button_i = 0;
01103 
01104     /* Index into the arrangement indices. The macro lastof cannot be used here! */
01105     const byte *cur_wid = rtl ? &arrangement[arrangable_count - 1] : arrangement;
01106     for (uint i = 0; i < arrangable_count; i++) {
01107       NWidgetBase *child_wid = widgets[*cur_wid];
01108       /* If we have to give space to the spacers, do that */
01109       if (spacer_space != 0) {
01110         NWidgetBase *possible_spacer = rtl ? child_wid->next : child_wid->prev;
01111         if (possible_spacer != NULL && possible_spacer->type == NWID_SPACER) {
01112           uint add = spacer_space / (spacer_count - spacer_i);
01113           position += add;
01114           spacer_space -= add;
01115           spacer_i++;
01116         }
01117       }
01118 
01119       /* Buttons can be scaled, the others not. */
01120       if (this->IsButton(child_wid->type)) {
01121         child_wid->current_x = button_space / (button_count - button_i);
01122         button_space -= child_wid->current_x;
01123         button_i++;
01124       }
01125       child_wid->AssignSizePosition(sizing, x + position, y, child_wid->current_x, this->current_y, rtl);
01126       position += child_wid->current_x;
01127 
01128       if (rtl) {
01129         cur_wid--;
01130       } else {
01131         cur_wid++;
01132       }
01133     }
01134   }
01135 
01136   /* virtual */ void Draw(const Window *w)
01137   {
01138     /* Draw brown-red toolbar bg. */
01139     GfxFillRect(this->pos_x, this->pos_y, this->pos_x + this->current_x - 1, this->pos_y + this->current_y - 1, PC_VERY_DARK_RED);
01140     GfxFillRect(this->pos_x, this->pos_y, this->pos_x + this->current_x - 1, this->pos_y + this->current_y - 1, PC_DARK_RED, FILLRECT_CHECKER);
01141 
01142     bool rtl = _current_text_dir == TD_RTL;
01143     for (NWidgetBase *child_wid = rtl ? this->tail : this->head; child_wid != NULL; child_wid = rtl ? child_wid->prev : child_wid->next) {
01144       if (child_wid->type == NWID_SPACER) continue;
01145       if (!this->visible[((NWidgetCore*)child_wid)->index]) continue;
01146 
01147       child_wid->Draw(w);
01148     }
01149   }
01150 
01151   /* virtual */ NWidgetCore *GetWidgetFromPos(int x, int y)
01152   {
01153     if (!IsInsideBS(x, this->pos_x, this->current_x) || !IsInsideBS(y, this->pos_y, this->current_y)) return NULL;
01154 
01155     for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
01156       if (child_wid->type == NWID_SPACER) continue;
01157       if (!this->visible[((NWidgetCore*)child_wid)->index]) continue;
01158 
01159       NWidgetCore *nwid = child_wid->GetWidgetFromPos(x, y);
01160       if (nwid != NULL) return nwid;
01161     }
01162     return NULL;
01163   }
01164 
01173   virtual const byte *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const = 0;
01174 };
01175 
01177 class NWidgetMainToolbarContainer : public NWidgetToolbarContainer {
01178   /* virtual */ const byte *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const
01179   {
01180     static const uint SMALLEST_ARRANGEMENT = 14;
01181     static const uint BIGGEST_ARRANGEMENT  = 19;
01182     static const byte arrange14[] = {
01183       0,  1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 27,
01184       2,  3,  4,  5,  6,  7,  8,  9, 10, 12, 24, 25, 26, 27,
01185     };
01186     static const byte arrange15[] = {
01187       0,  1,  4, 13, 14, 15, 16, 19, 20, 21, 22, 23, 17, 18, 27,
01188       0,  2,  4,  3,  5,  6,  7,  8,  9, 10, 12, 24, 25, 26, 27,
01189     };
01190     static const byte arrange16[] = {
01191       0,  1,  2,  4, 13, 14, 15, 16, 19, 20, 21, 22, 23, 17, 18, 27,
01192       0,  1,  3,  5,  6,  7,  8,  9, 10, 12, 24, 25, 26, 17, 18, 27,
01193     };
01194     static const byte arrange17[] = {
01195       0,  1,  2,  4,  6, 13, 14, 15, 16, 19, 20, 21, 22, 23, 17, 18, 27,
01196       0,  1,  3,  4,  6,  5,  7,  8,  9, 10, 12, 24, 25, 26, 17, 18, 27,
01197     };
01198     static const byte arrange18[] = {
01199       0,  1,  2,  4,  5,  6,  7,  8,  9, 12, 19, 20, 21, 22, 23, 17, 18, 27,
01200       0,  1,  3,  4,  5,  6,  7, 10, 13, 14, 15, 16, 24, 25, 26, 17, 18, 27,
01201     };
01202     static const byte arrange19[] = {
01203       0,  1,  2,  4,  5,  6, 13, 14, 15, 16, 19, 20, 21, 22, 23, 24, 17, 18, 27,
01204       0,  1,  3,  4,  7,  8,  9, 10, 12, 25, 19, 20, 21, 22, 23, 26, 17, 18, 27,
01205     };
01206     static const byte arrange_all[] = {
01207       0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
01208     };
01209 
01210     /* If at least BIGGEST_ARRANGEMENT fit, just spread all the buttons nicely */
01211     uint full_buttons = max(CeilDiv(width, this->smallest_x), SMALLEST_ARRANGEMENT);
01212     if (full_buttons > BIGGEST_ARRANGEMENT) {
01213       button_count = arrangable_count = lengthof(arrange_all);
01214       spacer_count = this->spacers;
01215       return arrange_all;
01216     }
01217 
01218     /* Introduce the split toolbar */
01219     static const byte * const arrangements[] = { arrange14, arrange15, arrange16, arrange17, arrange18, arrange19 };
01220 
01221     button_count = arrangable_count = full_buttons;
01222     spacer_count = this->spacers;
01223     return arrangements[full_buttons - SMALLEST_ARRANGEMENT] + ((_toolbar_mode == TB_LOWER) ? full_buttons : 0);
01224   }
01225 };
01226 
01228 class NWidgetScenarioToolbarContainer : public NWidgetToolbarContainer {
01229   uint panel_widths[2]; 
01230 
01231   void SetupSmallestSize(Window *w, bool init_array)
01232   {
01233     this->NWidgetToolbarContainer::SetupSmallestSize(w, init_array);
01234 
01235     /* Find the size of panel_widths */
01236     uint i = 0;
01237     for (NWidgetBase *child_wid = this->head; child_wid != NULL; child_wid = child_wid->next) {
01238       if (child_wid->type == NWID_SPACER || this->IsButton(child_wid->type)) continue;
01239 
01240       assert(i < lengthof(this->panel_widths));
01241       this->panel_widths[i++] = child_wid->current_x;
01242       *_preferred_toolbar_size += child_wid->current_x;
01243     }
01244   }
01245 
01246   /* virtual */ const byte *GetButtonArrangement(uint &width, uint &arrangable_count, uint &button_count, uint &spacer_count) const
01247   {
01248     static const byte arrange_all[] = {
01249       0, 1, 2, 3, 4, 18, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 24, 26,
01250     };
01251     static const byte arrange_nopanel[] = {
01252       0, 1, 2, 3, 18, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 24, 26,
01253     };
01254     static const byte arrange_switch[] = {
01255       18,  8, 11, 12, 13, 14, 15, 16, 17, 27,
01256        0,  1,  2,  3, 18,  9, 10, 24, 26, 27,
01257     };
01258 
01259     /* If we can place all buttons *and* the panels, show them. */
01260     uint min_full_width = (lengthof(arrange_all) - lengthof(this->panel_widths)) * this->smallest_x + this->panel_widths[0] + this->panel_widths[1];
01261     if (width >= min_full_width) {
01262       width -= this->panel_widths[0] + this->panel_widths[1];
01263       arrangable_count = lengthof(arrange_all);
01264       button_count = arrangable_count - 2;
01265       spacer_count = this->spacers;
01266       return arrange_all;
01267     }
01268 
01269     /* Otherwise don't show the date panel and if we can't fit half the buttons and the panels anymore, split the toolbar in two */
01270     uint min_small_width = (lengthof(arrange_switch) - lengthof(this->panel_widths)) * this->smallest_x / 2 + this->panel_widths[1];
01271     if (width > min_small_width) {
01272       width -= this->panel_widths[1];
01273       arrangable_count = lengthof(arrange_nopanel);
01274       button_count = arrangable_count - 1;
01275       spacer_count = this->spacers - 1;
01276       return arrange_nopanel;
01277     }
01278 
01279     /* Split toolbar */
01280     width -= this->panel_widths[1];
01281     arrangable_count = lengthof(arrange_switch) / 2;
01282     button_count = arrangable_count - 1;
01283     spacer_count = 0;
01284     return arrange_switch + ((_toolbar_mode == TB_LOWER) ? arrangable_count : 0);
01285   }
01286 };
01287 
01288 /* --- Toolbar handling for the 'normal' case */
01289 
01290 typedef CallBackFunction ToolbarButtonProc(Window *w);
01291 
01292 static ToolbarButtonProc * const _toolbar_button_procs[] = {
01293   ToolbarPauseClick,
01294   ToolbarFastForwardClick,
01295   ToolbarOptionsClick,
01296   ToolbarSaveClick,
01297   ToolbarMapClick,
01298   ToolbarTownClick,
01299   ToolbarSubsidiesClick,
01300   ToolbarStationsClick,
01301   ToolbarFinancesClick,
01302   ToolbarCompaniesClick,
01303   ToolbarGraphsClick,
01304   ToolbarLeagueClick,
01305   ToolbarIndustryClick,
01306   ToolbarTrainClick,
01307   ToolbarRoadClick,
01308   ToolbarShipClick,
01309   ToolbarAirClick,
01310   ToolbarZoomInClick,
01311   ToolbarZoomOutClick,
01312   ToolbarBuildRailClick,
01313   ToolbarBuildRoadClick,
01314   ToolbarBuildWaterClick,
01315   ToolbarBuildAirClick,
01316   ToolbarForestClick,
01317   ToolbarMusicClick,
01318   ToolbarNewspaperClick,
01319   ToolbarHelpClick,
01320   ToolbarSwitchClick,
01321 };
01322 
01323 enum MainToolbarHotkeys {
01324   MTHK_PAUSE,
01325   MTHK_FASTFORWARD,
01326   MTHK_SETTINGS,
01327   MTHK_SAVEGAME,
01328   MTHK_LOADGAME,
01329   MTHK_SMALLMAP,
01330   MTHK_TOWNDIRECTORY,
01331   MTHK_SUBSIDIES,
01332   MTHK_STATIONS,
01333   MTHK_FINANCES,
01334   MTHK_COMPANIES,
01335   MTHK_GRAPHS,
01336   MTHK_LEAGUE,
01337   MTHK_INDUSTRIES,
01338   MTHK_TRAIN_LIST,
01339   MTHK_ROADVEH_LIST,
01340   MTHK_SHIP_LIST,
01341   MTHK_AIRCRAFT_LIST,
01342   MTHK_ZOOM_IN,
01343   MTHK_ZOOM_OUT,
01344   MTHK_BUILD_RAIL,
01345   MTHK_BUILD_ROAD,
01346   MTHK_BUILD_DOCKS,
01347   MTHK_BUILD_AIRPORT,
01348   MTHK_BUILD_TREES,
01349   MTHK_MUSIC,
01350   MTHK_AI_DEBUG,
01351   MTHK_SMALL_SCREENSHOT,
01352   MTHK_ZOOMEDIN_SCREENSHOT,
01353   MTHK_GIANT_SCREENSHOT,
01354   MTHK_CHEATS,
01355   MTHK_TERRAFORM,
01356   MTHK_EXTRA_VIEWPORT,
01357   MTHK_CLIENT_LIST,
01358   MTHK_SIGN_LIST,
01359 };
01360 
01362 struct MainToolbarWindow : Window {
01363   CallBackFunction last_started_action; 
01364 
01365   MainToolbarWindow(const WindowDesc *desc) : Window()
01366   {
01367     this->InitNested(desc, 0);
01368 
01369     this->last_started_action = CBF_NONE;
01370     CLRBITS(this->flags4, WF_WHITE_BORDER_MASK);
01371     this->SetWidgetDisabledState(TBN_PAUSE, _networking && !_network_server); // if not server, disable pause button
01372     this->SetWidgetDisabledState(TBN_FASTFORWARD, _networking); // if networking, disable fast-forward button
01373     PositionMainToolbar(this);
01374     DoZoomInOutWindow(ZOOM_NONE, this);
01375   }
01376 
01377   virtual void OnPaint()
01378   {
01379     /* If spectator, disable all construction buttons
01380      * ie : Build road, rail, ships, airports and landscaping
01381      * Since enabled state is the default, just disable when needed */
01382     this->SetWidgetsDisabledState(_local_company == COMPANY_SPECTATOR, TBN_RAILS, TBN_ROADS, TBN_WATER, TBN_AIR, TBN_LANDSCAPE, WIDGET_LIST_END);
01383     /* disable company list drop downs, if there are no companies */
01384     this->SetWidgetsDisabledState(Company::GetNumItems() == 0, TBN_STATIONS, TBN_FINANCES, TBN_TRAINS, TBN_ROADVEHS, TBN_SHIPS, TBN_AIRCRAFTS, WIDGET_LIST_END);
01385 
01386     this->SetWidgetDisabledState(TBN_RAILS, !CanBuildVehicleInfrastructure(VEH_TRAIN));
01387     this->SetWidgetDisabledState(TBN_AIR, !CanBuildVehicleInfrastructure(VEH_AIRCRAFT));
01388 
01389     this->DrawWidgets();
01390   }
01391 
01392   virtual void OnClick(Point pt, int widget, int click_count)
01393   {
01394     if (_game_mode != GM_MENU && !this->IsWidgetDisabled(widget)) _toolbar_button_procs[widget](this);
01395   }
01396 
01397   virtual void OnDropdownSelect(int widget, int index)
01398   {
01399     CallBackFunction cbf = _menu_clicked_procs[widget](index);
01400     if (cbf != CBF_NONE) this->last_started_action = cbf;
01401   }
01402 
01403   virtual EventState OnKeyPress(uint16 key, uint16 keycode)
01404   {
01405     switch (CheckHotkeyMatch(maintoolbar_hotkeys, keycode, this)) {
01406       case MTHK_PAUSE: ToolbarPauseClick(this); break;
01407       case MTHK_FASTFORWARD: ToolbarFastForwardClick(this); break;
01408       case MTHK_SETTINGS: ShowGameOptions(); break;
01409       case MTHK_SAVEGAME: MenuClickSaveLoad(); break;
01410       case MTHK_LOADGAME: ShowSaveLoadDialog(SLD_LOAD_GAME); break;
01411       case MTHK_SMALLMAP: ShowSmallMap(); break;
01412       case MTHK_TOWNDIRECTORY: ShowTownDirectory(); break;
01413       case MTHK_SUBSIDIES: ShowSubsidiesList(); break;
01414       case MTHK_STATIONS: ShowCompanyStations(_local_company); break;
01415       case MTHK_FINANCES: ShowCompanyFinances(_local_company); break;
01416       case MTHK_COMPANIES: ShowCompany(_local_company); break;
01417       case MTHK_GRAPHS: ShowOperatingProfitGraph(); break;
01418       case MTHK_LEAGUE: ShowCompanyLeagueTable(); break;
01419       case MTHK_INDUSTRIES: ShowBuildIndustryWindow(); break;
01420       case MTHK_TRAIN_LIST: ShowVehicleListWindow(_local_company, VEH_TRAIN); break;
01421       case MTHK_ROADVEH_LIST: ShowVehicleListWindow(_local_company, VEH_ROAD); break;
01422       case MTHK_SHIP_LIST: ShowVehicleListWindow(_local_company, VEH_SHIP); break;
01423       case MTHK_AIRCRAFT_LIST: ShowVehicleListWindow(_local_company, VEH_AIRCRAFT); break;
01424       case MTHK_ZOOM_IN: ToolbarZoomInClick(this); break;
01425       case MTHK_ZOOM_OUT: ToolbarZoomOutClick(this); break;
01426       case MTHK_BUILD_RAIL: if (CanBuildVehicleInfrastructure(VEH_TRAIN)) ShowBuildRailToolbar(_last_built_railtype); break;
01427       case MTHK_BUILD_ROAD: ShowBuildRoadToolbar(_last_built_roadtype); break;
01428       case MTHK_BUILD_DOCKS: ShowBuildDocksToolbar(); break;
01429       case MTHK_BUILD_AIRPORT: if (CanBuildVehicleInfrastructure(VEH_AIRCRAFT)) ShowBuildAirToolbar(); break;
01430       case MTHK_BUILD_TREES: ShowBuildTreesToolbar(); break;
01431       case MTHK_MUSIC: ShowMusicWindow(); break;
01432       case MTHK_AI_DEBUG: ShowAIDebugWindow(); break;
01433       case MTHK_SMALL_SCREENSHOT: MenuClickSmallScreenshot(); break;
01434       case MTHK_ZOOMEDIN_SCREENSHOT: MenuClickZoomedInScreenshot(); break;
01435       case MTHK_GIANT_SCREENSHOT: MenuClickWorldScreenshot(); break;
01436       case MTHK_CHEATS: if (!_networking) ShowCheatWindow(); break;
01437       case MTHK_TERRAFORM: ShowTerraformToolbar(); break;
01438       case MTHK_EXTRA_VIEWPORT: ShowExtraViewPortWindowForTileUnderCursor(); break;
01439 #ifdef ENABLE_NETWORK
01440       case MTHK_CLIENT_LIST: if (_networking) ShowClientList(); break;
01441 #endif
01442       case MTHK_SIGN_LIST: ShowSignList(); break;
01443       default: return ES_NOT_HANDLED;
01444     }
01445     return ES_HANDLED;
01446   }
01447 
01448   virtual void OnPlaceObject(Point pt, TileIndex tile)
01449   {
01450     switch (this->last_started_action) {
01451       case CBF_PLACE_SIGN:
01452         PlaceProc_Sign(tile);
01453         break;
01454 
01455       case CBF_PLACE_LANDINFO:
01456         ShowLandInfo(tile);
01457         break;
01458 
01459       default: NOT_REACHED();
01460     }
01461   }
01462 
01463   virtual void OnTick()
01464   {
01465     if (this->IsWidgetLowered(TBN_PAUSE) != !!_pause_mode) {
01466       this->ToggleWidgetLoweredState(TBN_PAUSE);
01467       this->SetWidgetDirty(TBN_PAUSE);
01468     }
01469 
01470     if (this->IsWidgetLowered(TBN_FASTFORWARD) != !!_fast_forward) {
01471       this->ToggleWidgetLoweredState(TBN_FASTFORWARD);
01472       this->SetWidgetDirty(TBN_FASTFORWARD);
01473     }
01474   }
01475 
01476   virtual void OnTimeout()
01477   {
01478     /* We do not want to automatically raise the pause, fast forward and
01479      * switchbar buttons; they have to stay down when pressed etc. */
01480     for (uint i = TBN_SETTINGS; i < TBN_SWITCHBAR; i++) {
01481       if (this->IsWidgetLowered(i)) {
01482         this->RaiseWidget(i);
01483         this->SetWidgetDirty(i);
01484       }
01485     }
01486   }
01487 
01493   virtual void OnInvalidateData(int data = 0, bool gui_scope = true)
01494   {
01495     if (!gui_scope) return;
01496     if (FindWindowById(WC_MAIN_WINDOW, 0) != NULL) HandleZoomMessage(this, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, TBN_ZOOMIN, TBN_ZOOMOUT);
01497   }
01498 
01499   static Hotkey<MainToolbarWindow> maintoolbar_hotkeys[];
01500 };
01501 
01502 const uint16 _maintoolbar_pause_keys[] = {WKC_F1, WKC_PAUSE, 0};
01503 const uint16 _maintoolbar_zoomin_keys[] = {WKC_NUM_PLUS, WKC_EQUALS, WKC_SHIFT | WKC_EQUALS, WKC_SHIFT | WKC_F5, 0};
01504 const uint16 _maintoolbar_zoomout_keys[] = {WKC_NUM_MINUS, WKC_MINUS, WKC_SHIFT | WKC_MINUS, WKC_SHIFT | WKC_F6, 0};
01505 const uint16 _maintoolbar_smallmap_keys[] = {WKC_F4, 'M', 0};
01506 
01507 Hotkey<MainToolbarWindow> MainToolbarWindow::maintoolbar_hotkeys[] = {
01508   Hotkey<MainToolbarWindow>(_maintoolbar_pause_keys, "pause", MTHK_PAUSE),
01509   Hotkey<MainToolbarWindow>((uint16)0, "fastforward", MTHK_FASTFORWARD),
01510   Hotkey<MainToolbarWindow>(WKC_F2, "settings", MTHK_SETTINGS),
01511   Hotkey<MainToolbarWindow>(WKC_F3, "saveload", MTHK_SAVEGAME),
01512   Hotkey<MainToolbarWindow>((uint16)0, "load_game", MTHK_LOADGAME),
01513   Hotkey<MainToolbarWindow>(_maintoolbar_smallmap_keys, "smallmap", MTHK_SMALLMAP),
01514   Hotkey<MainToolbarWindow>(WKC_F5, "town_list", MTHK_TOWNDIRECTORY),
01515   Hotkey<MainToolbarWindow>(WKC_F6, "subsidies", MTHK_SUBSIDIES),
01516   Hotkey<MainToolbarWindow>(WKC_F7, "station_list", MTHK_STATIONS),
01517   Hotkey<MainToolbarWindow>(WKC_F8, "finances", MTHK_FINANCES),
01518   Hotkey<MainToolbarWindow>(WKC_F9, "companies", MTHK_COMPANIES),
01519   Hotkey<MainToolbarWindow>(WKC_F10, "graphs", MTHK_GRAPHS),
01520   Hotkey<MainToolbarWindow>(WKC_F11, "league", MTHK_LEAGUE),
01521   Hotkey<MainToolbarWindow>(WKC_F12, "industry_list", MTHK_INDUSTRIES),
01522   Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F1, "train_list", MTHK_TRAIN_LIST),
01523   Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F2, "roadveh_list", MTHK_ROADVEH_LIST),
01524   Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F3, "ship_list", MTHK_SHIP_LIST),
01525   Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F4, "aircraft_list", MTHK_AIRCRAFT_LIST),
01526   Hotkey<MainToolbarWindow>(_maintoolbar_zoomin_keys, "zoomin", MTHK_ZOOM_IN),
01527   Hotkey<MainToolbarWindow>(_maintoolbar_zoomout_keys, "zoomout", MTHK_ZOOM_OUT),
01528   Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F7, "build_rail", MTHK_BUILD_RAIL),
01529   Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F8, "build_road", MTHK_BUILD_ROAD),
01530   Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F9, "build_docks", MTHK_BUILD_DOCKS),
01531   Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F10, "build_airport", MTHK_BUILD_AIRPORT),
01532   Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F11, "build_trees", MTHK_BUILD_TREES),
01533   Hotkey<MainToolbarWindow>(WKC_SHIFT | WKC_F12, "music", MTHK_MUSIC),
01534   Hotkey<MainToolbarWindow>((uint16)0, "ai_debug", MTHK_AI_DEBUG),
01535   Hotkey<MainToolbarWindow>(WKC_CTRL  | 'S', "small_screenshot", MTHK_SMALL_SCREENSHOT),
01536   Hotkey<MainToolbarWindow>(WKC_CTRL  | 'P', "zoomedin_screenshot", MTHK_ZOOMEDIN_SCREENSHOT),
01537   Hotkey<MainToolbarWindow>((uint16)0, "giant_screenshot", MTHK_GIANT_SCREENSHOT),
01538   Hotkey<MainToolbarWindow>(WKC_CTRL | WKC_ALT | 'C', "cheats", MTHK_CHEATS),
01539   Hotkey<MainToolbarWindow>('L', "terraform", MTHK_TERRAFORM),
01540   Hotkey<MainToolbarWindow>('V', "extra_viewport", MTHK_EXTRA_VIEWPORT),
01541 #ifdef ENABLE_NETWORK
01542   Hotkey<MainToolbarWindow>((uint16)0, "client_list", MTHK_CLIENT_LIST),
01543 #endif
01544   Hotkey<MainToolbarWindow>((uint16)0, "sign_list", MTHK_SIGN_LIST),
01545   HOTKEY_LIST_END(MainToolbarWindow)
01546 };
01547 Hotkey<MainToolbarWindow> *_maintoolbar_hotkeys = MainToolbarWindow::maintoolbar_hotkeys;
01548 
01549 static NWidgetBase *MakeMainToolbar(int *biggest_index)
01550 {
01552   static const SpriteID toolbar_button_sprites[] = {
01553     SPR_IMG_PAUSE,           // TBN_PAUSE
01554     SPR_IMG_FASTFORWARD,     // TBN_FASTFORWARD
01555     SPR_IMG_SETTINGS,        // TBN_SETTINGS
01556     SPR_IMG_SAVE,            // TBN_SAVEGAME
01557     SPR_IMG_SMALLMAP,        // TBN_SMALLMAP
01558     SPR_IMG_TOWN,            // TBN_TOWNDIRECTORY
01559     SPR_IMG_SUBSIDIES,       // TBN_SUBSIDIES
01560     SPR_IMG_COMPANY_LIST,    // TBN_STATIONS
01561     SPR_IMG_COMPANY_FINANCE, // TBN_FINANCES
01562     SPR_IMG_COMPANY_GENERAL, // TBN_COMPANIES
01563     SPR_IMG_GRAPHS,          // TBN_GRAPHICS
01564     SPR_IMG_COMPANY_LEAGUE,  // TBN_LEAGUE
01565     SPR_IMG_INDUSTRY,        // TBN_INDUSTRIES
01566     SPR_IMG_TRAINLIST,       // TBN_TRAINS
01567     SPR_IMG_TRUCKLIST,       // TBN_ROADVEHS
01568     SPR_IMG_SHIPLIST,        // TBN_SHIPS
01569     SPR_IMG_AIRPLANESLIST,   // TBN_AIRCRAFTS
01570     SPR_IMG_ZOOMIN,          // TBN_ZOOMIN
01571     SPR_IMG_ZOOMOUT,         // TBN_ZOOMOUT
01572     SPR_IMG_BUILDRAIL,       // TBN_RAILS
01573     SPR_IMG_BUILDROAD,       // TBN_ROADS
01574     SPR_IMG_BUILDWATER,      // TBN_WATER
01575     SPR_IMG_BUILDAIR,        // TBN_AIR
01576     SPR_IMG_LANDSCAPING,     // TBN_LANDSCAPE
01577     SPR_IMG_MUSIC,           // TBN_MUSICSOUND
01578     SPR_IMG_MESSAGES,        // TBN_NEWSREPORT
01579     SPR_IMG_QUERY,           // TBN_HELP
01580     SPR_IMG_SWITCH_TOOLBAR,  // TBN_SWITCHBAR
01581   };
01582 
01583   NWidgetMainToolbarContainer *hor = new NWidgetMainToolbarContainer();
01584   for (uint i = 0; i < TBN_END; i++) {
01585     switch (i) {
01586       case 4: case 8: case 13: case 17: case 19: case 24: hor->Add(new NWidgetSpacer(0, 0)); break;
01587     }
01588     hor->Add(new NWidgetLeaf(i == TBN_SAVEGAME ? WWT_IMGBTN_2 : WWT_IMGBTN, COLOUR_GREY, i, toolbar_button_sprites[i], STR_TOOLBAR_TOOLTIP_PAUSE_GAME + i));
01589   }
01590 
01591   *biggest_index = max<int>(*biggest_index, TBN_SWITCHBAR);
01592   return hor;
01593 }
01594 
01595 static const NWidgetPart _nested_toolbar_normal_widgets[] = {
01596   NWidgetFunction(MakeMainToolbar),
01597 };
01598 
01599 static WindowDesc _toolb_normal_desc(
01600   WDP_MANUAL, 640, 22,
01601   WC_MAIN_TOOLBAR, WC_NONE,
01602   WDF_NO_FOCUS,
01603   _nested_toolbar_normal_widgets, lengthof(_nested_toolbar_normal_widgets)
01604 );
01605 
01606 
01607 /* --- Toolbar handling for the scenario editor */
01608 
01609 static ToolbarButtonProc * const _scen_toolbar_button_procs[] = {
01610   ToolbarPauseClick,
01611   ToolbarFastForwardClick,
01612   ToolbarOptionsClick,
01613   ToolbarScenSaveOrLoad,
01614   ToolbarBtn_NULL,
01615   ToolbarScenDatePanel,
01616   ToolbarScenDateBackward,
01617   ToolbarScenDateForward,
01618   ToolbarScenMapTownDir,
01619   ToolbarZoomInClick,
01620   ToolbarZoomOutClick,
01621   ToolbarScenGenLand,
01622   ToolbarScenGenTown,
01623   ToolbarScenGenIndustry,
01624   ToolbarScenBuildRoad,
01625   ToolbarScenBuildDocks,
01626   ToolbarScenPlantTrees,
01627   ToolbarScenPlaceSign,
01628   ToolbarBtn_NULL,
01629   NULL,
01630   NULL,
01631   NULL,
01632   NULL,
01633   NULL,
01634   ToolbarMusicClick,
01635   NULL,
01636   ToolbarHelpClick,
01637   ToolbarSwitchClick,
01638 };
01639 
01640 enum MainToolbarEditorHotkeys {
01641   MTEHK_PAUSE,
01642   MTEHK_FASTFORWARD,
01643   MTEHK_SETTINGS,
01644   MTEHK_SAVEGAME,
01645   MTEHK_GENLAND,
01646   MTEHK_GENTOWN,
01647   MTEHK_GENINDUSTRY,
01648   MTEHK_BUILD_ROAD,
01649   MTEHK_BUILD_DOCKS,
01650   MTEHK_BUILD_TREES,
01651   MTEHK_SIGN,
01652   MTEHK_MUSIC,
01653   MTEHK_LANDINFO,
01654   MTEHK_SMALL_SCREENSHOT,
01655   MTEHK_ZOOMEDIN_SCREENSHOT,
01656   MTEHK_GIANT_SCREENSHOT,
01657   MTEHK_ZOOM_IN,
01658   MTEHK_ZOOM_OUT,
01659   MTEHK_TERRAFORM,
01660   MTEHK_SMALLMAP,
01661   MTEHK_EXTRA_VIEWPORT,
01662 };
01663 
01664 struct ScenarioEditorToolbarWindow : Window {
01665   CallBackFunction last_started_action; 
01666 
01667   ScenarioEditorToolbarWindow(const WindowDesc *desc) : Window()
01668   {
01669     this->InitNested(desc, 0);
01670 
01671     this->last_started_action = CBF_NONE;
01672     CLRBITS(this->flags4, WF_WHITE_BORDER_MASK);
01673     PositionMainToolbar(this);
01674     DoZoomInOutWindow(ZOOM_NONE, this);
01675   }
01676 
01677   virtual void OnPaint()
01678   {
01679     this->SetWidgetDisabledState(TBSE_DATEBACKWARD, _settings_game.game_creation.starting_year <= MIN_YEAR);
01680     this->SetWidgetDisabledState(TBSE_DATEFORWARD, _settings_game.game_creation.starting_year >= MAX_YEAR);
01681 
01682     this->DrawWidgets();
01683   }
01684 
01685   virtual void DrawWidget(const Rect &r, int widget) const
01686   {
01687     switch (widget) {
01688       case TBSE_DATEPANEL:
01689         SetDParam(0, ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1));
01690         DrawString(r.left, r.right, (this->height - FONT_HEIGHT_NORMAL) / 2, STR_WHITE_DATE_LONG, TC_FROMSTRING, SA_HOR_CENTER);
01691         break;
01692 
01693       case TBSE_SPACERPANEL: {
01694         int height = r.bottom - r.top;
01695         if (height > 2 * FONT_HEIGHT_NORMAL) {
01696           DrawString(r.left, r.right, (height + 1) / 2 - FONT_HEIGHT_NORMAL, STR_SCENEDIT_TOOLBAR_OPENTTD, TC_FROMSTRING, SA_HOR_CENTER);
01697           DrawString(r.left, r.right, (height + 1) / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, SA_HOR_CENTER);
01698         } else {
01699           DrawString(r.left, r.right, (height - FONT_HEIGHT_NORMAL) / 2, STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR, TC_FROMSTRING, SA_HOR_CENTER);
01700         }
01701         break;
01702       }
01703     }
01704   }
01705 
01706   virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize)
01707   {
01708     switch (widget) {
01709       case TBSE_SPACERPANEL:
01710         size->width = max(GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_OPENTTD).width, GetStringBoundingBox(STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR).width) + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT;
01711         break;
01712 
01713       case TBSE_DATEPANEL:
01714         SetDParam(0, ConvertYMDToDate(MAX_YEAR, 0, 1));
01715         *size = GetStringBoundingBox(STR_WHITE_DATE_LONG);
01716         size->height = max(size->height, GetSpriteSize(SPR_IMG_SAVE).height + WD_IMGBTN_TOP + WD_IMGBTN_BOTTOM);
01717         break;
01718     }
01719   }
01720 
01721   virtual void OnClick(Point pt, int widget, int click_count)
01722   {
01723     if (_game_mode == GM_MENU) return;
01724     CallBackFunction cbf = _scen_toolbar_button_procs[widget](this);
01725     if (cbf != CBF_NONE) this->last_started_action = cbf;
01726   }
01727 
01728   virtual void OnDropdownSelect(int widget, int index)
01729   {
01730     /* The map button is in a different location on the scenario
01731      * editor toolbar, so we need to adjust for it. */
01732     if (widget == TBSE_SMALLMAP) widget = TBN_SMALLMAP;
01733     CallBackFunction cbf = _menu_clicked_procs[widget](index);
01734     if (cbf != CBF_NONE) this->last_started_action = cbf;
01735     SndPlayFx(SND_15_BEEP);
01736   }
01737 
01738   virtual EventState OnKeyPress(uint16 key, uint16 keycode)
01739   {
01740     CallBackFunction cbf = CBF_NONE;
01741     switch (CheckHotkeyMatch(scenedit_maintoolbar_hotkeys, keycode, this)) {
01742       case MTEHK_PAUSE:               ToolbarPauseClick(this); break;
01743       case MTEHK_FASTFORWARD:         ToolbarFastForwardClick(this); break;
01744       case MTEHK_SETTINGS:            ShowGameOptions(); break;
01745       case MTEHK_SAVEGAME:            MenuClickSaveLoad(); break;
01746       case MTEHK_GENLAND:             ToolbarScenGenLand(this); break;
01747       case MTEHK_GENTOWN:             ToolbarScenGenTown(this); break;
01748       case MTEHK_GENINDUSTRY:         ToolbarScenGenIndustry(this); break;
01749       case MTEHK_BUILD_ROAD:          ToolbarScenBuildRoad(this); break;
01750       case MTEHK_BUILD_DOCKS:         ToolbarScenBuildDocks(this); break;
01751       case MTEHK_BUILD_TREES:         ToolbarScenPlantTrees(this); break;
01752       case MTEHK_SIGN:                cbf = ToolbarScenPlaceSign(this); break;
01753       case MTEHK_MUSIC:               ShowMusicWindow(); break;
01754       case MTEHK_LANDINFO:            cbf = PlaceLandBlockInfo(); break;
01755       case MTEHK_SMALL_SCREENSHOT:    MenuClickSmallScreenshot(); break;
01756       case MTEHK_ZOOMEDIN_SCREENSHOT: MenuClickZoomedInScreenshot(); break;
01757       case MTEHK_GIANT_SCREENSHOT:    MenuClickWorldScreenshot(); break;
01758       case MTEHK_ZOOM_IN:             ToolbarZoomInClick(this); break;
01759       case MTEHK_ZOOM_OUT:            ToolbarZoomOutClick(this); break;
01760       case MTEHK_TERRAFORM:           ShowEditorTerraformToolbar(); break;
01761       case MTEHK_SMALLMAP:            ShowSmallMap(); break;
01762       case MTEHK_EXTRA_VIEWPORT:      ShowExtraViewPortWindowForTileUnderCursor(); break;
01763       default: return ES_NOT_HANDLED;
01764     }
01765     if (cbf != CBF_NONE) this->last_started_action = cbf;
01766     return ES_HANDLED;
01767   }
01768 
01769   virtual void OnPlaceObject(Point pt, TileIndex tile)
01770   {
01771     switch (this->last_started_action) {
01772       case CBF_PLACE_SIGN:
01773         PlaceProc_Sign(tile);
01774         break;
01775 
01776       case CBF_PLACE_LANDINFO:
01777         ShowLandInfo(tile);
01778         break;
01779 
01780       default: NOT_REACHED();
01781     }
01782   }
01783 
01784   virtual void OnTimeout()
01785   {
01786     this->SetWidgetsLoweredState(false, TBSE_DATEBACKWARD, TBSE_DATEFORWARD, WIDGET_LIST_END);
01787     this->SetWidgetDirty(TBSE_DATEBACKWARD);
01788     this->SetWidgetDirty(TBSE_DATEFORWARD);
01789   }
01790 
01791   virtual void OnTick()
01792   {
01793     if (this->IsWidgetLowered(TBSE_PAUSE) != !!_pause_mode) {
01794       this->ToggleWidgetLoweredState(TBSE_PAUSE);
01795       this->SetDirty();
01796     }
01797 
01798     if (this->IsWidgetLowered(TBSE_FASTFORWARD) != !!_fast_forward) {
01799       this->ToggleWidgetLoweredState(TBSE_FASTFORWARD);
01800       this->SetDirty();
01801     }
01802   }
01803 
01809   virtual void OnInvalidateData(int data = 0, bool gui_scope = true)
01810   {
01811     if (!gui_scope) return;
01812     if (FindWindowById(WC_MAIN_WINDOW, 0) != NULL) HandleZoomMessage(this, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, TBSE_ZOOMIN, TBSE_ZOOMOUT);
01813   }
01814 
01815   virtual void OnQueryTextFinished(char *str)
01816   {
01817     /* Was 'cancel' pressed? */
01818     if (str == NULL) return;
01819 
01820     int32 value;
01821     if (!StrEmpty(str)) {
01822       value = atoi(str);
01823     } else {
01824       /* An empty string means revert to the default */
01825       value = DEF_START_YEAR;
01826     }
01827     _settings_game.game_creation.starting_year = Clamp(value, MIN_YEAR, MAX_YEAR);
01828     SetDate(ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1), 0);
01829 
01830     this->SetDirty();
01831   }
01832 
01833   static Hotkey<ScenarioEditorToolbarWindow> scenedit_maintoolbar_hotkeys[];
01834 };
01835 
01836 Hotkey<ScenarioEditorToolbarWindow> ScenarioEditorToolbarWindow::scenedit_maintoolbar_hotkeys[] = {
01837   Hotkey<ScenarioEditorToolbarWindow>(_maintoolbar_pause_keys, "pause", MTEHK_PAUSE),
01838   Hotkey<ScenarioEditorToolbarWindow>((uint16)0, "fastforward", MTEHK_FASTFORWARD),
01839   Hotkey<ScenarioEditorToolbarWindow>(WKC_F2, "settings", MTEHK_SETTINGS),
01840   Hotkey<ScenarioEditorToolbarWindow>(WKC_F3, "saveload", MTEHK_SAVEGAME),
01841   Hotkey<ScenarioEditorToolbarWindow>(WKC_F4, "gen_land", MTEHK_GENLAND),
01842   Hotkey<ScenarioEditorToolbarWindow>(WKC_F5, "gen_town", MTEHK_GENTOWN),
01843   Hotkey<ScenarioEditorToolbarWindow>(WKC_F6, "gen_industry", MTEHK_GENINDUSTRY),
01844   Hotkey<ScenarioEditorToolbarWindow>(WKC_F7, "build_road", MTEHK_BUILD_ROAD),
01845   Hotkey<ScenarioEditorToolbarWindow>(WKC_F8, "build_docks", MTEHK_BUILD_DOCKS),
01846   Hotkey<ScenarioEditorToolbarWindow>(WKC_F9, "build_trees", MTEHK_BUILD_TREES),
01847   Hotkey<ScenarioEditorToolbarWindow>(WKC_F10, "build_sign", MTEHK_SIGN),
01848   Hotkey<ScenarioEditorToolbarWindow>(WKC_F11, "music", MTEHK_MUSIC),
01849   Hotkey<ScenarioEditorToolbarWindow>(WKC_F12, "land_info", MTEHK_LANDINFO),
01850   Hotkey<ScenarioEditorToolbarWindow>(WKC_CTRL  | 'S', "small_screenshot", MTEHK_SMALL_SCREENSHOT),
01851   Hotkey<ScenarioEditorToolbarWindow>(WKC_CTRL  | 'P', "zoomedin_screenshot", MTEHK_ZOOMEDIN_SCREENSHOT),
01852   Hotkey<ScenarioEditorToolbarWindow>((uint16)0, "giant_screenshot", MTEHK_GIANT_SCREENSHOT),
01853   Hotkey<ScenarioEditorToolbarWindow>(_maintoolbar_zoomin_keys, "zoomin", MTEHK_ZOOM_IN),
01854   Hotkey<ScenarioEditorToolbarWindow>(_maintoolbar_zoomout_keys, "zoomout", MTEHK_ZOOM_OUT),
01855   Hotkey<ScenarioEditorToolbarWindow>('L', "terraform", MTEHK_TERRAFORM),
01856   Hotkey<ScenarioEditorToolbarWindow>('M', "smallmap", MTEHK_SMALLMAP),
01857   Hotkey<ScenarioEditorToolbarWindow>('V', "extra_viewport", MTEHK_EXTRA_VIEWPORT),
01858   HOTKEY_LIST_END(ScenarioEditorToolbarWindow)
01859 };
01860 Hotkey<ScenarioEditorToolbarWindow> *_scenedit_maintoolbar_hotkeys = ScenarioEditorToolbarWindow::scenedit_maintoolbar_hotkeys;
01861 
01862 static const NWidgetPart _nested_toolb_scen_inner_widgets[] = {
01863   NWidget(WWT_IMGBTN, COLOUR_GREY, TBSE_PAUSE), SetDataTip(SPR_IMG_PAUSE, STR_TOOLBAR_TOOLTIP_PAUSE_GAME),
01864   NWidget(WWT_IMGBTN, COLOUR_GREY, TBSE_FASTFORWARD), SetDataTip(SPR_IMG_FASTFORWARD, STR_TOOLBAR_TOOLTIP_FORWARD),
01865   NWidget(WWT_IMGBTN, COLOUR_GREY, TBSE_SETTINGS), SetDataTip(SPR_IMG_SETTINGS, STR_TOOLBAR_TOOLTIP_OPTIONS),
01866   NWidget(WWT_IMGBTN_2, COLOUR_GREY, TBSE_SAVESCENARIO), SetDataTip(SPR_IMG_SAVE, STR_SCENEDIT_TOOLBAR_TOOLTIP_SAVE_SCENARIO_LOAD_SCENARIO),
01867   NWidget(NWID_SPACER),
01868   NWidget(WWT_PANEL, COLOUR_GREY, TBSE_SPACERPANEL), EndContainer(),
01869   NWidget(NWID_SPACER),
01870   NWidget(WWT_PANEL, COLOUR_GREY, TBSE_DATEPANEL_CONTAINER),
01871     NWidget(NWID_HORIZONTAL), SetPIP(3, 2, 3),
01872       NWidget(WWT_IMGBTN, COLOUR_GREY, TBSE_DATEBACKWARD), SetDataTip(SPR_ARROW_DOWN, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD),
01873       NWidget(WWT_EMPTY, COLOUR_GREY, TBSE_DATEPANEL), SetDataTip(STR_NULL, STR_SCENEDIT_TOOLBAR_TOOLTIP_SET_DATE),
01874       NWidget(WWT_IMGBTN, COLOUR_GREY, TBSE_DATEFORWARD), SetDataTip(SPR_ARROW_UP, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD),
01875     EndContainer(),
01876   EndContainer(),
01877   NWidget(NWID_SPACER),
01878   NWidget(WWT_IMGBTN, COLOUR_GREY, TBSE_SMALLMAP), SetDataTip(SPR_IMG_SMALLMAP, STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY),
01879   NWidget(NWID_SPACER),
01880   NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, TBSE_ZOOMIN), SetDataTip(SPR_IMG_ZOOMIN, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN),
01881   NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, TBSE_ZOOMOUT), SetDataTip(SPR_IMG_ZOOMOUT, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT),
01882   NWidget(NWID_SPACER),
01883   NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, TBSE_LANDGENERATE), SetDataTip(SPR_IMG_LANDSCAPING, STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION),
01884   NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, TBSE_TOWNGENERATE), SetDataTip(SPR_IMG_TOWN, STR_SCENEDIT_TOOLBAR_TOWN_GENERATION),
01885   NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, TBSE_INDUSTRYGENERATE), SetDataTip(SPR_IMG_INDUSTRY, STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION),
01886   NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, TBSE_BUILDROAD), SetDataTip(SPR_IMG_BUILDROAD, STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION),
01887   NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, TBSE_BUILDDOCKS), SetDataTip(SPR_IMG_BUILDWATER, STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS),
01888   NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, TBSE_PLANTTREES), SetDataTip(SPR_IMG_PLANTTREES, STR_SCENEDIT_TOOLBAR_PLANT_TREES),
01889   NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, TBSE_PLACESIGNS), SetDataTip(SPR_IMG_SIGN, STR_SCENEDIT_TOOLBAR_PLACE_SIGN),
01890   NWidget(NWID_SPACER),
01891   NWidget(WWT_IMGBTN, COLOUR_GREY, TBN_MUSICSOUND), SetDataTip(SPR_IMG_MUSIC, STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW),
01892   NWidget(WWT_IMGBTN, COLOUR_GREY, TBN_HELP), SetDataTip(SPR_IMG_QUERY, STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION),
01893   NWidget(WWT_IMGBTN, COLOUR_GREY, TBN_SWITCHBAR), SetDataTip(SPR_IMG_SWITCH_TOOLBAR, STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR),
01894 };
01895 
01896 static NWidgetBase *MakeScenarioToolbar(int *biggest_index)
01897 {
01898   return MakeNWidgets(_nested_toolb_scen_inner_widgets, lengthof(_nested_toolb_scen_inner_widgets), biggest_index, new NWidgetScenarioToolbarContainer());
01899 }
01900 
01901 static const NWidgetPart _nested_toolb_scen_widgets[] = {
01902   NWidgetFunction(MakeScenarioToolbar),
01903 };
01904 
01905 static WindowDesc _toolb_scen_desc(
01906   WDP_MANUAL, 640, 22,
01907   WC_MAIN_TOOLBAR, WC_NONE,
01908   WDF_UNCLICK_BUTTONS | WDF_NO_FOCUS,
01909   _nested_toolb_scen_widgets, lengthof(_nested_toolb_scen_widgets)
01910 );
01911 
01913 void AllocateToolbar()
01914 {
01915   /* Clean old GUI values; railtype is (re)set by rail_gui.cpp */
01916   _last_built_roadtype = ROADTYPE_ROAD;
01917 
01918   if (_game_mode == GM_EDITOR) {
01919     _preferred_toolbar_size = &_toolb_scen_desc.default_width;
01920     new ScenarioEditorToolbarWindow(&_toolb_scen_desc);
01921   } else {
01922     _preferred_toolbar_size = &_toolb_normal_desc.default_width;
01923     new MainToolbarWindow(&_toolb_normal_desc);
01924   }
01925 }

Generated on Fri May 27 04:19:51 2011 for OpenTTD by  doxygen 1.6.1