/[eiffelstudio]/branches/Eiffel_57_docking/Src/Eiffel/interface/new_graphical/windows/eb_development_window.e
ViewVC logotype

Diff of /branches/Eiffel_57_docking/Src/Eiffel/interface/new_graphical/windows/eb_development_window.e

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 50549 by neilc, Fri Apr 29 00:59:05 2005 UTC revision 50607 by manus, Mon May 2 16:17:57 2005 UTC
# Line 1720  feature -- Stone process Line 1720  feature -- Stone process
1720                                          cd.set_ok_action (agent set_stone_after_first_check (a_stone))                                          cd.set_ok_action (agent set_stone_after_first_check (a_stone))
1721                                          cd.show_modal_to_window (window)                                          cd.show_modal_to_window (window)
1722                                  end                                  end
1723                            else
1724                                    set_stone_after_first_check (a_stone)
1725                          end                          end
1726                  end                  end
1727    
1728  set_stone_after_first_check (a_stone: STONE) is          set_stone_after_first_check (a_stone: STONE) is
1729                  -- Display text associated with `a_stone', if any and if possible                          -- Display text associated with `a_stone', if any and if possible
1730          local                  local
1731                  feature_stone: FEATURE_STONE                          feature_stone: FEATURE_STONE
1732                  old_class_stone: CLASSI_STONE                          old_class_stone: CLASSI_STONE
1733                  test_stone: CLASSI_STONE                          test_stone: CLASSI_STONE
1734                  same_class: BOOLEAN                          same_class: BOOLEAN
1735                  conv_ferrst: FEATURE_ERROR_STONE                          conv_ferrst: FEATURE_ERROR_STONE
1736                  ef_stone: EXTERNAL_FILE_STONE                          ef_stone: EXTERNAL_FILE_STONE
1737          do                  do
1738                  old_class_stone ?= stone                          old_class_stone ?= stone
1739                  feature_stone ?= a_stone                          feature_stone ?= a_stone
1740                  ef_stone ?= a_stone                          ef_stone ?= a_stone
1741                  if old_class_stone /= Void then                          if old_class_stone /= Void then
1742                          create test_stone.make (old_class_stone.class_i)                                  create test_stone.make (old_class_stone.class_i)
1743                          same_class := test_stone.same_as (a_stone)                                  same_class := test_stone.same_as (a_stone)
1744                                  -- We need to compare classes. If `old_class_stone' is a FEATURE_STONE                                          -- We need to compare classes. If `old_class_stone' is a FEATURE_STONE
1745                                  -- `same_as' will compare features. Therefore, we need `test_stone' to be sure                                          -- `same_as' will compare features. Therefore, we need `test_stone' to be sure
1746                                  -- we have a CLASSI_STONE.                                          -- we have a CLASSI_STONE.
1747                          if same_class and then feature_stone /= Void then                                  if same_class and then feature_stone /= Void then
1748                                  same_class := False                                          same_class := False
1749                                          -- if the stone corresponding to a feature of currently opened class is dropped                                                  -- if the stone corresponding to a feature of currently opened class is dropped
1750                                          -- we attempt to scroll to the feature without asking to save the file                                                  -- we attempt to scroll to the feature without asking to save the file
1751                                          -- except if it is during a resynchronization, in which case we do not scroll at all.                                                  -- except if it is during a resynchronization, in which case we do not scroll at all.
1752                                  if editor_tool.text_area.text_is_fully_loaded then                                          if editor_tool.text_area.text_is_fully_loaded then
                                         if not during_synchronization then  
                                                 editor_tool.text_area.find_feature_named (feature_stone.feature_name)  
                                                 feature_stone_already_processed := editor_tool.text_area.found_feature  
                                         else  
                                                 feature_stone_already_processed := True  
                                         end  
                                         conv_ferrst ?= feature_stone  
                                         if feature_stone_already_processed and conv_ferrst /= Void then  
                                                         -- Scroll to the line of the error.  
1753                                                  if not during_synchronization then                                                  if not during_synchronization then
1754                                                          editor_tool.text_area.display_line_when_ready (conv_ferrst.line_number, True)                                                          editor_tool.text_area.find_feature_named (feature_stone.feature_name)
1755                                                            feature_stone_already_processed := editor_tool.text_area.found_feature
1756                                                    else
1757                                                            feature_stone_already_processed := True
1758                                                    end
1759                                                    conv_ferrst ?= feature_stone
1760                                                    if feature_stone_already_processed and conv_ferrst /= Void then
1761                                                                    -- Scroll to the line of the error.
1762                                                            if not during_synchronization then
1763                                                                    editor_tool.text_area.display_line_when_ready (conv_ferrst.line_number, True)
1764                                                            end
1765                                                  end                                                  end
1766                                          end                                          end
1767                                  end                                  end
1768                            elseif ef_stone /= Void then
1769                                    
1770                                    
1771                          end                          end
                 elseif ef_stone /= Void then  
                           
1772                                                    
1773                                    -- first, let's check if there is already something in this window
1774                                    -- if there's nothing, there's no need to save anything...
1775                            if stone = Void or else not changed or else feature_stone_already_processed or else same_class then
1776                                    set_stone_after_check (a_stone)
1777                                    feature_stone_already_processed := False
1778                            else
1779                                            -- there is something to be saved
1780                                            -- if user chooses to save, current file will be parsed
1781                                            -- if there is a syntax_error, new file is not loaded
1782                                    save_and (agent set_stone_after_check (a_stone))
1783                                    if text_saved and then not syntax_is_correct then
1784                                            text_saved := False
1785                                            during_synchronization := True
1786                                            set_stone_after_check (stone)
1787                                            during_synchronization := False
1788                                            address_manager.refresh
1789                                    end
1790                            end
1791                  end                  end
1792                    
1793                          -- first, let's check if there is already something in this window          force_stone (s: STONE) is
1794                          -- if there's nothing, there's no need to save anything...                          -- make `s' the new value of `stone', and
1795                  if stone = Void or else not changed or else feature_stone_already_processed or else same_class then                          -- change the display accordingly. Try to
1796                          set_stone_after_check (a_stone)                          -- extract a class from `s' whenever possible.
1797                          feature_stone_already_processed := False                  do
1798                  else                          if s.is_storable then
1799                                  -- there is something to be saved                                  set_stone (s)
1800                                  -- if user chooses to save, current file will be parsed                                  if not unified_stone then
1801                                  -- if there is a syntax_error, new file is not loaded                                          context_tool.advanced_set_stone (s)
1802                          save_and (agent set_stone_after_check (a_stone))                                  end
                         if text_saved and then not syntax_is_correct then  
                                 text_saved := False  
                                 during_synchronization := True  
                                 set_stone_after_check (stone)  
                                 during_synchronization := False  
                                 address_manager.refresh  
1803                          end                          end
1804                  end                  end
         end  
1805    
1806  force_stone (s: STONE) is          process_class (s: CLASSI_STONE) is
1807                  -- make `s' the new value of `stone', and                          -- Process class stone
1808                  -- change the display accordingly. Try to                  do
                 -- extract a class from `s' whenever possible.  
         do  
                 if s.is_storable then  
1809                          set_stone (s)                          set_stone (s)
1810                          if not unified_stone then                  end
1811                                  context_tool.advanced_set_stone (s)          
1812            process_feature_error (s: FEATURE_ERROR_STONE) is
1813                            -- Process feature error stone.
1814                    local
1815                            cl_stone: CLASSC_STONE
1816                            e_class: CLASS_C
1817                    do
1818                            set_default_format
1819                            e_class := s.e_feature.written_class
1820                            create cl_stone.make (e_class)
1821                            set_stone (cl_stone)
1822                            editor_tool.text_area.deselect_all
1823                            if s.line_number > 0 then
1824                                    editor_tool.text_area.highlight_selected (s.line_number, s.line_number)
1825                          end                          end
1826                  end                  end
         end  
1827    
 process_class (s: CLASSI_STONE) is  
                 -- Process class stone  
         do  
                 set_stone (s)  
         end  
   
 process_feature_error (s: FEATURE_ERROR_STONE) is  
                 -- Process feature error stone.  
         local  
                 cl_stone: CLASSC_STONE  
                 e_class: CLASS_C  
         do  
                 set_default_format  
                 e_class := s.e_feature.written_class  
                 create cl_stone.make (e_class)  
                 set_stone (cl_stone)  
                 editor_tool.text_area.deselect_all  
                 if s.line_number > 0 then  
                         editor_tool.text_area.highlight_selected (s.line_number, s.line_number)  
                 end  
         end  
   
   
 process_class_syntax (s: CL_SYNTAX_STONE) is  
                 -- Process class syntax.  
         local  
                 cl_stone: CLASSC_STONE  
         do  
                         -- call set_stone to ensure the proper class is displayed  
                 create cl_stone.make (s.e_class)  
                 set_stone (cl_stone)  
                 editor_tool.text_area.deselect_all  
                 editor_tool.text_area.highlight_when_ready (s.line, s.line)  
         end  
   
 refresh is  
                 -- Synchronize clickable elements with text, if possible.  
         do  
 --| FIXME ARNAUD  
 --                      synchronise_stone  
 --| END FIXME  
 --| FIXME XR: Refresh current display in the editor.  
                 editor_tool.text_area.update_click_list (False)  
                 update_save_symbol  
                 address_manager.refresh  
                         -- The cluster manager should already be refreshed by the window manager.  
 --                      cluster_manager.refresh  
 --                      context_tool.refresh  
         end  
   
 quick_refresh is  
                 -- Redraw the main editor's drawing area.  
         do  
                 editor_tool.text_area.refresh  
                 context_tool.quick_refresh  
         end  
   
 set_default_format is  
                 -- Default format of windows.  
 --| FIXME ARNAUD: To be implemented.  
 --              local  
 --                      f: EB_FORMATTER  
         do  
 --                      if stone /= Void then  
 --                              if stone.class_i.hide_implementation then  
 --                                      f := format_list.precompiled_default_format  
 --                              else  
 --                                      f := format_list.default_format  
 --                              end  
 --                      else  
 --                              f := format_list.default_format  
 --                      end  
 --                      set_last_format (f)  
 --| END FIXME  
         end  
   
 feature -- Resource Update  
   
 update is  
                 -- Update Current with the registered resources.  
         do  
                 lock_update  
                         -- Show/hide general toolbar  
                 if preferences.development_window_data.show_general_toolbar then  
                         show_general_toolbar_command.enable_visible  
                 else  
                         show_general_toolbar_command.disable_visible  
                 end  
   
                         -- Show/hide address toolbar  
                 if preferences.development_window_data.show_address_toolbar then  
                         show_address_toolbar_command.enable_visible  
                 else  
                         show_address_toolbar_command.disable_visible  
                 end  
   
                         -- Show/hide project toolbar  
                 if preferences.development_window_data.show_project_toolbar then  
                         show_project_toolbar_command.enable_visible  
                 else  
                         show_project_toolbar_command.disable_visible  
                 end  
   
                 left_panel.load_from_resource (preferences.development_window_data.left_panel_layout)  
                 right_panel.load_from_resource (preferences.development_window_data.right_panel_layout)  
                 splitter_position := preferences.development_window_data.left_panel_width  
                 update_splitters  
                 unlock_update  
         end  
   
 update_splitters is  
                 -- Refresh the position of the splitter on screen according to  
                 -- our internal values.  
         do  
                         -- Set the interior layout  
                 if panel.full then  
                         panel.set_split_position (splitter_position.max (panel.minimum_split_position))  
                 end  
         end  
   
 register is  
                 -- Register to preferences we want notification of.  
         do  
         end  
   
 unregister is  
                 -- unregister to preferences we want notification of.  
         do  
         end  
   
 reset is  
                 -- Reset the window contents  
         do  
                 Precursor  
                 address_manager.reset  
   
 --| FIXME ARNAUD, multiformat not yet implemented.  
 --                      format_list.enable_imp_formats_sensitive  
 --| END FIXME  
         end  
   
 rebuild_tools_menu is  
                 -- Refresh the list of external commands.  
         local  
                 ms: LIST [EB_COMMAND_MENU_ITEM]  
         do  
                         -- Remove all the external commands, which are at the end of the menu.  
                 from  
                         tools_menu.go_i_th (tools_menu.count + 1 - number_of_displayed_external_commands)  
                 until  
                         tools_menu.after  
                 loop  
                         tools_menu.remove  
                 end  
                 ms := Edit_external_commands_cmd.menus  
                 number_of_displayed_external_commands := ms.count  
                 from  
                         ms.start  
                 until  
                         ms.after  
                 loop  
                         tools_menu.extend (ms.item)  
                         add_recyclable (ms.item)  
                         ms.forth  
                 end  
         end  
   
 syntax_is_correct: BOOLEAN is  
                 -- file was successfully parsed.  
         do  
                 Result := editor_tool.text_area.syntax_is_correct  
         end  
   
 on_project_created is  
                 -- Inform tools that the current project has been loaded or re-loaded.  
         do  
                 build_menu_bar  
                 enable_commands_on_project_created  
                 context_tool.on_project_created  
                 address_manager.on_project_created  
                 if has_dll_generation then  
                         show_dynamic_lib_tool.enable_sensitive  
                 end  
                 if has_profiler then  
                         show_profiler.enable_sensitive  
                 end  
         end  
   
 on_project_loaded is  
                 -- Inform tools that the current project has been loaded or re-loaded.  
         do  
 --                      cluster_manager.on_project_loaded  
                 enable_commands_on_project_loaded  
                 cluster_tool.on_project_loaded  
                 context_tool.on_project_loaded  
         end  
   
 on_project_unloaded is  
                 -- Inform tools that the current project will soon been unloaded.  
         do  
 --                      cluster_manager.on_project_unloaded  
                 disable_commands_on_project_unloaded  
                 cluster_tool.on_project_unloaded  
                 context_tool.on_project_unloaded  
                 address_manager.on_project_unloaded  
                 build_menu_bar  
                 if has_dll_generation then  
                         show_dynamic_lib_tool.disable_sensitive  
                 end  
                 if has_profiler then  
                         show_profiler.disable_sensitive  
                 end  
         end  
   
 save_before_compiling is  
                 -- save the text but do not update clickable positions  
         do  
                 save_only := True  
                 save_text  
         end  
   
 perform_check_before_save is  
                 -- Perform any pre-save operations/checks  
         local  
                 dial: EV_CONFIRMATION_DIALOG  
         do  
                 debug ("EDITOR")  
                         if editor_tool.text_area.current_text /= Void and then changed then  
                                 io.error.put_string ("%N Warning: Attempting to save a non editable format%N")  
                         end  
                 end  
                 if changed then  
                         editor_tool.text_area.strip_unwanted_indentation  
                 end  
                 if editor_tool.text_area.open_backup then  
                         create dial.make_with_text(Warning_messages.w_Save_backup)  
                         dial.set_buttons_and_actions(<<"Continue", "Cancel">>, <<agent continue_save, agent cancel_save>>)  
                         dial.set_default_push_button(dial.button("Continue"))  
                         dial.set_default_cancel_button(dial.button("Cancel"))  
                         dial.set_title ("Save Backup")  
                         dial.show_modal_to_window (window)  
                 else  
                         check_passed := True  
                 end  
         end  
1828    
1829  continue_save is          process_class_syntax (s: CL_SYNTAX_STONE) is
1830                  -- continue saving                          -- Process class syntax.
1831          do                  local
1832                  check_passed := True                          cl_stone: CLASSC_STONE
1833          end                  do
1834                                    -- call set_stone to ensure the proper class is displayed
1835  cancel_save is                          create cl_stone.make (s.e_class)
1836                  -- cancel saving                          set_stone (cl_stone)
1837          do                          editor_tool.text_area.deselect_all
1838                  check_passed := False                          editor_tool.text_area.highlight_when_ready (s.line, s.line)
1839          end                  end
1840            
1841  process is          refresh is
1842                  -- process the user entry in the address bar                          -- Synchronize clickable elements with text, if possible.
1843          do                  do
1844                  save_canceled := False          --| FIXME ARNAUD
1845          end          --                      synchronise_stone
1846            --| END FIXME
1847  on_text_saved is          --| FIXME XR: Refresh current display in the editor.
1848                  -- Notify the editor that the text has been saved                          editor_tool.text_area.update_click_list (False)
1849          local                          update_save_symbol
1850                  str: STRING                          address_manager.refresh
1851          do                                  -- The cluster manager should already be refreshed by the window manager.
1852                  Precursor          --                      cluster_manager.refresh
1853                  editor_tool.on_text_saved          --                      context_tool.refresh
1854                  text_saved := True                  end
1855                  if not save_only then  
1856                          editor_tool.text_area.update_click_list (True)          quick_refresh is
1857                  end                          -- Redraw the main editor's drawing area.
1858                  save_only := False                  do
1859                  str := title.twin                          editor_tool.text_area.refresh
1860                  if str @ 1 = '*' then                          context_tool.quick_refresh
1861                          str.keep_tail (str.count - 2)                  end
1862                          set_title (str)  
1863                  end          set_default_format is
1864                  update_formatters                          -- Default format of windows.
1865                  if editor_tool.text_area.syntax_is_correct then          --| FIXME ARNAUD: To be implemented.
1866                          status_bar.display_message ("")          --              local
1867                  else          --                      f: EB_FORMATTER
1868                          status_bar.display_message (Interface_names.L_syntax_error)                  do
1869            --                      if stone /= Void then
1870            --                              if stone.class_i.hide_implementation then
1871            --                                      f := format_list.precompiled_default_format
1872            --                              else
1873            --                                      f := format_list.default_format
1874            --                              end
1875            --                      else
1876            --                              f := format_list.default_format
1877            --                      end
1878            --                      set_last_format (f)
1879            --| END FIXME
1880                    end
1881    
1882            feature -- Resource Update
1883    
1884            update is
1885                            -- Update Current with the registered resources.
1886                    do
1887                            lock_update
1888                                    -- Show/hide general toolbar
1889                            if preferences.development_window_data.show_general_toolbar then
1890                                    show_general_toolbar_command.enable_visible
1891                            else
1892                                    show_general_toolbar_command.disable_visible
1893                            end
1894    
1895                                    -- Show/hide address toolbar
1896                            if preferences.development_window_data.show_address_toolbar then
1897                                    show_address_toolbar_command.enable_visible
1898                            else
1899                                    show_address_toolbar_command.disable_visible
1900                            end
1901    
1902                                    -- Show/hide project toolbar
1903                            if preferences.development_window_data.show_project_toolbar then
1904                                    show_project_toolbar_command.enable_visible
1905                            else
1906                                    show_project_toolbar_command.disable_visible
1907                            end
1908    
1909                            left_panel.load_from_resource (preferences.development_window_data.left_panel_layout)
1910                            right_panel.load_from_resource (preferences.development_window_data.right_panel_layout)
1911                            splitter_position := preferences.development_window_data.left_panel_width
1912                            update_splitters
1913                            unlock_update
1914                  end                  end
                 text_edited := False  
         end  
1915    
1916  save_and (an_action: PROCEDURE [ANY, TUPLE]) is          update_splitters is
1917          local                          -- Refresh the position of the splitter on screen according to
1918                  save_dialog: EB_CONFIRM_SAVE_DIALOG                          -- our internal values.
1919          do                  do
1920                  save_canceled := True                                  -- Set the interior layout
1921                  text_saved := False                          if panel.full then
1922                  create save_dialog.make_and_launch (Current,Current)                                  panel.set_split_position (splitter_position.max (panel.minimum_split_position))
1923                  if not save_canceled and then syntax_is_correct then                          end
1924                          an_action.call(Void)                  end
                 end  
         end  
   
 feature -- Window management  
   
 show_window is  
                 -- Show the window  
         do  
                 show  
         end  
   
 raise_window is  
                 -- Show the window and set the focus to it.  
         do  
                 show  
                 --| FIXME, set the focus.  
         end  
   
 hide_window is  
                 -- Hide the window  
         do  
                 hide  
         end  
   
 destroy_window is  
                 -- Destroy the window.  
         do  
                 destroy  
         end  
   
 give_focus is  
                 -- Give the focus to the address manager.  
         do  
                 address_manager.set_focus  
         end  
           
 save_layout is  
                 -- Store layout of `current'.  
         do  
                         -- Now save the windows's layout, but only if the  
                         -- debugger is not displayed in `Current'. By saving the layout,  
                         -- we ensure that future windows may use exactly the same layout.  
                         -- If the debugger is displayed, the previopus layout is already saved,  
                         -- and this is the one that must be used, as only one debugger is ever displayed.  
                 if (Application.is_running and debugger_manager.debugging_window /= Current) or not application.is_running then  
                         preferences.development_window_data.save_left_panel_layout (left_panel.save_to_resource)  
                         preferences.development_window_data.save_right_panel_layout (right_panel.save_to_resource)  
                         preferences.development_window_data.save_left_panel_width (panel.split_position)  
                                 -- Save width & height.  
                         preferences.development_window_data.save_size (window.width, window.height, window.is_maximized)  
                 end  
                 preferences.development_window_data.save_search_tool_options (search_tool)  
                         -- Commit saves  
 --                      save_resources  
         end  
   
 feature -- Tools & Controls  
   
 editor_tool: EB_EDITOR_TOOL  
   
 favorites_tool: EB_FAVORITES_TOOL  
   
 cluster_tool: EB_CLUSTER_TOOL  
   
 search_tool: EB_SEARCH_TOOL  
   
 features_tool: EB_FEATURES_TOOL  
   
 windows_tool: EB_WINDOWS_TOOL  
   
 context_tool: EB_CONTEXT_TOOL  
                 -- Context explorer for current class and system.  
   
 address_manager: EB_ADDRESS_MANAGER  
                 -- Text field in the toolbar  
                 -- Allow user to enter the name  
                 -- of the class he wants to edit.  
   
 project_manager: EB_PROJECT_MANAGER is  
                 -- Project manager associated to the project the user is working on.  
         do  
                 Result := Eiffel_project.manager  
         end  
   
 managed_class_formatters: ARRAYED_LIST [EB_CLASS_INFO_FORMATTER]  
                 -- All formatters that operate on a class.  
1925    
1926  managed_feature_formatters: ARRAYED_LIST [EB_FEATURE_INFO_FORMATTER]          register is
1927                  -- All formatters that operate on a class.                          -- Register to preferences we want notification of.
1928                    do
1929                    end
1930    
1931  managed_main_formatters: ARRAYED_LIST [EB_CLASS_TEXT_FORMATTER]          unregister is
1932                  -- All formatters that can be displayed in the main editor frame.                          -- unregister to preferences we want notification of.
1933                    do
1934                    end
1935    
1936  unified_stone: BOOLEAN          reset is
1937                  -- Is the stone common with the context tool or not?                          -- Reset the window contents
1938                                    do
1939  arguments_dialog: EB_ARGUMENT_DIALOG                          Precursor
1940                  -- The arguments dialog for current, if any                          address_manager.reset
                   
 goto_dialog: EB_GOTO_DIALOG  
                 -- The goto dialog for line number access  
1941    
1942  feature -- Multiple editor management          --| FIXME ARNAUD, multiformat not yet implemented.
1943            --                      format_list.enable_imp_formats_sensitive
1944            --| END FIXME
1945                    end
1946    
1947  add_editor_to_list (an_editor: EB_EDITOR) is          rebuild_tools_menu is
1948                  -- adds `an_editor' to `editors'                          -- Refresh the list of external commands.
1949          do                  local
1950                  editors.extend (an_editor)                          ms: LIST [EB_COMMAND_MENU_ITEM]
1951          end                  do
1952                                    -- Remove all the external commands, which are at the end of the menu.
 current_editor: EB_EDITOR is  
                 -- current editor, if none, main editor  
         do  
                 if current_editor_index /= 0 then  
                         Result := editors @ current_editor_index  
                 else  
                         Result := editors.first  
                 end  
         end  
           
 set_current_editor (an_editor: EB_EDITOR) is  
                 -- set `an_editor' as main editor  
         local  
                 old_index: INTEGER  
                 new_index: INTEGER  
         do  
                 old_index := current_editor_index  
                 new_index := editors.index_of (an_editor, 1)  
                 if  
                         editors.valid_index (new_index) and  
                         old_index /= new_index  
                 then  
                         current_editor_index := new_index  
1953                          from                          from
1954                                  editors.start                                  tools_menu.go_i_th (tools_menu.count + 1 - number_of_displayed_external_commands)
1955                          until                          until
1956                                  editors.after                                  tools_menu.after
1957                          loop                          loop
1958                                  if editors.index /= current_editor_index and then editors.item.has_selection then                                  tools_menu.remove
1959                                          editors.item.disable_selection                          end
1960                            ms := Edit_external_commands_cmd.menus
1961                            number_of_displayed_external_commands := ms.count
1962                            from
1963                                    ms.start
1964                            until
1965                                    ms.after
1966                            loop
1967                                    tools_menu.extend (ms.item)
1968                                    add_recyclable (ms.item)
1969                                    ms.forth
1970                            end
1971                    end
1972    
1973            syntax_is_correct: BOOLEAN is
1974                            -- file was successfully parsed.
1975                    do
1976                            Result := editor_tool.text_area.syntax_is_correct
1977                    end
1978    
1979            on_project_created is
1980                            -- Inform tools that the current project has been loaded or re-loaded.
1981                    do
1982                            build_menu_bar
1983                            enable_commands_on_project_created
1984                            context_tool.on_project_created
1985                            address_manager.on_project_created
1986                            if has_dll_generation then
1987                                    show_dynamic_lib_tool.enable_sensitive
1988                            end
1989                            if has_profiler then
1990                                    show_profiler.enable_sensitive
1991                            end
1992                    end
1993    
1994            on_project_loaded is
1995                            -- Inform tools that the current project has been loaded or re-loaded.
1996                    do
1997            --                      cluster_manager.on_project_loaded
1998                            enable_commands_on_project_loaded
1999                            cluster_tool.on_project_loaded
2000                            context_tool.on_project_loaded
2001                    end
2002    
2003            on_project_unloaded is
2004                            -- Inform tools that the current project will soon been unloaded.
2005                    do
2006            --                      cluster_manager.on_project_unloaded
2007                            disable_commands_on_project_unloaded
2008                            cluster_tool.on_project_unloaded
2009                            context_tool.on_project_unloaded
2010                            address_manager.on_project_unloaded
2011                            build_menu_bar
2012                            if has_dll_generation then
2013                                    show_dynamic_lib_tool.disable_sensitive
2014                            end
2015                            if has_profiler then
2016                                    show_profiler.disable_sensitive
2017                            end
2018                    end
2019    
2020            save_before_compiling is
2021                            -- save the text but do not update clickable positions
2022                    do
2023                            save_only := True
2024                            save_text
2025                    end
2026    
2027            perform_check_before_save is
2028                            -- Perform any pre-save operations/checks
2029                    local
2030                            dial: EV_CONFIRMATION_DIALOG
2031                    do
2032                            debug ("EDITOR")
2033                                    if editor_tool.text_area.current_text /= Void and then changed then
2034                                            io.error.put_string ("%N Warning: Attempting to save a non editable format%N")
2035                                  end                                  end
                                 editors.forth  
2036                          end                          end
2037                          update_paste_cmd                          if changed then
2038                                  -- Last thing, update the menu entry for the formatting marks.                                  editor_tool.text_area.strip_unwanted_indentation
2039                          if current_editor.view_invisible_symbols then                          end
2040                                  formatting_marks_command_menu_item.set_text (Interface_names.m_Hide_formatting_marks)                          if editor_tool.text_area.open_backup then
2041                                    create dial.make_with_text(Warning_messages.w_Save_backup)
2042                                    dial.set_buttons_and_actions(<<"Continue", "Cancel">>, <<agent continue_save, agent cancel_save>>)
2043                                    dial.set_default_push_button(dial.button("Continue"))
2044                                    dial.set_default_cancel_button(dial.button("Cancel"))
2045                                    dial.set_title ("Save Backup")
2046                                    dial.show_modal_to_window (window)
2047                          else                          else
2048                                  formatting_marks_command_menu_item.set_text(Interface_names.m_Show_formatting_marks)                                  check_passed := True
2049                          end                          end
                         command_controller.set_current_editor (an_editor)  
2050                  end                  end
         end  
2051    
2052  update_paste_cmd is          continue_save is
2053                  -- Update `editor_paste_cmd'. To be performed when an editor grabs the focus.                          -- continue saving
2054          do                  do
2055                  if                          check_passed := True
2056                          not current_editor.is_empty and then                  end
2057                          current_editor.is_editable and then  
2058                          current_editor.clipboard.has_text          cancel_save is
2059                  then                          -- cancel saving
2060                          editor_paste_cmd.enable_sensitive                  do
2061                  else                          check_passed := False
2062                          editor_paste_cmd.disable_sensitive                  end
2063    
2064            process is
2065                            -- process the user entry in the address bar
2066                    do
2067                            save_canceled := False
2068                    end
2069    
2070            on_text_saved is
2071                            -- Notify the editor that the text has been saved
2072                    local
2073                            str: STRING
2074                    do
2075                            Precursor
2076                            editor_tool.on_text_saved
2077                            text_saved := True
2078                            if not save_only then
2079                                    editor_tool.text_area.update_click_list (True)
2080                            end
2081                            save_only := False
2082                            str := title.twin
2083                            if str @ 1 = '*' then
2084                                    str.keep_tail (str.count - 2)
2085                                    set_title (str)
2086                            end
2087                            update_formatters
2088                            if editor_tool.text_area.syntax_is_correct then
2089                                    status_bar.display_message ("")
2090                            else
2091                                    status_bar.display_message (Interface_names.L_syntax_error)
2092                            end
2093                            text_edited := False
2094                  end                  end
         end  
                           
 feature {NONE} -- Multiple editor management  
2095    
2096  editors: ARRAYED_LIST [EB_EDITOR]          save_and (an_action: PROCEDURE [ANY, TUPLE]) is
2097                  -- editor contained in `Current'                  local
2098                            save_dialog: EB_CONFIRM_SAVE_DIALOG
2099                    do
2100                            save_canceled := True
2101                            text_saved := False
2102                            create save_dialog.make_and_launch (Current,Current)
2103                            if not save_canceled and then syntax_is_correct then
2104                                    an_action.call(Void)
2105                            end
2106                    end
2107    
2108  current_editor_index: INTEGER          feature -- Window management
2109                  -- Index in `editors' of the editor that has the focus.  
2110                            show_window is
2111  feature {EB_FEATURES_TOOL, EB_FEATURES_TREE, DOTNET_CLASS_AS, DOTNET_CLASS_CONTEXT} -- Feature Clauses                          -- Show the window
2112                                    do
2113  set_feature_clauses (a_features: ARRAYED_LIST [DOTNET_FEATURE_CLAUSE_AS [CONSUMED_ENTITY]]; a_type: STRING) is                          show
                 -- Set 'features' to 'a_features' and store in hash table with key 'a_type' denoting name of consumed  
                 -- type pertinent to 'a_features'.  
         require  
                 a_features_not_void: a_features /= Void  
         do  
                 if feature_clauses = Void then  
                         create feature_clauses.make (5)  
2114                  end                  end
                 feature_clauses.put (a_features, a_type)  
         end  
                   
 get_feature_clauses (a_type: STRING): ARRAYED_LIST [DOTNET_FEATURE_CLAUSE_AS [CONSUMED_ENTITY]] is  
                 -- Get list of feature clauses relevant to .NET type with name 'a_type'.  
         require  
                 a_type_not_void: a_type /= Void  
                 has_type_clauses: feature_clauses.has (a_type)  
         do  
                 Result := feature_clauses.item (a_type)  
         ensure  
                 result_not_void: Result /= Void  
         end  
                   
 feature_clauses: HASH_TABLE [ARRAYED_LIST [DOTNET_FEATURE_CLAUSE_AS [CONSUMED_ENTITY]], STRING]  
                 -- List of features clauses for Current window hashed by the .NET name of the consumed_type.  
                   
 feature_positions: HASH_TABLE [INTEGER, E_FEATURE]  
                 -- Features indexed by line position in class text (for .NET features).  
2115    
2116  feature {EB_WINDOW_MANAGER} -- Window management / Implementation                raise_window is
2117                            -- Show the window and set the focus to it.
2118                    do
2119                            show
2120                            --| FIXME, set the focus.
2121                    end
2122    
2123  destroy_imp is          hide_window is
2124                  -- Destroy window.                          -- Hide the window
2125          do                  do
2126                          -- To avoid reentrance                          hide
2127                  if not is_destroying then                  end
2128                          is_destroying := True  
2129                                  -- If a launched application is still running, kill it.          destroy_window is
2130                          if Application.is_running and then debugger_manager.debugging_window = Current then                          -- Destroy the window.
2131                                  Application.kill                  do
2132                          else                          destroy
2133                    end
2134    
2135            give_focus is
2136                            -- Give the focus to the address manager.
2137                    do
2138                            address_manager.set_focus
2139                    end
2140                    
2141            save_layout is
2142                            -- Store layout of `current'.
2143                    do
2144                                    -- Now save the windows's layout, but only if the
2145                                    -- debugger is not displayed in `Current'. By saving the layout,
2146                                    -- we ensure that future windows may use exactly the same layout.
2147                                    -- If the debugger is displayed, the previopus layout is already saved,
2148                                    -- and this is the one that must be used, as only one debugger is ever displayed.
2149                            if (Application.is_running and debugger_manager.debugging_window /= Current) or not application.is_running then
2150                                  preferences.development_window_data.save_left_panel_layout (left_panel.save_to_resource)                                  preferences.development_window_data.save_left_panel_layout (left_panel.save_to_resource)
2151                                  preferences.development_window_data.save_right_panel_layout (right_panel.save_to_resource)                                  preferences.development_window_data.save_right_panel_layout (right_panel.save_to_resource)
2152                                    preferences.development_window_data.save_left_panel_width (panel.split_position)
2153                                            -- Save width & height.
2154                                    preferences.development_window_data.save_size (window.width, window.height, window.is_maximized)
2155                          end                          end
                         preferences.development_window_data.save_left_panel_width (panel.split_position)  
                                 -- Save width & height.  
                         preferences.development_window_data.save_size (window.width, window.height, window.is_maximized)  
                         left_panel.wipe_out  
                         right_panel.wipe_out  
2156                          preferences.development_window_data.save_search_tool_options (search_tool)                          preferences.development_window_data.save_search_tool_options (search_tool)
                         hide  
   
2157                                  -- Commit saves                                  -- Commit saves
2158  --                              save_resources          --                      save_resources
2159                    end
2160    
2161                          toolbars_area.wipe_out          feature -- Tools & Controls
                         address_manager.recycle  
                         project_customizable_toolbar.recycle  
                         Precursor {EB_TOOL_MANAGER}  
2162    
2163                          managed_class_formatters.wipe_out          editor_tool: EB_EDITOR_TOOL
2164                          managed_feature_formatters.wipe_out  
2165                          managed_main_formatters.wipe_out          favorites_tool: EB_FAVORITES_TOOL
2166                          toolbarable_commands.wipe_out  
2167                          editors.wipe_out          cluster_tool: EB_CLUSTER_TOOL
2168                          stone := Void  
2169                  end          search_tool: EB_SEARCH_TOOL
2170          end  
2171            features_tool: EB_FEATURES_TOOL
2172  feature {NONE} -- Implementation  
2173            windows_tool: EB_WINDOWS_TOOL
2174  set_stone_after_check (a_stone: STONE) is  
2175          local          context_tool: EB_CONTEXT_TOOL
2176                  old_stone: STONE                          -- Context explorer for current class and system.
2177                  new_class_stone: CLASSI_STONE  
2178                  old_class_stone: CLASSI_STONE          address_manager: EB_ADDRESS_MANAGER
2179                  conv_classc: CLASSC_STONE                          -- Text field in the toolbar
2180                  conv_brkstone: BREAKABLE_STONE                          -- Allow user to enter the name
2181                  cluster_st: CLUSTER_STONE                          -- of the class he wants to edit.
2182                  feature_stone: FEATURE_STONE  
2183                  conv_ferrst: FEATURE_ERROR_STONE          project_manager: EB_PROJECT_MANAGER is
2184                                            -- Project manager associated to the project the user is working on.
2185                  ef_stone: EXTERNAL_FILE_STONE                  do
2186                  f: FILE                          Result := Eiffel_project.manager
2187                    end
2188    
2189            managed_class_formatters: ARRAYED_LIST [EB_CLASS_INFO_FORMATTER]
2190                            -- All formatters that operate on a class.
2191    
2192            managed_feature_formatters: ARRAYED_LIST [EB_FEATURE_INFO_FORMATTER]
2193                            -- All formatters that operate on a class.
2194    
2195            managed_main_formatters: ARRAYED_LIST [EB_CLASS_TEXT_FORMATTER]
2196                            -- All formatters that can be displayed in the main editor frame.
2197    
2198            unified_stone: BOOLEAN
2199                            -- Is the stone common with the context tool or not?
2200                            
2201            arguments_dialog: EB_ARGUMENT_DIALOG
2202                            -- The arguments dialog for current, if any
2203                            
2204            goto_dialog: EB_GOTO_DIALOG
2205                            -- The goto dialog for line number access
2206    
2207            feature -- Multiple editor management
2208    
2209            add_editor_to_list (an_editor: EB_EDITOR) is
2210                            -- adds `an_editor' to `editors'
2211                    do
2212                            editors.extend (an_editor)
2213                    end
2214    
2215            current_editor: EB_EDITOR is
2216                            -- current editor, if none, main editor
2217                    do
2218                            if current_editor_index /= 0 then
2219                                    Result := editors @ current_editor_index
2220                            else
2221                                    Result := editors.first
2222                            end
2223                    end
2224                                    
2225                  l_format_context: FORMAT_CONTEXT          set_current_editor (an_editor: EB_EDITOR) is
2226                  l_indexes: EIFFEL_LIST [INDEX_AS]                          -- set `an_editor' as main editor
2227                  conv_errst: ERROR_STONE                  local
2228                  class_file: RAW_FILE                          old_index: INTEGER
2229                  class_text_exists: BOOLEAN                          new_index: INTEGER
2230                  same_class: BOOLEAN                  do
2231                  test_stone: CLASSI_STONE                          old_index := current_editor_index
2232                  conv_ace: ACE_SYNTAX_STONE                          new_index := editors.index_of (an_editor, 1)
2233                  externali: EXTERNAL_CLASS_I                          if
2234                  l_reader: EIFFEL_XML_DESERIALIZER                                  editors.valid_index (new_index) and
2235                  external_cons: CONSUMED_TYPE                                  old_index /= new_index
2236                  str: STRING                          then
2237                  dotnet_class: BOOLEAN                                  current_editor_index := new_index
2238                  l_short_formatter: EB_SHORT_FORMATTER                                  from
2239                  l_flat_formatter: EB_FLAT_SHORT_FORMATTER                                          editors.start
2240          do                                  until
2241                          -- the text does not change if the text was saved with syntax errors                                          editors.after
2242                  cur_wid := window                                  loop
2243                  if cur_wid = Void then                                          if editors.index /= current_editor_index and then editors.item.has_selection then
2244                          --| Do nothing.                                                  editors.item.disable_selection
2245                  else                                          end
2246                          if old_cur = Void then                                          editors.forth
2247                                  old_cur := cur_wid.pointer_style                                  end
2248                          end                                  update_paste_cmd
2249  --                              cur_wid.enable_capture                                          -- Last thing, update the menu entry for the formatting marks.
2250                          cur_wid.set_pointer_style (Wait_cursor)                                  if current_editor.view_invisible_symbols then
2251                  end                                          formatting_marks_command_menu_item.set_text (Interface_names.m_Hide_formatting_marks)
2252                                    else
2253                  conv_brkstone ?= a_stone                                          formatting_marks_command_menu_item.set_text(Interface_names.m_Show_formatting_marks)
2254                  conv_errst ?= a_stone                                  end
2255                  conv_ace ?= a_stone                                  command_controller.set_current_editor (an_editor)
2256                  ef_stone ?= a_stone                          end
2257                  if conv_brkstone /= Void then                  end
2258                          if Application.is_breakpoint_enabled (conv_brkstone.routine, conv_brkstone.index) then  
2259                                  Application.remove_breakpoint (conv_brkstone.routine, conv_brkstone.index)          update_paste_cmd is
2260                            -- Update `editor_paste_cmd'. To be performed when an editor grabs the focus.
2261                    do
2262                            if
2263                                    not current_editor.is_empty and then
2264                                    current_editor.is_editable and then
2265                                    current_editor.clipboard.has_text
2266                            then
2267                                    editor_paste_cmd.enable_sensitive
2268                          else                          else
2269                                  Application.set_breakpoint (conv_brkstone.routine, conv_brkstone.index)                                  editor_paste_cmd.disable_sensitive
2270                          end                          end
2271                          output_manager.display_stop_points                  end
2272                          window_manager.quick_refresh_all                                  
2273                  elseif conv_errst /= Void then          feature {NONE} -- Multiple editor management
2274                          display_error_help_cmd.execute_with_stone (conv_errst)  
2275                  elseif conv_ace /= Void then          editors: ARRAYED_LIST [EB_EDITOR]
2276                          --| FIXME XR: What should we do?!                          -- editor contained in `Current'
2277                  elseif ef_stone /= Void then  
2278                          f := ef_stone.file          current_editor_index: INTEGER
2279                          f.make_open_read (f.name)                          -- Index in `editors' of the editor that has the focus.
                         f.read_stream (f.count)  
                         f.close  
                         editor_tool.text_area.load_text (f.last_string)  
                 else  
2280                                                    
2281                                  -- Remember previous stone.          feature {EB_FEATURES_TOOL, EB_FEATURES_TREE, DOTNET_CLASS_AS, DOTNET_CLASS_CONTEXT} -- Feature Clauses
                         old_stone := stone  
                         old_class_stone ?= stone  
           
                                 -- New stone properties  
                         new_class_stone ?= a_stone  
   
                                 -- Set the stone.  
                         old_set_stone (a_stone)  
                         cluster_st ?= a_stone  
2282                                                    
2283                          new_feature_cmd.disable_sensitive          set_feature_clauses (a_features: ARRAYED_LIST [DOTNET_FEATURE_CLAUSE_AS [CONSUMED_ENTITY]]; a_type: STRING) is
2284                          toggle_feature_signature_cmd.disable_sensitive                          -- Set 'features' to 'a_features' and store in hash table with key 'a_type' denoting name of consumed
2285                            -- type pertinent to 'a_features'.
2286                    require
2287                            a_features_not_void: a_features /= Void
2288                    do
2289                            if feature_clauses = Void then
2290                                    create feature_clauses.make (5)
2291                            end
2292                            feature_clauses.put (a_features, a_type)
2293                    end
2294                                                    
2295                                  -- We update the state of the `Add to Favorites' command.          get_feature_clauses (a_type: STRING): ARRAYED_LIST [DOTNET_FEATURE_CLAUSE_AS [CONSUMED_ENTITY]] is
2296                          if new_class_stone /= Void then                          -- Get list of feature clauses relevant to .NET type with name 'a_type'.
2297                                  favorites_menu.first.enable_sensitive                  require
2298                          else                          a_type_not_void: a_type /= Void
2299                                  favorites_menu.first.disable_sensitive                          has_type_clauses: feature_clauses.has (a_type)
2300                    do
2301                            Result := feature_clauses.item (a_type)
2302                    ensure
2303                            result_not_void: Result /= Void
2304                    end
2305                            
2306            feature_clauses: HASH_TABLE [ARRAYED_LIST [DOTNET_FEATURE_CLAUSE_AS [CONSUMED_ENTITY]], STRING]
2307                            -- List of features clauses for Current window hashed by the .NET name of the consumed_type.
2308                            
2309            feature_positions: HASH_TABLE [INTEGER, E_FEATURE]
2310                            -- Features indexed by line position in class text (for .NET features).
2311    
2312            feature {EB_WINDOW_MANAGER} -- Window management / Implementation      
2313    
2314            destroy_imp is
2315                            -- Destroy window.
2316                    do
2317                                    -- To avoid reentrance
2318                            if not is_destroying then
2319                                    is_destroying := True
2320                                            -- If a launched application is still running, kill it.
2321                                    if Application.is_running and then debugger_manager.debugging_window = Current then
2322                                            Application.kill
2323                                    else
2324                                            preferences.development_window_data.save_left_panel_layout (left_panel.save_to_resource)
2325                                            preferences.development_window_data.save_right_panel_layout (right_panel.save_to_resource)
2326                                    end
2327                                    preferences.development_window_data.save_left_panel_width (panel.split_position)
2328                                            -- Save width & height.
2329                                    preferences.development_window_data.save_size (window.width, window.height, window.is_maximized)
2330                                    left_panel.wipe_out
2331                                    right_panel.wipe_out
2332                                    preferences.development_window_data.save_search_tool_options (search_tool)
2333                                    hide
2334    
2335                                            -- Commit saves
2336            --                              save_resources
2337    
2338                                    toolbars_area.wipe_out
2339                                    address_manager.recycle
2340                                    project_customizable_toolbar.recycle
2341                                    Precursor {EB_TOOL_MANAGER}
2342    
2343                                    managed_class_formatters.wipe_out
2344                                    managed_feature_formatters.wipe_out
2345                                    managed_main_formatters.wipe_out
2346                                    toolbarable_commands.wipe_out
2347                                    editors.wipe_out
2348                                    stone := Void
2349                          end                          end
2350                    end
2351    
2352                                  -- Update the history.          feature {NONE} -- Implementation
2353                          if  
2354                                  new_class_stone /= Void          set_stone_after_check (a_stone: STONE) is
2355                          then                  local
2356                                  history_manager.extend (new_class_stone)                          old_stone: STONE
2357                          elseif                          new_class_stone: CLASSI_STONE
2358                                  cluster_st /= Void                          old_class_stone: CLASSI_STONE
2359                          then                          conv_classc: CLASSC_STONE
2360                                  history_manager.extend (cluster_st)                          conv_brkstone: BREAKABLE_STONE
2361                            cluster_st: CLUSTER_STONE
2362                            feature_stone: FEATURE_STONE
2363                            conv_ferrst: FEATURE_ERROR_STONE
2364                            
2365                            ef_stone: EXTERNAL_FILE_STONE
2366                            f: FILE
2367                            
2368                            l_format_context: FORMAT_CONTEXT
2369                            l_indexes: EIFFEL_LIST [INDEX_AS]
2370                            conv_errst: ERROR_STONE
2371                            class_file: RAW_FILE
2372                            class_text_exists: BOOLEAN
2373                            same_class: BOOLEAN
2374                            test_stone: CLASSI_STONE
2375                            conv_ace: ACE_SYNTAX_STONE
2376                            externali: EXTERNAL_CLASS_I
2377                            l_reader: EIFFEL_XML_DESERIALIZER
2378                            external_cons: CONSUMED_TYPE
2379                            str: STRING
2380                            dotnet_class: BOOLEAN
2381                            l_short_formatter: EB_SHORT_FORMATTER
2382                            l_flat_formatter: EB_FLAT_SHORT_FORMATTER
2383                    do
2384                                    -- the text does not change if the text was saved with syntax errors
2385                            cur_wid := window
2386                            if cur_wid = Void then
2387                                    --| Do nothing.
2388                            else
2389                                    if old_cur = Void then
2390                                            old_cur := cur_wid.pointer_style
2391                                    end
2392            --                              cur_wid.enable_capture
2393                                    cur_wid.set_pointer_style (Wait_cursor)
2394                          end                          end
2395                                  -- Update the address manager if needed.  
2396                          address_manager.refresh                          conv_brkstone ?= a_stone
2397                          if new_class_stone /= Void then                          conv_errst ?= a_stone
2398                                          -- class stone was dropped                          conv_ace ?= a_stone
2399                                  create class_file.make (new_class_stone.class_i.file_name)                          ef_stone ?= a_stone
2400                                  class_text_exists := class_file.exists                          if conv_brkstone /= Void then
2401                                  feature_stone ?= a_stone                                  if Application.is_breakpoint_enabled (conv_brkstone.routine, conv_brkstone.index) then
2402                                          --| We have to create a classi_stone to check whether the stones are really similar.                                          Application.remove_breakpoint (conv_brkstone.routine, conv_brkstone.index)
2403                                          --| Otherwise a redefinition of same_as may be called.                                  else
2404                                  create test_stone.make (new_class_stone.class_i)                                          Application.set_breakpoint (conv_brkstone.routine, conv_brkstone.index)
                                 if test_stone.same_as (old_class_stone) then  
                                         same_class := True  
                                 end  
                                 if not feature_stone_already_processed then  
                                         if  
                                                 same_class and then text_saved                                            
                                         then  
                                                         -- nothing changed in the editor  
                                                         -- we only have to update click_list  
                                                 if editor_tool.text_area.is_editable then  
                                                         editor_tool.text_area.update_click_list (False)  
                                                 end  
                                         else  
                                                 if changed then  
                                                                 -- user has already chosen not to save the file  
                                                                 -- do not ask again  
                                                         Feature_positions.wipe_out  
                                                         editor_tool.text_area.no_save_before_next_load  
                                                 end  
                                         end  
2405                                  end                                  end
2406                                    output_manager.display_stop_points
2407                                    window_manager.quick_refresh_all
2408                            elseif conv_errst /= Void then
2409                                    display_error_help_cmd.execute_with_stone (conv_errst)
2410                            elseif conv_ace /= Void then
2411                                    --| FIXME XR: What should we do?!
2412                            elseif ef_stone /= Void then
2413                                    f := ef_stone.file
2414                                    f.make_open_read (f.name)
2415                                    f.read_stream (f.count)
2416                                    f.close
2417                                    editor_tool.text_area.load_text (f.last_string)
2418                            else
2419                                    
2420                                            -- Remember previous stone.
2421                                    old_stone := stone
2422                                    old_class_stone ?= stone
2423                    
2424                                            -- New stone properties
2425                                    new_class_stone ?= a_stone
2426    
2427                                  conv_classc ?= new_class_stone                                          -- Set the stone.
2428                                  if conv_classc = Void or else                                  old_set_stone (a_stone)
2429                                          conv_classc.e_class.is_external or else                                  cluster_st ?= a_stone
2430                                          feature_stone /= Void and not                                  
2431                                          feature_stone_already_processed and not                                  new_feature_cmd.disable_sensitive
2432                                          (same_class and context_tool.sending_stone) then                                  toggle_feature_signature_cmd.disable_sensitive
2433                                                  -- If a classi_stone or a feature_stone or a external call                                  
2434                                                  -- has been dropped, check to see if a .NET class.                                          -- We update the state of the `Add to Favorites' command.
2435                                          if class_text_exists then                                  if new_class_stone /= Void then
2436                                                  if new_class_stone.class_i.is_external_class then                                          favorites_menu.first.enable_sensitive
2437                                                          create l_reader                                  else
2438                                                          externali ?= new_class_stone.class_i                                          favorites_menu.first.disable_sensitive
2439                                                          external_cons ?= l_reader.new_object_from_file (externali.file_name)                                  end
2440                                                          if external_cons /= Void then  
2441                                                                  -- A .NET class.                                          -- Update the history.
2442                                                                  dotnet_class := True                                  if
2443                                                                  l_short_formatter ?= managed_main_formatters.i_th (4)                                          new_class_stone /= Void
2444                                                                  l_flat_formatter ?= managed_main_formatters.i_th (5)                                  then
2445                                                                  if l_short_formatter /= Void then                                          history_manager.extend (new_class_stone)
2446                                                                          l_short_formatter.set_dotnet_mode (True)                                  elseif
2447                                                                  end                                          cluster_st /= Void
2448                                                                  if l_flat_formatter /= Void then                                  then
2449                                                                          l_flat_formatter.set_dotnet_mode (True)                                          history_manager.extend (cluster_st)
                                                                 end  
                                                         end                                                              
                                                 else  
                                                         managed_main_formatters.first.set_stone (new_class_stone)  
                                                         managed_main_formatters.first.execute  
                                                 end  
                                         else  
                                                 editor_tool.text_area.clear_window  
                                                 editor_tool.text_area.display_message (  
                                                         Warning_messages.w_file_not_exist (  
                                                                 new_class_stone.class_i.file_name))  
                                         end  
2450                                  end                                  end
2451                                  if conv_classc = Void then                                          -- Update the address manager if needed.
2452                                                  --| The dropped class is not compiled.                                  address_manager.refresh
2453                                                  --| Display only the textual formatter.                                  if new_class_stone /= Void then
2454                                          if dotnet_class then                                                  -- class stone was dropped
2455                                                  managed_main_formatters.i_th (4).set_stone (new_class_stone)                                          create class_file.make (new_class_stone.class_i.file_name)
2456                                                  managed_main_formatters.i_th (5).set_stone (new_class_stone)                                          class_text_exists := class_file.exists
2457                                                  managed_main_formatters.i_th (4).execute                                                                          feature_stone ?= a_stone
2458                                                    --| We have to create a classi_stone to check whether the stones are really similar.
2459                                                    --| Otherwise a redefinition of same_as may be called.
2460                                            create test_stone.make (new_class_stone.class_i)
2461                                            if test_stone.same_as (old_class_stone) then
2462                                                    same_class := True
2463                                          end                                          end
2464                                          address_manager.disable_formatters                                          if not feature_stone_already_processed then
2465                                  else                                                  if
2466                                                  --| We have a compiled class.                                                          same_class and then text_saved                                          
2467                                          if                                                  then
2468                                                  class_text_exists and then                                                                  -- nothing changed in the editor
2469                                                  Eiffel_project.Workbench.last_reached_degree <= 2                                                                  -- we only have to update click_list
2470                                          then                                                          if editor_tool.text_area.is_editable then
2471                                                  new_feature_cmd.enable_sensitive                                                                  editor_tool.text_area.update_click_list (False)
2472                                                  toggle_feature_signature_cmd.enable_sensitive                                                          end
2473                                                    else
2474                                                            if changed then
2475                                                                            -- user has already chosen not to save the file
2476                                                                            -- do not ask again
2477                                                                    Feature_positions.wipe_out
2478                                                                    editor_tool.text_area.no_save_before_next_load
2479                                                            end
2480                                                    end
2481                                          end                                          end
2482    
2483                                          --address_manager.enable_formatters                                          conv_classc ?= new_class_stone
2484                                          update_formatters                                          if conv_classc = Void or else
2485                                          if not class_text_exists then                                                  conv_classc.e_class.is_external or else
2486                                                          --| Disable the textual formatter.                                                  feature_stone /= Void and not
2487                                                  managed_main_formatters.first.disable_sensitive                                                  feature_stone_already_processed and not
2488                                                  from                                                  (same_class and context_tool.sending_stone) then
2489                                                          managed_main_formatters.start                                                          -- If a classi_stone or a feature_stone or a external call
2490                                                  until                                                          -- has been dropped, check to see if a .NET class.
2491                                                          managed_main_formatters.after                                                  if class_text_exists then
2492                                                  loop                                                          if new_class_stone.class_i.is_external_class then
2493                                                          managed_main_formatters.item.set_stone (new_class_stone)                                                                  create l_reader
2494                                                          managed_main_formatters.forth                                                                  externali ?= new_class_stone.class_i
2495                                                                    external_cons ?= l_reader.new_object_from_file (externali.file_name)
2496                                                                    if external_cons /= Void then
2497                                                                            -- A .NET class.
2498                                                                            dotnet_class := True
2499                                                                            l_short_formatter ?= managed_main_formatters.i_th (4)
2500                                                                            l_flat_formatter ?= managed_main_formatters.i_th (5)
2501                                                                            if l_short_formatter /= Void then
2502                                                                                    l_short_formatter.set_dotnet_mode (True)
2503                                                                            end
2504                                                                            if l_flat_formatter /= Void then
2505                                                                                    l_flat_formatter.set_dotnet_mode (True)
2506                                                                            end
2507                                                                    end                                                            
2508                                                            else
2509                                                                    managed_main_formatters.first.set_stone (new_class_stone)
2510                                                                    managed_main_formatters.first.execute
2511                                                            end
2512                                                    else
2513                                                            editor_tool.text_area.clear_window
2514                                                            editor_tool.text_area.display_message (
2515                                                                    Warning_messages.w_file_not_exist (
2516                                                                            new_class_stone.class_i.file_name))
2517                                                    end
2518                                            end
2519                                            if conv_classc = Void then
2520                                                            --| The dropped class is not compiled.
2521                                                            --| Display only the textual formatter.
2522                                                    if dotnet_class then
2523                                                            managed_main_formatters.i_th (4).set_stone (new_class_stone)
2524                                                            managed_main_formatters.i_th (5).set_stone (new_class_stone)
2525                                                            managed_main_formatters.i_th (4).execute                                
2526                                                  end                                                  end
2527                                                  managed_main_formatters.i_th (2).execute                                                  address_manager.disable_formatters
2528                                          else                                          else
2529                                                  if not changed or not same_class then                                                          --| We have a compiled class.
2530                                                                  --| Enable all formatters.                                                  if
2531                                                          if                                                          class_text_exists and then
2532                                                                  not feature_stone_already_processed or                                                          Eiffel_project.Workbench.last_reached_degree <= 2
2533                                                                  not managed_main_formatters.first.selected                                                  then
2534                                                          then                                                          new_feature_cmd.enable_sensitive
2535                                                            toggle_feature_signature_cmd.enable_sensitive
2536                                                    end
2537    
2538                                                    --address_manager.enable_formatters
2539                                                    update_formatters
2540                                                    if not class_text_exists then
2541                                                                    --| Disable the textual formatter.
2542                                                            managed_main_formatters.first.disable_sensitive
2543                                                            from
2544                                                                    managed_main_formatters.start
2545                                                            until
2546                                                                    managed_main_formatters.after
2547                                                            loop
2548                                                                    managed_main_formatters.item.set_stone (new_class_stone)
2549                                                                    managed_main_formatters.forth
2550                                                            end
2551                                                            managed_main_formatters.i_th (2).execute
2552                                                    else
2553                                                            if not changed or not same_class then
2554                                                                            --| Enable all formatters.
2555                                                                    if
2556                                                                            not feature_stone_already_processed or
2557                                                                            not managed_main_formatters.first.selected
2558                                                                    then
2559                                                                            from
2560                                                                                    managed_main_formatters.start
2561                                                                            until
2562                                                                                    managed_main_formatters.after
2563                                                                            loop
2564                                                                                    managed_main_formatters.item.set_stone (new_class_stone)
2565                                                                                    managed_main_formatters.forth
2566                                                                            end
2567                                                                    end
2568                                                            else
2569                                                                    address_manager.disable_formatters
2570                                                                  from                                                                  from
2571                                                                          managed_main_formatters.start                                                                          managed_main_formatters.start
2572                                                                  until                                                                  until
# Line 2563  set_stone_after_check (a_stone: STONE) i Line 2576  set_stone_after_check (a_stone: STONE) i
2576                                                                          managed_main_formatters.forth                                                                          managed_main_formatters.forth
2577                                                                  end                                                                  end
2578                                                          end                                                          end
                                                 else  
                                                         address_manager.disable_formatters  
                                                         from  
                                                                 managed_main_formatters.start  
                                                         until  
                                                                 managed_main_formatters.after  
                                                         loop  
                                                                 managed_main_formatters.item.set_stone (new_class_stone)  
                                                                 managed_main_formatters.forth  
                                                         end  
2579                                                  end                                                  end
2580                                          end                                          end
2581                                  end                                  else
2582                          else                                                  -- not a class text : cannot be edited  
2583                                          -- not a class text : cannot be edited                                            editor_tool.text_area.disable_editable
2584                                  editor_tool.text_area.disable_editable                                          address_manager.disable_formatters
                                 address_manager.disable_formatters  
2585    
2586                                          --| Disable all formatters.                                                  --| Disable all formatters.
2587                                  from                                          from
2588                                          managed_main_formatters.start                                                  managed_main_formatters.start
2589                                  until                                          until
2590                                          managed_main_formatters.after                                                  managed_main_formatters.after
2591                                  loop                                          loop
2592                                          managed_main_formatters.item.set_stone (Void)                                                  managed_main_formatters.item.set_stone (Void)
2593                                          managed_main_formatters.forth                                                  managed_main_formatters.forth
2594                                  end                                          end
2595                                  if cluster_st /= Void then                                          if cluster_st /= Void then
2596  --| FIXME XR: Really manage cluster display in the main editor          --| FIXME XR: Really manage cluster display in the main editor
2597                                          create l_format_context.make_for_case                                                  create l_format_context.make_for_case
2598                                          l_format_context.put_text_item (ti_indexing_keyword)                                                  l_format_context.put_text_item (ti_indexing_keyword)
2599                                          l_format_context.put_new_line                                                  l_format_context.put_new_line
2600                                          l_format_context.indent                                                  l_format_context.indent
2601                                          l_format_context.put_text_item (create {INDEXING_TAG_TEXT}.make ("cluster"))                                                  l_format_context.put_text_item (create {INDEXING_TAG_TEXT}.make ("cluster"))
2602                                          l_format_context.put_text_item_without_tabs (ti_colon)                                                  l_format_context.put_text_item_without_tabs (ti_colon)
2603                                          l_format_context.put_space                                                  l_format_context.put_space
2604                                          l_format_context.put_string ("%"" + cluster_st.cluster_i.cluster_name + "%"")                                                  l_format_context.put_string ("%"" + cluster_st.cluster_i.cluster_name + "%"")
2605                                          l_format_context.put_new_line                                                  l_format_context.put_new_line
2606                                          l_format_context.put_text_item (create {INDEXING_TAG_TEXT}.make ("cluster_path"))                                                  l_format_context.put_text_item (create {INDEXING_TAG_TEXT}.make ("cluster_path"))
2607                                          l_format_context.put_text_item_without_tabs (ti_colon)                                                  l_format_context.put_text_item_without_tabs (ti_colon)
2608                                          l_format_context.put_space                                                  l_format_context.put_space
2609                                          l_format_context.put_string ("%"" + cluster_st.cluster_i.path + "%"")                                                  l_format_context.put_string ("%"" + cluster_st.cluster_i.path + "%"")
2610                                          l_format_context.put_new_line                                                  l_format_context.put_new_line
2611                                          l_indexes := cluster_st.cluster_i.indexes                                                  l_indexes := cluster_st.cluster_i.indexes
2612                                          if l_indexes /= Void then                                                  if l_indexes /= Void then
2613                                                  l_format_context.set_new_line_between_tokens                                                          l_format_context.set_new_line_between_tokens
2614                                                  l_format_context.format_ast (l_indexes)                                                          l_format_context.format_ast (l_indexes)
2615                                                  l_format_context.exdent                                                          l_format_context.exdent
2616                                                    end
2617                                                    l_format_context.put_new_line
2618                                                    editor_tool.text_area.process_text (l_format_context.text)
2619            --| END FIXME
2620                                          end                                          end
                                         l_format_context.put_new_line  
                                         editor_tool.text_area.process_text (l_format_context.text)  
 --| END FIXME  
2621                                  end                                  end
2622                          end                                  if feature_stone /= Void and class_text_exists and not feature_stone_already_processed and not (same_class and context_tool.sending_stone) then
2623                          if feature_stone /= Void and class_text_exists and not feature_stone_already_processed and not (same_class and context_tool.sending_stone) then                                          conv_ferrst ?= feature_stone
2624                                  conv_ferrst ?= feature_stone                                          if conv_ferrst /= Void then
2625                                  if conv_ferrst /= Void then                                                          -- Scroll to the line of the error.
2626                                                  -- Scroll to the line of the error.                                                  editor_tool.text_area.display_line_when_ready (conv_ferrst.line_number, True)
2627                                          editor_tool.text_area.display_line_when_ready (conv_ferrst.line_number, True)                                          else
2628                                  else                                                          -- if a feature_stone has been dropped
2629                                                  -- if a feature_stone has been dropped                                                          -- scroll to the corresponding feature in the basic text format
2630                                                  -- scroll to the corresponding feature in the basic text format                                                  if not during_synchronization then
2631                                          if not during_synchronization then                                                          scroll_to_feature (feature_stone.e_feature, new_class_stone.class_i)
2632                                                  scroll_to_feature (feature_stone.e_feature, new_class_stone.class_i)                                                  end
2633                                          end                                          end
2634                                  end                                  end
2635                          end                                          -- Update the title of the window
2636                                  -- Update the title of the window                                  if a_stone /= Void then
2637                          if a_stone /= Void then                                          if changed then
2638                                  if changed then                                                  str := a_stone.header.twin
2639                                          str := a_stone.header.twin                                                  str.prepend ("* ")
2640                                          str.prepend ("* ")                                                  set_title (str)
2641                                          set_title (str)                                          else
2642                                                    set_title (a_stone.header)
2643                                            end
2644                                  else                                  else
2645                                          set_title (a_stone.header)                                          set_title (Interface_names.t_Empty_development_window)
2646                                  end                                  end
2647    
2648                                            -- Refresh the tools.
2649                                    features_tool.set_stone (a_stone)
2650                                    cluster_tool.set_stone (a_stone)
2651                                            -- Update the context tool.
2652                                    if unified_stone then
2653                                            context_tool.set_stone (a_stone)
2654                                    end
2655    
2656                            end
2657                            if
2658                                    stone /= Void and then
2659                                    not unified_stone
2660                            then
2661                                    send_stone_to_context_cmd.enable_sensitive
2662                          else                          else
2663                                  set_title (Interface_names.t_Empty_development_window)                                  send_stone_to_context_cmd.disable_sensitive
2664                          end                          end
2665                            if cur_wid = Void then
2666                                  -- Refresh the tools.                                  --| Do nothing.
2667                          features_tool.set_stone (a_stone)                          else            
2668                          cluster_tool.set_stone (a_stone)                                  cur_wid.set_pointer_style (old_cur)
2669                                  -- Update the context tool.                                  old_cur := Void
2670                          if unified_stone then          --                                      cur_wid.disable_capture
2671                                  context_tool.set_stone (a_stone)                                  cur_wid := Void
2672                          end                          end
   
2673                  end                  end
2674                  if  
2675                          stone /= Void and then          scroll_to_feature (feat_as: E_FEATURE; displayed_class: CLASS_I) is
2676                          not unified_stone                          -- highlight the feature correspnding to `feat_as' in the class represented by `displayed_class'
2677                  then                  require
2678                          send_stone_to_context_cmd.enable_sensitive                          class_is_not_void: displayed_class /= Void
2679                  else                          feat_as_is_not_void: feat_as /= Void
2680                          send_stone_to_context_cmd.disable_sensitive                  local
2681                  end                          begin_index, offset: INTEGER
2682                  if cur_wid = Void then                          tmp_text: STRING
2683                          --| Do nothing.                  do
2684                  else                                      if not feat_as.is_il_external then
2685                          cur_wid.set_pointer_style (old_cur)                                  if feat_as.ast /= Void then
2686                          old_cur := Void                                          begin_index := feat_as.ast.start_position
2687  --                                      cur_wid.disable_capture                                          if platform_constants.is_windows then
2688                          cur_wid := Void                                                  tmp_text := displayed_class.text.substring (1, begin_index)
2689                  end                                                  offset := tmp_text.occurrences('%R')
2690          end                                          end
2691                                            editor_tool.text_area.scroll_to_when_ready (begin_index.item - offset)
2692  scroll_to_feature (feat_as: E_FEATURE; displayed_class: CLASS_I) is                                  end
2693                  -- highlight the feature correspnding to `feat_as' in the class represented by `displayed_class'                          else
2694          require                                          -- FIXME NC: Doesn't work properly for .NET features
2695                  class_is_not_void: displayed_class /= Void                                          -- .NET formatted feature.
2696                  feat_as_is_not_void: feat_as /= Void                                  begin_index := feature_positions.item (feat_as)
         local  
                 begin_index, offset: INTEGER  
                 tmp_text: STRING  
         do  
                 if not feat_as.is_il_external then  
                         if feat_as.ast /= Void then  
                                 begin_index := feat_as.ast.start_position  
2697                                  if platform_constants.is_windows then                                  if platform_constants.is_windows then
2698                                          tmp_text := displayed_class.text.substring (1, begin_index)                                          tmp_text := displayed_class.text.substring (1, begin_index)
2699                                          offset := tmp_text.occurrences('%R')                                          offset := tmp_text.occurrences('%N')
2700                                  end                                  end
2701                                  editor_tool.text_area.scroll_to_when_ready (begin_index.item - offset)                                  editor_tool.text_area.scroll_to_when_ready (begin_index // 2) -- - offset)
                         end  
                 else  
                                 -- FIXME NC: Doesn't work properly for .NET features  
                                 -- .NET formatted feature.  
                         begin_index := feature_positions.item (feat_as)  
                         if platform_constants.is_windows then  
                                 tmp_text := displayed_class.text.substring (1, begin_index)  
                                 offset := tmp_text.occurrences('%N')  
2702                          end                          end
                         editor_tool.text_area.scroll_to_when_ready (begin_index // 2) -- - offset)  
2703                  end                  end
         end  
2704    
2705  check_passed: BOOLEAN          check_passed: BOOLEAN
2706    
2707  save_canceled: BOOLEAN          save_canceled: BOOLEAN
2708          -- did user cancel save ?                  -- did user cancel save ?
2709    
2710  save_only: BOOLEAN          save_only: BOOLEAN
2711          -- skip parse and update after save ?                  -- skip parse and update after save ?
2712    
2713  text_saved: BOOLEAN          text_saved: BOOLEAN
2714                  -- has the user chosen to save the file                          -- has the user chosen to save the file
2715    
2716  is_destroying: BOOLEAN          is_destroying: BOOLEAN
2717                  -- Is `current' being currently destroyed?                          -- Is `current' being currently destroyed?
2718    
2719  feature_stone_already_processed: BOOLEAN          feature_stone_already_processed: BOOLEAN
2720                  -- Is the processed stone a feature stone and has it                          -- Is the processed stone a feature stone and has it
2721                  -- been already processed by the editor ?                          -- been already processed by the editor ?
2722    
2723  feature {NONE} -- Implementation          feature {NONE} -- Implementation
2724    
2725  update_save_symbol is          update_save_symbol is
2726          do                  do
2727                  Precursor {EB_FILEABLE}                          Precursor {EB_FILEABLE}
2728                  if changed then                          if changed then
2729                          save_cmd.enable_sensitive                                  save_cmd.enable_sensitive
2730                          address_manager.disable_formatters                                  address_manager.disable_formatters
2731                  else                          else
2732                          save_cmd.disable_sensitive                                  save_cmd.disable_sensitive
2733                          update_formatters                                  update_formatters
2734                  end                          end
2735                  if is_empty then                          if is_empty then
2736                          print_cmd.disable_sensitive                                  print_cmd.disable_sensitive
2737                          save_as_cmd.disable_sensitive                                  save_as_cmd.disable_sensitive
2738                  else                          else
2739                          print_cmd.enable_sensitive                                  print_cmd.enable_sensitive
2740                          save_as_cmd.enable_sensitive                                  save_as_cmd.enable_sensitive
2741                  end                          end
         end  
   
 is_stone_external: BOOLEAN  
                 -- Does 'stone' contain a .NET consumed type?  
   
 update_formatters is  
                 -- Give a correct sensitivity to formatters.  
         local  
                 cist: CLASSI_STONE  
                 cst: CLASSC_STONE  
                 type_changed: BOOLEAN  
         do  
                 cst ?= stone  
                 cist ?= stone  
                 -- Check to if formatting context has changed.  
                 if cst /= Void then  
                         type_changed := (cst.e_class.is_true_external and not is_stone_external) or  
                                 (not cst.e_class.is_true_external and is_stone_external)  
                 elseif cist /= Void then  
                         type_changed := (cist.class_i.is_external_class and not is_stone_external) or  
                                 (not cist.class_i.is_external_class and is_stone_external)  
2742                  end                  end
2743                    
2744                  if type_changed then          is_stone_external: BOOLEAN
2745                                  -- Toggle stone flag.                          -- Does 'stone' contain a .NET consumed type?
2746                          is_stone_external := not is_stone_external  
2747                  end          update_formatters is
2748                            -- Give a correct sensitivity to formatters.
2749                  if cst /= Void then                  local
2750                          address_manager.enable_formatters                          cist: CLASSI_STONE
2751                          if is_stone_external then                          cst: CLASSC_STONE
2752                            type_changed: BOOLEAN
2753                    do
2754                            cst ?= stone
2755                            cist ?= stone
2756                            -- Check to if formatting context has changed.
2757                            if cst /= Void then
2758                                    type_changed := (cst.e_class.is_true_external and not is_stone_external) or
2759                                            (not cst.e_class.is_true_external and is_stone_external)
2760                            elseif cist /= Void then
2761                                    type_changed := (cist.class_i.is_external_class and not is_stone_external) or
2762                                            (not cist.class_i.is_external_class and is_stone_external)
2763                            end
2764                            
2765                            if type_changed then
2766                                            -- Toggle stone flag.
2767                                    is_stone_external := not is_stone_external
2768                            end
2769    
2770                            if cst /= Void then
2771                                    address_manager.enable_formatters
2772                                    if is_stone_external then
2773                                                    -- Change formatters to .NET sensitivity (from normal).
2774                                            enable_dotnet_formatters
2775                                            if type_changed then
2776                                                    managed_main_formatters.i_th (4).enable_select
2777                                            end
2778                                    else
2779                                            if changed then
2780                                                    address_manager.disable_formatters
2781                                            else
2782                                                    --managed_main_formatters.first.disable_sensitive
2783                                            end
2784                                    end
2785                            elseif cist /= Void and is_stone_external then
2786                                          -- Change formatters to .NET sensitivity (from normal).                                          -- Change formatters to .NET sensitivity (from normal).
2787                                  enable_dotnet_formatters                                  enable_dotnet_formatters
2788                                  if type_changed then                                  if type_changed then
2789                                          managed_main_formatters.i_th (4).enable_select                                          managed_main_formatters.i_th (4).enable_select
2790                                  end                                  end
2791                          else                          else
2792                                  if changed then                                  address_manager.disable_formatters
2793                                          address_manager.disable_formatters                                  if cist /= stone then
2794                                            managed_main_formatters.first.execute
2795                                    end
2796                            end
2797                    end
2798    
2799            enable_dotnet_formatters is
2800                            -- Enable only the .NET class text formatters.
2801                    do
2802                            from
2803                                    managed_main_formatters.start
2804                            until
2805                                    managed_main_formatters.after
2806                            loop
2807                                    if managed_main_formatters.item.is_dotnet_formatter then
2808                                            managed_main_formatters.item.enable_sensitive
2809                                  else                                  else
2810                                          --managed_main_formatters.first.disable_sensitive                                          managed_main_formatters.item.disable_sensitive
2811                                  end                                  end
2812                                    managed_main_formatters.forth
2813                          end                          end
2814                  elseif cist /= Void and is_stone_external then                  end
2815                                  -- Change formatters to .NET sensitivity (from normal).                  
2816                          enable_dotnet_formatters  
2817                          if type_changed then          on_text_reset is
2818                                  managed_main_formatters.i_th (4).enable_select                          -- The main editor has just been wiped out
2819                            -- before loading a new file.
2820                    local
2821                            str: STRING
2822                    do
2823                            str := title.twin
2824                            if str @ 1 = '*' then
2825                                    str.keep_tail (str.count - 2)
2826                                    set_title (str)
2827                          end                          end
                 else  
2828                          address_manager.disable_formatters                          address_manager.disable_formatters
2829                          if cist /= stone then                          status_bar.display_message ("")
2830                                  managed_main_formatters.first.execute                          status_bar.remove_cursor_position
2831                          end                          text_edited := False
2832                  end                  end
         end  
2833    
2834  enable_dotnet_formatters is          on_cursor_moved is
2835                  -- Enable only the .NET class text formatters.                          -- The cursor has moved, reflect the change in the status bar.
2836          do                  do
2837                  from                          refresh_cursor_position
                         managed_main_formatters.start  
                 until  
                         managed_main_formatters.after  
                 loop  
                         if managed_main_formatters.item.is_dotnet_formatter then  
                                 managed_main_formatters.item.enable_sensitive  
                         else  
                                 managed_main_formatters.item.disable_sensitive  
                         end  
                         managed_main_formatters.forth  
                 end  
         end  
           
   
 on_text_reset is  
                 -- The main editor has just been wiped out  
                 -- before loading a new file.  
         local  
                 str: STRING  
         do  
                 str := title.twin  
                 if str @ 1 = '*' then  
                         str.keep_tail (str.count - 2)  
                         set_title (str)  
                 end  
                 address_manager.disable_formatters  
                 status_bar.display_message ("")  
                 status_bar.remove_cursor_position  
                 text_edited := False  
         end  
   
 on_cursor_moved is  
                 -- The cursor has moved, reflect the change in the status bar.  
         do  
                 refresh_cursor_position  
         end  
   
 on_text_fully_loaded is  
                 -- The main editor has just been reloaded.  
         do  
                 update_paste_cmd  
                 update_formatters  
                 if editor_tool.text_area.syntax_is_correct then  
                         status_bar.display_message ("")  
                 else  
                         status_bar.display_message (Interface_names.L_syntax_error)  
2838                  end                  end
2839                  refresh_cursor_position  
2840                  text_edited := False          on_text_fully_loaded is
2841          end                          -- The main editor has just been reloaded.
2842                    do
2843  on_text_back_to_its_last_saved_state is                          update_paste_cmd
2844          local                          update_formatters
2845                  str: STRING                          if editor_tool.text_area.syntax_is_correct then
2846          do                                  status_bar.display_message ("")
2847                  str := title.twin                          else
2848                  if str @ 1 = '*' then                                  status_bar.display_message (Interface_names.L_syntax_error)
2849                          str.keep_tail (str.count - 2)                          end
2850                          set_title (str)                          refresh_cursor_position
2851                  end                          text_edited := False
2852                  update_formatters                  end
2853                  text_edited := False  
2854          end                              on_text_back_to_its_last_saved_state is
2855                    local
2856  text_edited: BOOLEAN                          str: STRING
2857                  -- Do we know that the text was edited?                  do
                 -- If so, no need to update the display each time it is edited.  
   
 on_text_edited (unused: BOOLEAN) is  
                 -- The text in the editor is modified, add the '*' in the title.  
                 -- Gray out the formatters.  
         local  
                 str: STRING  
                 cst: CLASSI_STONE  
         do  
                 if not text_edited then  
2858                          str := title.twin                          str := title.twin
2859                          if str @ 1 /= '*' then                          if str @ 1 = '*' then
2860                                  str.prepend ("* ")                                  str.keep_tail (str.count - 2)
2861                                  set_title (str)                                  set_title (str)
2862                          end                          end
2863                          address_manager.disable_formatters                          update_formatters
2864                          cst ?= stone                          text_edited := False
2865                          if cst /= Void then                  end                    
2866                                  Eiffel_project.Manager.class_is_edited (cst.class_i)  
2867            text_edited: BOOLEAN
2868                            -- Do we know that the text was edited?
2869                            -- If so, no need to update the display each time it is edited.
2870    
2871            on_text_edited (unused: BOOLEAN) is
2872                            -- The text in the editor is modified, add the '*' in the title.
2873                            -- Gray out the formatters.
2874                    local
2875                            str: STRING
2876                            cst: CLASSI_STONE
2877                    do
2878                            if not text_edited then
2879                                    str := title.twin
2880                                    if str @ 1 /= '*' then
2881                                            str.prepend ("* ")
2882                                            set_title (str)
2883                                    end
2884                                    address_manager.disable_formatters
2885                                    cst ?= stone
2886                                    if cst /= Void then
2887                                            Eiffel_project.Manager.class_is_edited (cst.class_i)
2888                                    end
2889                                    text_edited := True
2890                            end
2891                            status_bar.display_message ("")
2892                    end
2893    
2894            on_back is
2895                            -- User pressed Alt+left.
2896                            -- Go back in the history (or the context history).
2897                    do
2898                            if context_tool_has_focus then
2899                                    if context_tool.history_manager.is_back_possible then
2900                                            context_tool.history_manager.back_command.execute
2901                                    end
2902                            elseif history_manager.is_back_possible then
2903                                    history_manager.back_command.execute            
2904                          end                          end
                         text_edited := True  
2905                  end                  end
                 status_bar.display_message ("")  
         end  
2906    
2907  on_back is          on_forth is
2908                  -- User pressed Alt+left.                          -- User pressed Alt+right.
2909                  -- Go back in the history (or the context history).                          -- Go forth in the history (or the context history).
2910          do                  do
2911                  if context_tool_has_focus then                          if context_tool_has_focus then
2912                          if context_tool.history_manager.is_back_possible then                                  if context_tool.history_manager.is_forth_possible then
2913                                  context_tool.history_manager.back_command.execute                                          context_tool.history_manager.forth_command.execute
2914                          end                                          editor_tool.text_area.editor_viewport.enable_sensitive
2915                  elseif history_manager.is_back_possible then                                          editor_tool.text_area.set_focus
2916                          history_manager.back_command.execute                                              end
2917                  end                          elseif history_manager.is_forth_possible then
2918          end                                  history_manager.forth_command.execute
   
 on_forth is  
                 -- User pressed Alt+right.  
                 -- Go forth in the history (or the context history).  
         do  
                 if context_tool_has_focus then  
                         if context_tool.history_manager.is_forth_possible then  
                                 context_tool.history_manager.forth_command.execute  
2919                                  editor_tool.text_area.editor_viewport.enable_sensitive                                  editor_tool.text_area.editor_viewport.enable_sensitive
2920                                  editor_tool.text_area.set_focus                                  editor_tool.text_area.set_focus
2921                          end                          end
2922                  elseif history_manager.is_forth_possible then                  end
2923                          history_manager.forth_command.execute  
2924                          editor_tool.text_area.editor_viewport.enable_sensitive          context_tool_has_focus: BOOLEAN is
2925                          editor_tool.text_area.set_focus                          -- Does the context tool or one of its children has the focus?
2926                  end                  local
2927          end                          fw: EV_WIDGET
2928                            cont: EV_CONTAINER
2929  context_tool_has_focus: BOOLEAN is                          wid: EV_WIDGET
2930                  -- Does the context tool or one of its children has the focus?                  do
2931          local                          fw := (create {EV_ENVIRONMENT}).application.focused_widget
2932                  fw: EV_WIDGET                          wid := context_tool.explorer_bar_item.widget
2933                  cont: EV_CONTAINER                          if wid = fw then
                 wid: EV_WIDGET  
         do  
                 fw := (create {EV_ENVIRONMENT}).application.focused_widget  
                 wid := context_tool.explorer_bar_item.widget  
                 if wid = fw then  
                         Result := True  
                 elseif fw = Void then  
                         Result := False  
                 else  
                         from  
                                 cont := fw.parent  
                         until  
                                 cont = wid or cont = Void  
                         loop  
                                 cont := cont.parent  
                         end  
                         if cont = wid then  
2934                                  Result := True                                  Result := True
2935                            elseif fw = Void then
2936                                    Result := False
2937                            else
2938                                    from
2939                                            cont := fw.parent
2940                                    until
2941                                            cont = wid or cont = Void
2942                                    loop
2943                                            cont := cont.parent
2944                                    end
2945                                    if cont = wid then
2946                                            Result := True
2947                                    end
2948                          end                          end
2949                  end                  end
         end  
2950    
2951  saved_cursor: CURSOR          saved_cursor: CURSOR
2952                  -- Saved cursor position for displaying the stack.                          -- Saved cursor position for displaying the stack.
2953    
2954            can_drop (st: ANY): BOOLEAN is
2955                            -- Can the user drop the stone `st'?
2956                    local
2957                            conv_ace: ACE_SYNTAX_STONE
2958                    do
2959                            conv_ace ?= st
2960                            Result := conv_ace = Void
2961                    end
2962    
2963            quick_refresh_on_class_drop (unused: CLASSI_STONE) is
2964                            -- Quick refresh all windows.
2965                    do
2966                            window_manager.quick_refresh_all
2967                    end
2968    
2969  can_drop (st: ANY): BOOLEAN is          quick_refresh_on_brk_drop (unused: BREAKABLE_STONE) is
2970                  -- Can the user drop the stone `st'?                          -- Quick refresh all windows.
2971          local                  do
2972                  conv_ace: ACE_SYNTAX_STONE                          window_manager.quick_refresh_all
2973          do                  end
2974                  conv_ace ?= st  
2975                  Result := conv_ace = Void          send_stone_to_context is
2976          end                          -- Send current stone to the context tool.
2977                            -- Used by `send_stone_to_context_cmd'.
2978  quick_refresh_on_class_drop (unused: CLASSI_STONE) is                  do
2979                  -- Quick refresh all windows.                          if stone /= Void then
2980          do                                  context_tool.set_stone (stone)
                 window_manager.quick_refresh_all  
         end  
   
 quick_refresh_on_brk_drop (unused: BREAKABLE_STONE) is  
                 -- Quick refresh all windows.  
         do  
                 window_manager.quick_refresh_all  
         end  
   
 send_stone_to_context is  
                 -- Send current stone to the context tool.  
                 -- Used by `send_stone_to_context_cmd'.  
         do  
                 if stone /= Void then  
                         context_tool.set_stone (stone)  
                 end  
         end  
   
 destroy is  
                 -- check if current text has been saved and destroy  
         local  
                 dialog_w: EB_WARNING_DIALOG  
         do  
                 if editor_tool /= Void and then editor_tool.text_area /= Void and then changed and then not confirmed then  
                         if Window_manager.development_windows_count > 1 then  
                                 create dialog_w.make_with_text (Warning_messages.w_Save_before_closing)  
                                 dialog_w.set_buttons_and_actions (<<"Yes", "No", "Cancel">>, <<agent save_and_destroy, agent force_destroy, agent do_nothing>>)  
                                 dialog_w.set_default_push_button (dialog_w.button("Yes"))  
                                 dialog_w.set_default_cancel_button (dialog_w.button("Cancel"))  
                                 dialog_w.show_modal_to_window (window)  
                         else  
                                         -- We let the window manager handle the saving, along with other windows  
                                         -- (not development windows)  
                                 force_destroy  
2981                          end                          end
2982                  else                  end
2983    
2984            destroy is
2985                            -- check if current text has been saved and destroy
2986                    local
2987                            dialog_w: EB_WARNING_DIALOG
2988                    do
2989                            if editor_tool /= Void and then editor_tool.text_area /= Void and then changed and then not confirmed then
2990                                    if Window_manager.development_windows_count > 1 then
2991                                            create dialog_w.make_with_text (Warning_messages.w_Save_before_closing)
2992                                            dialog_w.set_buttons_and_actions (<<"Yes", "No", "Cancel">>, <<agent save_and_destroy, agent force_destroy, agent do_nothing>>)
2993                                            dialog_w.set_default_push_button (dialog_w.button("Yes"))
2994                                            dialog_w.set_default_cancel_button (dialog_w.button("Cancel"))
2995                                            dialog_w.show_modal_to_window (window)
2996                                    else
2997                                                    -- We let the window manager handle the saving, along with other windows
2998                                                    -- (not development windows)
2999                                            force_destroy
3000                                    end
3001                            else
3002                                    Precursor {EB_TOOL_MANAGER}
3003                            end
3004                    end
3005    
3006            save_and_destroy is
3007                    do
3008                            save_text
3009                            destroy
3010                    end
3011    
3012            force_destroy is
3013                            -- Destroy without asking.
3014                    do
3015                            confirmed := True
3016                            destroy
3017                            confirmed := False
3018                    end
3019    
3020            confirmed: BOOLEAN
3021                            -- Did the user say he wanted to exit?
3022    
3023            show_dynamic_library_dialog is
3024                            -- Create a new dynamic library window and display it.
3025                    do
3026                            Window_manager.create_dynamic_lib_window
3027                    end
3028    
3029            recycle is
3030                            -- Call the precursors.
3031                    do
3032                          Precursor {EB_TOOL_MANAGER}                          Precursor {EB_TOOL_MANAGER}
3033                            command_controller.recycle
3034                  end                  end
         end  
3035    
3036  save_and_destroy is          feature {NONE} -- Implementation: Editor commands
3037          do  
3038                  save_text          refresh_cursor_position is
3039                  destroy                          -- Display the current cursor position in the status bar.
3040          end                  require
3041                            text_loaded: not is_empty
3042  force_destroy is                  local
3043                  -- Destroy without asking.                          l, c: INTEGER
3044          do                  do
3045                  confirmed := True                          l := editor_tool.text_area.cursor_y_position
3046                  destroy                          c := editor_tool.text_area.cursor_x_position
3047                  confirmed := False                          status_bar.set_cursor_position (l, c)
3048          end                  end
3049    
3050  confirmed: BOOLEAN          select_all is
3051                  -- Did the user say he wanted to exit?                          -- Select the whole text in the focused editor.
3052                    do
3053  show_dynamic_library_dialog is                          current_editor.select_all
3054                  -- Create a new dynamic library window and display it.                  end
3055          do  
3056                  Window_manager.create_dynamic_lib_window          search is
3057          end                          -- Search some text in the focused editor.
3058                    local
3059  recycle is                          cv_ced: EB_CLICKABLE_EDITOR
3060                  -- Call the precursors.                  do
         do  
                 Precursor {EB_TOOL_MANAGER}  
                 command_controller.recycle  
         end  
   
 feature {NONE} -- Implementation: Editor commands  
   
 refresh_cursor_position is  
                 -- Display the current cursor position in the status bar.  
         require  
                 text_loaded: not is_empty  
         local  
                 l, c: INTEGER  
         do  
                 l := editor_tool.text_area.cursor_y_position  
                 c := editor_tool.text_area.cursor_x_position  
                 status_bar.set_cursor_position (l, c)  
         end  
   
 select_all is  
                 -- Select the whole text in the focused editor.  
         do  
                 current_editor.select_all  
         end  
   
 search is  
                 -- Search some text in the focused editor.  
         local  
                 cv_ced: EB_CLICKABLE_EDITOR  
         do  
                 cv_ced ?= current_editor  
                 if cv_ced /= Void then  
                         cv_ced.search  
                 end  
         end  
   
 goto is  
                 -- Display a dialog to select a line to go to in the editor.  
         local  
                 ed: EB_EDITOR  
         do  
                 ed ?= current_editor  
                 if ed /= Void then  
                         create goto_dialog.make (ed)  
                         goto_dialog.show_modal_to_window (Current.window)  
                 end  
         end  
   
 toggle_line_number_display is  
                 -- Toggle line number display on/off in editor  
         local  
                 ed: EB_EDITOR  
         do  
                 ed ?= current_editor  
                 if ed /= Void then  
                         ed.toggle_line_number_display  
                 end  
         end  
   
 find_next is  
                 -- Find the next occurrence of the search text.  
         local  
                 cv_ced: EB_CLICKABLE_EDITOR  
         do  
                 if search_tool.currently_searched /= Void then  
3061                          cv_ced ?= current_editor                          cv_ced ?= current_editor
3062                          if cv_ced /= Void then                          if cv_ced /= Void then
3063                                  cv_ced.find_next                                  cv_ced.search
3064                            end
3065                    end
3066    
3067            goto is
3068                            -- Display a dialog to select a line to go to in the editor.
3069                    local
3070                            ed: EB_EDITOR
3071                    do
3072                            ed ?= current_editor
3073                            if ed /= Void then
3074                                    create goto_dialog.make (ed)
3075                                    goto_dialog.show_modal_to_window (Current.window)
3076                            end
3077                    end
3078    
3079            toggle_line_number_display is
3080                            -- Toggle line number display on/off in editor
3081                    local
3082                            ed: EB_EDITOR
3083                    do
3084                            ed ?= current_editor
3085                            if ed /= Void then
3086                                    ed.toggle_line_number_display
3087                            end
3088                    end
3089    
3090            find_next is
3091                            -- Find the next occurrence of the search text.
3092                    local
3093                            cv_ced: EB_CLICKABLE_EDITOR
3094                    do
3095                            if search_tool.currently_searched /= Void then
3096                                    cv_ced ?= current_editor
3097                                    if cv_ced /= Void then
3098                                            cv_ced.find_next
3099                                    end
3100                            else
3101                                    search_tool.show_and_set_focus
3102                            end
3103                    end
3104    
3105            find_previous is
3106                            -- Find the previous occurrence of the search text.
3107                    local
3108                            cv_ced: EB_CLICKABLE_EDITOR
3109                    do
3110                            if search_tool.currently_searched /= Void then
3111                                    cv_ced ?= current_editor
3112                                    if cv_ced /= Void then
3113                                            cv_ced.find_previous
3114                                    end
3115                            else
3116                                    search_tool.show_and_set_focus
3117                          end                          end
                 else  
                         search_tool.show_and_set_focus  
3118                  end                  end
         end  
3119    
3120  find_previous is          find_selection is
3121                  -- Find the previous occurrence of the search text.                          -- Find the next occurrence of the selection.
3122          local                  local
3123                  cv_ced: EB_CLICKABLE_EDITOR                          cv_ced: EB_CLICKABLE_EDITOR
3124          do                  do
                 if search_tool.currently_searched /= Void then  
3125                          cv_ced ?= current_editor                          cv_ced ?= current_editor
3126                          if cv_ced /= Void then                          if cv_ced /= Void then
3127                                  cv_ced.find_previous                                  cv_ced.find_selection
3128                          end                          end
                 else  
                         search_tool.show_and_set_focus  
3129                  end                  end
         end  
3130    
3131  find_selection is          cut_selection is
3132                  -- Find the next occurrence of the selection.                          -- Cut the selection in the current editor.
3133          local                  do
3134                  cv_ced: EB_CLICKABLE_EDITOR                          current_editor.cut_selection
         do  
                 cv_ced ?= current_editor  
                 if cv_ced /= Void then  
                         cv_ced.find_selection  
3135                  end                  end
         end  
   
 cut_selection is  
                 -- Cut the selection in the current editor.  
         do  
                 current_editor.cut_selection  
         end  
3136    
3137  copy_selection is          copy_selection is
3138                  -- Cut the selection in the current editor.                          -- Cut the selection in the current editor.
3139          do                  do
3140                  current_editor.copy_selection                          current_editor.copy_selection
3141          end                  end
3142    
3143  toggle_formatting_marks is          toggle_formatting_marks is
3144                  -- Show/Hide formatting marks in the editor and update related menu item.                          -- Show/Hide formatting marks in the editor and update related menu item.
3145          do                  do
3146                  current_editor.toggle_view_invisible_symbols                          current_editor.toggle_view_invisible_symbols
3147                  if current_editor.view_invisible_symbols then                          if current_editor.view_invisible_symbols then
3148                          formatting_marks_command_menu_item.set_text (Interface_names.m_Hide_formatting_marks)                                  formatting_marks_command_menu_item.set_text (Interface_names.m_Hide_formatting_marks)
3149                  else                          else
3150                          formatting_marks_command_menu_item.set_text(Interface_names.m_Show_formatting_marks)                                  formatting_marks_command_menu_item.set_text(Interface_names.m_Show_formatting_marks)
3151                            end
3152                  end                  end
         end  
3153    
3154  feature {NONE} -- Implementation / Menus          feature {NONE} -- Implementation / Menus
3155    
3156            number_of_displayed_external_commands: INTEGER
3157                            -- Number of external commands in the tools menu.
3158    
3159            old_cur: EV_CURSOR
3160                            -- Cursor saved while displaying the hourglass cursor.
3161    
3162            cur_wid: EV_WIDGET
3163                            -- Widget on which the hourglass cursor was set.
3164    
3165  number_of_displayed_external_commands: INTEGER          project_menu: EV_MENU
3166                  -- Number of external commands in the tools menu.                          -- Menu for entries relative to the Project.
3167    
3168  old_cur: EV_CURSOR          recent_projects_menu: EB_RECENT_PROJECTS_MANAGER_MENU
3169                  -- Cursor saved while displaying the hourglass cursor.                          -- SubMenu for recent projects.
3170    
3171  cur_wid: EV_WIDGET          during_synchronization: BOOLEAN
3172                  -- Widget on which the hourglass cursor was set.                          -- Are we during a resynchronization?
3173    
3174  project_menu: EV_MENU          formatting_marks_command_menu_item: EB_COMMAND_MENU_ITEM
3175                  -- Menu for entries relative to the Project.                          -- Menu item used to shw/hide formatting marks.
3176    
3177  recent_projects_menu: EB_RECENT_PROJECTS_MANAGER_MENU          undo_accelerator: EV_ACCELERATOR
3178                  -- SubMenu for recent projects.                          -- Accelerator for Ctrl+Z
3179    
3180  during_synchronization: BOOLEAN          redo_accelerator: EV_ACCELERATOR
3181                  -- Are we during a resynchronization?                          -- Accelerator for Ctrl+Y
3182    
3183  formatting_marks_command_menu_item: EB_COMMAND_MENU_ITEM          feature {EB_TOOL} -- Implementation / Commands
                 -- Menu item used to shw/hide formatting marks.  
3184    
3185  undo_accelerator: EV_ACCELERATOR          shell_cmd: EB_OPEN_SHELL_COMMAND
3186                  -- Accelerator for Ctrl+Z                          -- Command to use an external editor.
3187    
3188  redo_accelerator: EV_ACCELERATOR          undo_cmd: EB_UNDO_COMMAND
3189                  -- Accelerator for Ctrl+Y                          -- Command to undo in the editor.
3190    
3191  feature {EB_TOOL} -- Implementation / Commands          redo_cmd: EB_REDO_COMMAND
3192                            -- Command to redo in the editor.
3193    
3194  shell_cmd: EB_OPEN_SHELL_COMMAND          editor_cut_cmd: EB_ON_SELECTION_COMMAND
3195                  -- Command to use an external editor.                          -- Command to cut text in the editor.
3196    
3197  undo_cmd: EB_UNDO_COMMAND          editor_copy_cmd: EB_ON_SELECTION_COMMAND
3198                  -- Command to undo in the editor.                          -- Command to copy text in the editor.
3199    
3200  redo_cmd: EB_REDO_COMMAND          editor_paste_cmd: EB_EDITOR_PASTE_COMMAND
3201                  -- Command to redo in the editor.                          -- Command to paste text in the editor.
3202    
3203  editor_cut_cmd: EB_ON_SELECTION_COMMAND          melt_cmd: EB_MELT_PROJECT_COMMAND
3204                  -- Command to cut text in the editor.                          -- Command to start compilation.
3205    
3206  editor_copy_cmd: EB_ON_SELECTION_COMMAND          freeze_cmd: EB_FREEZE_PROJECT_COMMAND
3207                  -- Command to copy text in the editor.                          -- Command to Freeze the project.
3208    
3209  editor_paste_cmd: EB_EDITOR_PASTE_COMMAND          finalize_cmd: EB_FINALIZE_PROJECT_COMMAND
3210                  -- Command to paste text in the editor.                          -- Command to Finalize the project.
3211    
3212  melt_cmd: EB_MELT_PROJECT_COMMAND          c_workbench_compilation_cmd: EB_C_COMPILATION_COMMAND
3213                  -- Command to start compilation.                          -- Command to compile the workbench C code.
3214    
3215  freeze_cmd: EB_FREEZE_PROJECT_COMMAND          c_finalized_compilation_cmd: EB_C_COMPILATION_COMMAND
3216                  -- Command to Freeze the project.                          -- Command to compile the finalized C code.
3217    
3218  finalize_cmd: EB_FINALIZE_PROJECT_COMMAND          new_cluster_cmd: EB_NEW_CLUSTER_COMMAND
3219                  -- Command to Finalize the project.                          -- Command to create a new cluster.
3220    
3221  c_workbench_compilation_cmd: EB_C_COMPILATION_COMMAND          new_class_cmd: EB_NEW_CLASS_COMMAND
3222                  -- Command to compile the workbench C code.                          -- Command to create a new class.
3223    
3224  c_finalized_compilation_cmd: EB_C_COMPILATION_COMMAND          new_feature_cmd: EB_NEW_FEATURE_COMMAND
3225                  -- Command to compile the finalized C code.                          -- Command to execute the feature wizard.
3226                            
3227            toggle_feature_signature_cmd: EB_TOGGLE_FEATURE_SIGNATURE_COMMAND
3228                            -- Show/Hide signature of feature node in eb_feature_tool
3229    
3230            toggle_stone_cmd: EB_UNIFY_STONE_CMD
3231                            -- Command to toggle between the stone management modes.
3232    
3233            delete_class_cluster_cmd: EB_DELETE_CLASS_CLUSTER_COMMAND
3234                            -- Command to remove a class or a cluster from the system
3235                            -- (permanent deletion).
3236    
3237            show_profiler: EB_SHOW_PROFILE_TOOL
3238                            -- What allows us to display the profiler window.
3239    
3240            toolbarable_commands: ARRAYED_LIST [EB_TOOLBARABLE_COMMAND]
3241                            -- All commands that can be put in a toolbar.
3242    
3243            command_controller: EB_EDITOR_COMMAND_CONTROLLER
3244                            -- Object that takes care of updating the sensitivity of all editor commands.
3245    
3246            save_as_cmd: EB_SAVE_FILE_AS_COMMAND
3247                            -- Command to save a class with a different file name.
3248    
3249            Edit_external_commands_cmd: EB_EXTERNAL_COMMANDS_EDITOR is
3250                            -- Command that lets the user add new external commands to the tools menu.
3251                    once
3252                            create Result.make
3253                            Result.enable_sensitive
3254                    end
3255    
3256            system_info_cmd: EB_STANDARD_CMD is
3257                            -- Command to display information about the system (root class,...)
3258                    do
3259                            Result := debugger_manager.system_info_cmd
3260                    end
3261    
3262            display_error_help_cmd: EB_ERROR_INFORMATION_CMD is
3263                            -- Command to pop up a dialog giving help on compilation errors.
3264                    do
3265                            Result := debugger_manager.display_error_help_cmd
3266                    end
3267    
3268  new_cluster_cmd: EB_NEW_CLUSTER_COMMAND          send_stone_to_context_cmd: EB_STANDARD_CMD
3269                  -- Command to create a new cluster.                          -- Command to send the current stone to the context tool.
3270    
3271  new_class_cmd: EB_NEW_CLASS_COMMAND          print_cmd: EB_PRINT_COMMAND
3272                  -- Command to create a new class.                          -- Command to print the content of editor with focus
3273    
3274  new_feature_cmd: EB_NEW_FEATURE_COMMAND          eac_browser_cmd: EB_OPEN_EAC_BROWSER_CMD is
3275                  -- Command to execute the feature wizard.                          -- Command to display the eac browser
3276                    do
3277                            Result := Debugger_manager.eac_browser_cmd
3278                    end            
3279    
3280            show_favorites_menu_item: EV_MENU_ITEM
3281                            -- Show/Hide favorites menu item.
3282    
3283            update_show_favorites_menu_item is
3284                            -- Update `show_favorites_menu_item' menu label.
3285                    do
3286                            if favorites_tool.shown then
3287                                    show_favorites_menu_item.set_text (Interface_names.m_Hide_favorites)
3288                            else
3289                                    show_favorites_menu_item.set_text (Interface_names.m_Show_favorites)
3290                            end
3291                    end
3292    
3293            execute_show_favorites is
3294                            -- Show `favorites_tool' if it is closed, close
3295                            -- it in the opposite case.
3296                    do
3297                            update_show_favorites_menu_item
3298                            if favorites_tool.shown then
3299                                    favorites_tool.close
3300                            else
3301                                    favorites_tool.show
3302                            end
3303                    end
3304                                    
3305  toggle_feature_signature_cmd: EB_TOGGLE_FEATURE_SIGNATURE_COMMAND          feature {EB_TOOL_WINDOW, EB_EXPLORER_BAR, EB_DEBUGGER_MANAGER} -- Floating tool handling
                 -- Show/Hide signature of feature node in eb_feature_tool  
3306    
3307  toggle_stone_cmd: EB_UNIFY_STONE_CMD          all_tool_windows: ARRAYED_LIST [EB_TOOL_WINDOW]
3308                  -- Command to toggle between the stone management modes.                  -- All tool windows under the control of `Current'.
3309    
3310  delete_class_cluster_cmd: EB_DELETE_CLASS_CLUSTER_COMMAND          add_tool_window (a_tool_window: EB_TOOL_WINDOW) is
3311                  -- Command to remove a class or a cluster from the system                          -- Add `a_tool_window' to `all_tool_windows', ensuring it is
3312                  -- (permanent deletion).                          -- then under the control of `Current'.
3313                    require
3314  show_profiler: EB_SHOW_PROFILE_TOOL                          a_tool_window_not_void: a_tool_window /= Void
3315                  -- What allows us to display the profiler window.                  do
3316                            if all_tool_windows = Void then
3317  toolbarable_commands: ARRAYED_LIST [EB_TOOLBARABLE_COMMAND]                                  create all_tool_windows.make (2)
3318                  -- All commands that can be put in a toolbar.                          end
3319                            all_tool_windows.extend (a_tool_window)
3320  command_controller: EB_EDITOR_COMMAND_CONTROLLER                  ensure
3321                  -- Object that takes care of updating the sensitivity of all editor commands.                          extended: all_tool_windows.has (a_tool_window)
3322                    end
3323  save_as_cmd: EB_SAVE_FILE_AS_COMMAND                  
3324                  -- Command to save a class with a different file name.          remove_tool_window (a_widget: EV_WIDGET) is
3325                            -- Remove tool window associate with `a_widget'.
3326  Edit_external_commands_cmd: EB_EXTERNAL_COMMANDS_EDITOR is                  require
3327                  -- Command that lets the user add new external commands to the tools menu.                          a_widget_not_void: a_widget /= Void
3328          once                  do
3329                  create Result.make                          if all_tool_windows /= Void then
3330                  Result.enable_sensitive                                  from
3331          end                                          all_tool_windows.start
3332                                    until
3333  system_info_cmd: EB_STANDARD_CMD is                                          all_tool_windows.off
3334                  -- Command to display information about the system (root class,...)                                  loop
3335          do                                          if all_tool_windows.item.tool = a_widget then
3336                  Result := debugger_manager.system_info_cmd                                                  all_tool_windows.remove
3337          end                                                  all_tool_windows.finish
3338                                            end
3339  display_error_help_cmd: EB_ERROR_INFORMATION_CMD is                                          all_tool_windows.forth
                 -- Command to pop up a dialog giving help on compilation errors.  
         do  
                 Result := debugger_manager.display_error_help_cmd  
         end  
   
 send_stone_to_context_cmd: EB_STANDARD_CMD  
                 -- Command to send the current stone to the context tool.  
   
 print_cmd: EB_PRINT_COMMAND  
                 -- Command to print the content of editor with focus  
   
 eac_browser_cmd: EB_OPEN_EAC_BROWSER_CMD is  
                 -- Command to display the eac browser  
         do  
                 Result := Debugger_manager.eac_browser_cmd  
         end              
   
 show_favorites_menu_item: EV_MENU_ITEM  
                 -- Show/Hide favorites menu item.  
   
 update_show_favorites_menu_item is  
                 -- Update `show_favorites_menu_item' menu label.  
         do  
                 if favorites_tool.shown then  
                         show_favorites_menu_item.set_text (Interface_names.m_Hide_favorites)  
                 else  
                         show_favorites_menu_item.set_text (Interface_names.m_Show_favorites)  
                 end  
         end  
   
 execute_show_favorites is  
                 -- Show `favorites_tool' if it is closed, close  
                 -- it in the opposite case.  
         do  
                 update_show_favorites_menu_item  
                 if favorites_tool.shown then  
                         favorites_tool.close  
                 else  
                         favorites_tool.show  
                 end  
         end  
           
 feature {EB_TOOL_WINDOW, EB_EXPLORER_BAR, EB_DEBUGGER_MANAGER} -- Floating tool handling  
   
 all_tool_windows: ARRAYED_LIST [EB_TOOL_WINDOW]  
         -- All tool windows under the control of `Current'.  
   
 add_tool_window (a_tool_window: EB_TOOL_WINDOW) is  
                 -- Add `a_tool_window' to `all_tool_windows', ensuring it is  
                 -- then under the control of `Current'.  
         require  
                 a_tool_window_not_void: a_tool_window /= Void  
         do  
                 if all_tool_windows = Void then  
                         create all_tool_windows.make (2)  
                 end  
                 all_tool_windows.extend (a_tool_window)  
         ensure  
                 extended: all_tool_windows.has (a_tool_window)  
         end  
           
 remove_tool_window (a_widget: EV_WIDGET) is  
                 -- Remove tool window associate with `a_widget'.  
         require  
                 a_widget_not_void: a_widget /= Void  
         do  
                 if all_tool_windows /= Void then  
                         from  
                                 all_tool_windows.start  
                         until  
                                 all_tool_windows.off  
                         loop  
                                 if all_tool_windows.item.tool = a_widget then  
                                         all_tool_windows.remove  
                                         all_tool_windows.finish  
                                 end  
                                 all_tool_windows.forth  
                         end  
                 end  
         end  
           
 remove_all_tool_windows is  
                 -- Ensure `all_tool_windows' is empty if non Void.  
         do  
                 if all_tool_windows /= Void then  
                         all_tool_windows.wipe_out  
                 end  
         ensure  
                 tool_windows_empty: all_tool_windows /= Void implies all_tool_windows.is_empty  
         end  
           
           
 window_moved (x_pos, y_pos: INTEGER) is  
                 -- `Current' has been moved, so move all associated tool windows within `all_tool_windows'.  
         local  
                 tool_window: EB_TOOL_WINDOW  
         do  
                 if all_tool_windows /= Void then  
                         from  
                                 all_tool_windows.start  
                         until  
                                 all_tool_windows.off  
                         loop  
                                 tool_window := all_tool_windows.item  
                                 check  
                                         not_destroyed: not tool_window.window.is_destroyed  
                                 end  
                                 if preferences.browsing_data.dock_tracking then  
                                         tool_window.window.move_actions.block  
                                         tool_window.window.set_x_position (x_pos + tool_window.x_position)  
                                         tool_window.window.set_y_position (y_pos + tool_window.y_position)  
                                         tool_window.window.move_actions.resume  
                                 else  
                                                 -- If we are not performing dock tracking, we must update the relative position  
                                                 -- of the tool window, so that if dock tracking is enabled, the relative  
                                                 -- positions are correct.  
                                         tool_window.set_x_position ( tool_window.window.screen_x - x_pos)  
                                         tool_window.set_y_position ( tool_window.window.screen_y - y_pos)  
3340                                  end                                  end
                                 all_tool_windows.forth  
3341                          end                          end
3342                  end                                      end
3343          end                  
3344                    remove_all_tool_windows is
3345  feature {NONE} -- Execution                          -- Ensure `all_tool_windows' is empty if non Void.
3346                    do
3347  Kcst: EV_KEY_CONSTANTS is                          if all_tool_windows /= Void then
3348                  -- A way to access key constants.                                  all_tool_windows.wipe_out
3349          once                          end
3350                  create Result                  ensure
3351          end                          tool_windows_empty: all_tool_windows /= Void implies all_tool_windows.is_empty
3352                    end
3353  toolbar_right_click_action (a_x, a_y, a_button: INTEGER; a_x_tilt, a_y_tilt, a_pressure: DOUBLE; a_screen_x, a_screen_y: INTEGER) is                  
3354                  -- Action called when the user right-click in the toolbar.                  
3355                  -- Display a popup menu to show/hide toolbars and customize the general toolbar.          window_moved (x_pos, y_pos: INTEGER) is
3356          local                          -- `Current' has been moved, so move all associated tool windows within `all_tool_windows'.
3357                  popup_menu: EV_MENU                  local
3358          do                          tool_window: EB_TOOL_WINDOW
3359                  if a_button = 3 then                  do
3360                          popup_menu := build_toolbar_menu                          if all_tool_windows /= Void then
3361                          popup_menu.show                                  from
3362                  end                                          all_tool_windows.start
3363          end                                  until
3364                                            all_tool_windows.off
3365  enable_commands_on_project_created is                                  loop
3366                  -- Enable commands when a new project has been created (not yet compiled)                                          tool_window := all_tool_windows.item
3367          do                                          check
3368                  system_info_cmd.enable_sensitive                                                  not_destroyed: not tool_window.window.is_destroyed
3369                  if                                          end
3370                          stone /= Void and then                                          if preferences.browsing_data.dock_tracking then
3371                          not unified_stone                                                  tool_window.window.move_actions.block
3372                  then                                                  tool_window.window.set_x_position (x_pos + tool_window.x_position)
3373                          send_stone_to_context_cmd.enable_sensitive                                                  tool_window.window.set_y_position (y_pos + tool_window.y_position)
3374                  end                                                  tool_window.window.move_actions.resume
3375          end                                          else
3376                                                            -- If we are not performing dock tracking, we must update the relative position
3377  enable_commands_on_project_loaded is                                                          -- of the tool window, so that if dock tracking is enabled, the relative
3378                  -- Enable commands when a new project has been created and compiled                                                          -- positions are correct.
3379          do                                                  tool_window.set_x_position ( tool_window.window.screen_x - x_pos)
3380                  if has_profiler then                                                  tool_window.set_y_position ( tool_window.window.screen_y - y_pos)
3381                          show_profiler.enable_sensitive                                          end
3382                  end                                          all_tool_windows.forth
3383                  if has_dll_generation then                                  end
3384                          show_dynamic_lib_tool.enable_sensitive                          end                    
3385                  end                  end
3386                  open_cmd.enable_sensitive                  
3387                  new_class_cmd.enable_sensitive          feature {NONE} -- Execution
3388                  new_cluster_cmd.enable_sensitive  
3389                  system_info_cmd.enable_sensitive          Kcst: EV_KEY_CONSTANTS is
3390                  if unified_stone then                          -- A way to access key constants.
3391                          send_stone_to_context_cmd.disable_sensitive                  once
3392                  elseif stone /= Void then                          create Result
3393                          send_stone_to_context_cmd.enable_sensitive                  end
3394                  end  
3395                  new_class_cmd.enable_sensitive          toolbar_right_click_action (a_x, a_y, a_button: INTEGER; a_x_tilt, a_y_tilt, a_pressure: DOUBLE; a_screen_x, a_screen_y: INTEGER) is
3396                  new_cluster_cmd.enable_sensitive                          -- Action called when the user right-click in the toolbar.
3397                  delete_class_cluster_cmd.enable_sensitive                          -- Display a popup menu to show/hide toolbars and customize the general toolbar.
3398                  c_workbench_compilation_cmd.enable_sensitive                  local
3399                  c_finalized_compilation_cmd.enable_sensitive                          popup_menu: EV_MENU
3400          end                  do
3401                            if a_button = 3 then
3402  disable_commands_on_project_unloaded is                                  popup_menu := build_toolbar_menu
3403                  -- Enable commands when a project has been closed.                                  popup_menu.show
3404          do                          end
3405                  if has_dll_generation then                  end
3406                          show_dynamic_lib_tool.disable_sensitive  
3407                  end          enable_commands_on_project_created is
3408                  if has_profiler then                          -- Enable commands when a new project has been created (not yet compiled)
3409                          show_profiler.disable_sensitive                  do
3410                  end                          system_info_cmd.enable_sensitive
3411                  open_cmd.disable_sensitive                          if
3412                  new_class_cmd.disable_sensitive                                  stone /= Void and then
3413                  new_cluster_cmd.disable_sensitive                                  not unified_stone
3414                  if not project_manager.is_created then                          then
3415                          system_info_cmd.disable_sensitive                                  send_stone_to_context_cmd.enable_sensitive
3416                          send_stone_to_context_cmd.disable_sensitive                          end
3417                  end                  end
3418                  delete_class_cluster_cmd.disable_sensitive  
3419                  c_workbench_compilation_cmd.disable_sensitive          enable_commands_on_project_loaded is
3420                  c_finalized_compilation_cmd.disable_sensitive                          -- Enable commands when a new project has been created and compiled
3421          end                  do
3422                            if has_profiler then
3423                                    show_profiler.enable_sensitive
3424                            end
3425                            if has_dll_generation then
3426                                    show_dynamic_lib_tool.enable_sensitive
3427                            end
3428                            open_cmd.enable_sensitive
3429                            new_class_cmd.enable_sensitive
3430                            new_cluster_cmd.enable_sensitive
3431                            system_info_cmd.enable_sensitive
3432                            if unified_stone then
3433                                    send_stone_to_context_cmd.disable_sensitive
3434                            elseif stone /= Void then
3435                                    send_stone_to_context_cmd.enable_sensitive
3436                            end
3437                            new_class_cmd.enable_sensitive
3438                            new_cluster_cmd.enable_sensitive
3439                            delete_class_cluster_cmd.enable_sensitive
3440                            c_workbench_compilation_cmd.enable_sensitive
3441                            c_finalized_compilation_cmd.enable_sensitive
3442                    end
3443    
3444            disable_commands_on_project_unloaded is
3445                            -- Enable commands when a project has been closed.
3446                    do
3447                            if has_dll_generation then
3448                                    show_dynamic_lib_tool.disable_sensitive
3449                            end
3450                            if has_profiler then
3451                                    show_profiler.disable_sensitive
3452                            end
3453                            open_cmd.disable_sensitive
3454                            new_class_cmd.disable_sensitive
3455                            new_cluster_cmd.disable_sensitive
3456                            if not project_manager.is_created then
3457                                    system_info_cmd.disable_sensitive
3458                                    send_stone_to_context_cmd.disable_sensitive
3459                            end
3460                            delete_class_cluster_cmd.disable_sensitive
3461                            c_workbench_compilation_cmd.disable_sensitive
3462                            c_finalized_compilation_cmd.disable_sensitive
3463                    end
3464    
3465  end -- class EB_DEVELOPMENT_WINDOW  end -- class EB_DEVELOPMENT_WINDOW
3466    

Legend:
Removed from v.50549  
changed lines
  Added in v.50607

  ViewVC Help
Powered by ViewVC 1.1.23