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

Generated on Sun Jun 5 04:20:05 2011 for OpenTTD by  doxygen 1.6.1