toolbar_gui.cpp

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

Generated on Sun Jan 9 16:02:03 2011 for OpenTTD by  doxygen 1.6.1