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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 50976 - (hide annotations)
Wed May 11 23:15:39 2005 UTC (14 years, 9 months ago) by neilc
Original Path: trunk/Src/bench/Eiffel/interface/new_graphical/windows/eb_development_window.e
File size: 101075 byte(s)
Further reorganization of preferences into a more simple, logical strucutre.

1 manus 26913 indexing
2     description : "Window holding a project tool"
3     date : "$Date$"
4     revision : "$Revision$"
5     author : "Arnaud PICHERY [ aranud@mail.dotcom.fr ]"
6    
7     class
8     EB_DEVELOPMENT_WINDOW
9    
10     inherit
11     EB_TOOL_MANAGER
12     redefine
13     make,
14     init_size_and_position,
15 rogers 40708 window_displayed,
16 manus 26913 init_commands,
17     build_menu_bar,
18     build_menus,
19     build_file_menu,
20     build_edit_menu,
21     build_view_menu,
22     build_tools_menu,
23     build_favorites_menu,
24     refresh,
25 xavier 27860 recycle,
26 manus 26913 destroy_imp,
27     destroy
28     end
29    
30     EB_FILEABLE
31     redefine
32     set_stone,
33     reset,
34     stone,
35     on_text_saved,
36     perform_check_before_save,
37     check_passed,
38     update_save_symbol
39     select
40     set_stone
41     end
42    
43     EB_FILEABLE
44     rename
45     set_stone as old_set_stone
46     export {NONE}
47     old_set_stone
48     redefine
49     reset,
50     stone,
51     on_text_saved,
52     perform_check_before_save,
53     check_passed,
54     update_save_symbol
55     end
56    
57    
58     -- Shared tools & contexts
59     SHARED_APPLICATION_EXECUTION
60    
61     SHARED_EIFFEL_PROJECT
62    
63     PROJECT_CONTEXT
64    
65     EB_SHARED_MANAGERS
66    
67     EB_SHARED_GRAPHICAL_COMMANDS
68    
69 neilc 49534 EB_SHARED_PREFERENCES
70 xavier 30020 export
71     {NONE} all
72     end
73 manus 26913
74     EV_STOCK_PIXMAPS
75    
76     EB_CONFIRM_SAVE_CALLBACK
77    
78     -- Errors
79     EB_GRAPHICAL_ERROR_MANAGER
80    
81     TEXT_OBSERVER
82     redefine
83     on_text_reset, on_text_edited,
84 xavier 27840 on_text_back_to_its_last_saved_state,
85 xavier 29812 on_text_fully_loaded, on_cursor_moved
86 manus 26913 end
87    
88     EV_KEY_CONSTANTS
89     export
90     {NONE} All
91     end
92 manus 47824
93 neilc 49534 EIFFEL_ENV
94     export
95     {NONE} All
96     end
97    
98 manus 47824 SHARED_TEXT_ITEMS
99     export
100     {NONE} All
101     end
102 manus 26913
103 julieng 37686 create {EB_WINDOW_MANAGER}
104 manus 26913 make,
105     make_as_context_tool,
106     make_as_editor
107    
108     feature {NONE} -- Initialization
109    
110     make_as_context_tool is
111     -- Create a new development window and expand the context tool.
112     do
113     make
114 rogers 40708 -- Perform window setting from `show_actions', as the
115     -- resizing executed as a result only works correctly
116     -- while the window is displayed.
117     window.show_actions.extend (agent set_context_mode)
118     end
119    
120     set_context_mode is
121     -- Set `current' into context mode, that is the context tool
122     -- maximized, and the non editor panel is hidden.
123     do
124 manus 26913 if not context_tool.shown then
125     context_tool.show
126     end
127     if not unified_stone then
128     toggle_stone_cmd.execute
129     end
130     context_tool.explorer_bar_item.maximize
131 rogers 40708 close_all_bars_except (right_panel)
132 manus 26913 end
133    
134     make_as_editor is
135     -- Create a new development window and expand the editor tool.
136     do
137     make
138 rogers 40708 -- Perform window setting from `show_actions', as the resizing executed
139     -- must be performed after `current' is displayed.
140     window.show_actions.extend (agent (editor_tool.explorer_bar_item).maximize)
141     window.show_actions.extend (agent close_all_bars_except (right_panel))
142 manus 26913 end
143    
144     make is
145     -- Create a new development window.
146     do
147 neilc 50976 unified_stone := preferences.development_window_data.context_unified_stone
148 manus 26913 -- Build the history manager, the address manager, ...
149     create history_manager.make (Current)
150     create address_manager.make (Current, False)
151     build_formatters
152     address_manager.set_formatters (managed_main_formatters)
153    
154     -- Init commands, build interface, build menus, ...
155     Precursor
156    
157     initialized := False -- Reset the flag since initialization is not yet complete.
158 xavier 28303 set_up_accelerators
159 xavier 28514
160     -- Create the toolbars.
161     build_toolbars_area
162     container.put_front (toolbars_area)
163     container.disable_item_expand (toolbars_area)
164 manus 26913
165     -- Update widgets visibilities
166 rogers 40708 window.show_actions.extend (agent update)
167 xavier 29812 status_bar.remove_cursor_position
168 xavier 29871 address_manager.set_output_line (status_bar.label)
169 manus 26913
170     -- Finish initializing the main editor formatters
171     end_build_formatters
172 xavier 28280
173     address_manager.disable_formatters
174 xavier 28303 if Eiffel_project.manager.is_project_loaded then
175 xavier 28304 on_project_created
176 xavier 28303 on_project_loaded
177 xavier 28304 elseif Eiffel_project.manager.is_created then
178     on_project_unloaded
179     on_project_created
180 xavier 28303 else
181     on_project_unloaded
182     end
183 neilc 33858
184     -- Create feature position table
185     create feature_positions.make (1)
186     feature_positions.compare_objects
187 rogers 40708
188     window.move_actions.force_extend (agent window_moved)
189 manus 26913
190     initialized := True
191     is_destroying := False
192     end
193    
194     init_size_and_position is
195     -- Initialize window size.
196     local
197     default_width, default_height: INTEGER
198     screen: EV_SCREEN
199     do
200     create screen
201 neilc 49534 default_width := preferences.development_window_data.width.min (screen.width)
202     default_height := preferences.development_window_data.height.min (screen.height)
203 manus 26913 window.set_size (default_width, default_height)
204 rogers 40708 end
205    
206     window_displayed is
207     -- `Current' has been displayed on screen.
208     do
209 manus 26913 -- Maximize window if needed.
210 neilc 49534 if preferences.development_window_data.is_maximized then
211 manus 26913 window.maximize
212     end
213     end
214    
215     init_commands is
216     -- Initialize commands.
217 xavier 27498 local
218     accel: EV_ACCELERATOR
219 manus 26913 do
220     Precursor
221     create toolbarable_commands.make (15)
222    
223     -- Open, save, ...
224     toolbarable_commands.extend (new_editor_cmd)
225    
226     toolbarable_commands.extend (new_context_tool_cmd)
227    
228     create open_cmd.make (Current)
229     toolbarable_commands.extend (open_cmd)
230    
231     create save_cmd.make (Current)
232     toolbarable_commands.extend (save_cmd)
233    
234     create save_as_cmd.make (Current)
235     if editor_tool = Void or else editor_tool.text_area.is_empty then
236     save_as_cmd.disable_sensitive
237     else
238     save_as_cmd.enable_sensitive
239     end
240    
241     create shell_cmd.make (Current)
242     toolbarable_commands.extend (shell_cmd)
243    
244     create print_cmd.make (Current)
245     if is_empty then
246     print_cmd.disable_sensitive
247     else
248     print_cmd.enable_sensitive
249     end
250     toolbarable_commands.extend (print_cmd)
251    
252     -- Compilation
253     create c_workbench_compilation_cmd.make_workbench (Current)
254     create c_finalized_compilation_cmd.make_finalized (Current)
255 xavier 27549 if has_dll_generation then
256     create show_dynamic_lib_tool.make
257     show_dynamic_lib_tool.set_menu_name (Interface_names.m_New_dynamic_lib)
258 manus 36309 show_dynamic_lib_tool.add_agent (agent show_dynamic_library_dialog)
259 xavier 27549 end
260     if has_profiler then
261     create show_profiler
262     end
263 manus 26913
264     -- Undo/redo, cut, copy, paste.
265     create undo_cmd.make (Current)
266     toolbarable_commands.extend (undo_cmd)
267    
268     create redo_cmd.make (Current)
269     toolbarable_commands.extend (redo_cmd)
270    
271     create editor_paste_cmd.make (Current)
272     toolbarable_commands.extend (editor_paste_cmd)
273    
274     create new_cluster_cmd.make (Current)
275     toolbarable_commands.extend (new_cluster_cmd)
276    
277     create new_class_cmd.make (Current)
278     toolbarable_commands.extend (new_class_cmd)
279    
280     create delete_class_cluster_cmd.make (Current)
281     toolbarable_commands.extend (delete_class_cluster_cmd)
282    
283     create new_feature_cmd.make (Current)
284     toolbarable_commands.extend (new_feature_cmd)
285 jfiat 42965
286     create toggle_feature_signature_cmd.make (Current)
287 jfiat 42973 toolbarable_commands.extend (toggle_feature_signature_cmd)
288 manus 26913
289     create toggle_stone_cmd.make (Current)
290     toolbarable_commands.extend (toggle_stone_cmd)
291    
292     create send_stone_to_context_cmd.make
293     send_stone_to_context_cmd.set_pixmaps (Pixmaps.Icon_send_stone_down)
294     send_stone_to_context_cmd.set_tooltip (Interface_names.e_Send_stone_to_context)
295     send_stone_to_context_cmd.set_menu_name (Interface_names.m_Send_stone_to_context)
296     send_stone_to_context_cmd.set_name ("Send_to_context")
297 king 46348 send_stone_to_context_cmd.set_tooltext (Interface_names.b_Send_stone_to_context)
298 manus 36309 send_stone_to_context_cmd.add_agent (agent send_stone_to_context)
299 xavier 27498 create accel.make_with_key_combination (
300     create {EV_KEY}.make_with_code (Kcst.Key_down), False, True, False
301     )
302 manus 36309 accel.actions.extend (agent send_stone_to_context)
303 xavier 27498 send_stone_to_context_cmd.set_accelerator (accel)
304 manus 26913 send_stone_to_context_cmd.disable_sensitive
305     toolbarable_commands.extend (send_stone_to_context_cmd)
306    
307     toolbarable_commands.extend (window_manager.minimize_all_cmd)
308     window_manager.minimize_all_cmd.enable_sensitive
309     toolbarable_commands.extend (window_manager.raise_all_cmd)
310     window_manager.raise_all_cmd.enable_sensitive
311    
312     toolbarable_commands.extend (New_development_window_cmd)
313     -- Show tool/toolbar commands (will be filled when tools will
314     -- be created)
315     create show_tool_commands.make (7)
316     create show_toolbar_commands.make (3)
317    
318 xavier 28303 new_feature_cmd.disable_sensitive
319 jfiat 42965 toggle_feature_signature_cmd.disable_sensitive
320 xavier 28303
321     create editors.make (5)
322     end
323    
324     set_up_accelerators is
325     -- Fill the accelerator of `window' with the accelerators of the `toolbarable_commands'.
326     do
327 manus 26913 from
328     toolbarable_commands.start
329     until
330     toolbarable_commands.after
331     loop
332     if toolbarable_commands.item.accelerator /= Void then
333     window.accelerators.extend (toolbarable_commands.item.accelerator)
334     end
335     toolbarable_commands.forth
336     end
337    
338     from
339     debugger_manager.toolbarable_commands.start
340     until
341     debugger_manager.toolbarable_commands.after
342     loop
343     if
344     debugger_manager.toolbarable_commands.item.accelerator /= Void
345     then
346     window.accelerators.extend (debugger_manager.toolbarable_commands.item.accelerator)
347     end
348     debugger_manager.toolbarable_commands.forth
349     end
350     end
351    
352     build_formatters is
353     -- Build all formatters used.
354     local
355     form: EB_CLASS_TEXT_FORMATTER
356     accel: EV_ACCELERATOR
357     do
358 neilc 33294 create managed_class_formatters.make (17)
359 manus 26913 managed_class_formatters.extend (create {EB_CLICKABLE_FORMATTER}.make (Current))
360     managed_class_formatters.extend (create {EB_FLAT_FORMATTER}.make (Current))
361     managed_class_formatters.extend (create {EB_SHORT_FORMATTER}.make (Current))
362     managed_class_formatters.extend (create {EB_FLAT_SHORT_FORMATTER}.make (Current))
363     managed_class_formatters.extend (Void)
364     managed_class_formatters.extend (create {EB_ANCESTORS_FORMATTER}.make (Current))
365     managed_class_formatters.extend (create {EB_DESCENDANTS_FORMATTER}.make (Current))
366     managed_class_formatters.extend (create {EB_CLIENTS_FORMATTER}.make (Current))
367     managed_class_formatters.extend (create {EB_SUPPLIERS_FORMATTER}.make (Current))
368     managed_class_formatters.extend (Void)
369     managed_class_formatters.extend (create {EB_ATTRIBUTES_FORMATTER}.make (Current))
370     managed_class_formatters.extend (create {EB_ROUTINES_FORMATTER}.make (Current))
371     managed_class_formatters.extend (create {EB_DEFERREDS_FORMATTER}.make (Current))
372     managed_class_formatters.extend (create {EB_ONCES_FORMATTER}.make (Current))
373     managed_class_formatters.extend (create {EB_EXTERNALS_FORMATTER}.make (Current))
374     managed_class_formatters.extend (create {EB_EXPORTED_FORMATTER}.make (Current))
375    
376 manus 48565 create managed_feature_formatters.make (12)
377 manus 26913 managed_feature_formatters.extend (create {EB_BASIC_FEATURE_FORMATTER}.make (Current))
378     managed_feature_formatters.extend (create {EB_ROUTINE_FLAT_FORMATTER}.make (Current))
379     managed_feature_formatters.extend (Void)
380 manus 48565 managed_feature_formatters.extend (create {EB_CALLERS_FORMATTER}.make (Current, 0))
381     managed_feature_formatters.extend (create {EB_CALLERS_FORMATTER}.make (Current,
382 manus 49446 {DEPEND_UNIT}.is_in_assignment_flag))
383 manus 48565 managed_feature_formatters.extend (create {EB_CALLERS_FORMATTER}.make (Current,
384 manus 49446 {DEPEND_UNIT}.is_in_creation_flag))
385 manus 48565 managed_feature_formatters.extend (Void)
386 manus 26913 managed_feature_formatters.extend (create {EB_IMPLEMENTERS_FORMATTER}.make (Current))
387     managed_feature_formatters.extend (create {EB_ROUTINE_ANCESTORS_FORMATTER}.make (Current))
388     managed_feature_formatters.extend (create {EB_ROUTINE_DESCENDANTS_FORMATTER}.make (Current))
389 manus 48565 managed_feature_formatters.extend (Void)
390 manus 26913 managed_feature_formatters.extend (create {EB_HOMONYMS_FORMATTER}.make (Current))
391 neilc 33294
392 manus 26913
393 neilc 33294 create managed_main_formatters.make (6)
394    
395    
396 manus 26913 create {EB_BASIC_TEXT_FORMATTER} form.make (Current)
397     create accel.make_with_key_combination (
398     create {EV_KEY}.make_with_code (Kcst.Key_t),
399     True, False, True)
400 manus 36309 accel.actions.extend (agent form.execute)
401 manus 26913 form.set_accelerator (accel)
402     managed_main_formatters.extend (form)
403    
404     create {EB_CLICKABLE_FORMATTER} form.make (Current)
405     create accel.make_with_key_combination (
406     create {EV_KEY}.make_with_code (Kcst.Key_c),
407     True, False, True)
408 manus 36309 accel.actions.extend (agent form.execute)
409 manus 26913 form.set_accelerator (accel)
410     managed_main_formatters.extend (form)
411    
412     create {EB_FLAT_FORMATTER} form.make (Current)
413     create accel.make_with_key_combination (
414     create {EV_KEY}.make_with_code (Kcst.Key_f),
415     True, False, True)
416 manus 36309 accel.actions.extend (agent form.execute)
417 manus 26913 form.set_accelerator (accel)
418     managed_main_formatters.extend (form)
419    
420     create {EB_SHORT_FORMATTER} form.make (Current)
421     create accel.make_with_key_combination (
422     create {EV_KEY}.make_with_code (Kcst.Key_o),
423     True, False, True)
424 manus 36309 accel.actions.extend (agent form.execute)
425 manus 26913 form.set_accelerator (accel)
426     managed_main_formatters.extend (form)
427    
428     create {EB_FLAT_SHORT_FORMATTER} form.make (Current)
429     create accel.make_with_key_combination (
430     create {EV_KEY}.make_with_code (Kcst.Key_i),
431     True, False, True)
432 manus 36309 accel.actions.extend (agent form.execute)
433 manus 26913 form.set_accelerator (accel)
434 neilc 33294 managed_main_formatters.extend (form)
435 manus 26913 end
436    
437     end_build_formatters is
438 manus 33315 -- Finish initialization of formatters (associate them with editor
439     -- and select a formatter).
440 manus 26913 local
441     f_ind: INTEGER
442     do
443     from
444     managed_class_formatters.start
445     until
446     managed_class_formatters.after
447     loop
448     if managed_class_formatters.item /= Void then
449     managed_class_formatters.item.set_manager (context_tool)
450     end
451     managed_class_formatters.forth
452     end
453     from
454     managed_feature_formatters.start
455     until
456     managed_feature_formatters.after
457     loop
458     if managed_feature_formatters.item /= Void then
459     managed_feature_formatters.item.set_manager (context_tool)
460     end
461     managed_feature_formatters.forth
462     end
463     from
464     managed_main_formatters.start
465     until
466     managed_main_formatters.after
467     loop
468     managed_main_formatters.item.set_editor (editor_tool.text_area)
469     managed_main_formatters.item.on_shown
470     if managed_main_formatters.item.accelerator /= Void then
471     window.accelerators.extend (managed_main_formatters.item.accelerator)
472     end
473     managed_main_formatters.forth
474     end
475    
476     (managed_main_formatters @ 1).enable_select;
477    
478     -- We now select the correct class formatter.
479 neilc 49534 f_ind := preferences.formatter_data.default_class_formatter_index
480 manus 26913 --| This takes the formatter separators in consideration.
481 neilc 33365 if f_ind > 4 then
482 manus 26913 f_ind := f_ind + 1
483     end
484 neilc 33365 if f_ind > 8 then
485 manus 26913 f_ind := f_ind + 1
486     end
487     if f_ind < 1 or f_ind > managed_class_formatters.count then
488 neilc 33365 f_ind := 6
489 manus 26913 end
490 neilc 33365 (managed_class_formatters @ f_ind).enable_select;
491 manus 26913 -- We now select the correct feature formatter.
492 neilc 49534 f_ind := preferences.formatter_data.default_feature_formatter_index
493 manus 26913 if f_ind > 2 then
494     f_ind := f_ind + 1
495     end
496     if f_ind < 1 or f_ind > managed_feature_formatters.count then
497     f_ind := 2
498     end
499 manus 33315 managed_class_formatters.i_th (f_ind).enable_select
500 manus 26913 end
501    
502     build_tools is
503     -- Build all tools that can take place in this window and put them
504     -- in `left_tools' or `bottom_tools'.
505     local
506     show_cmd: EB_SHOW_TOOL_COMMAND
507     do
508 rogers 43098 lock_update
509 manus 26913 -- Build the features tool
510 jfiat 48452 create features_tool.make (Current)
511     features_tool.attach_to_explorer_bar (left_panel)
512 manus 26913 left_tools.extend (features_tool.explorer_bar_item)
513     create show_cmd.make (Current, features_tool.explorer_bar_item)
514     show_tool_commands.extend (show_cmd)
515     toolbarable_commands.extend (show_cmd)
516     add_recyclable (features_tool)
517    
518     -- Build the cluster tool
519 jfiat 48452 create cluster_tool.make (Current, Current)
520     cluster_tool.attach_to_explorer_bar (left_panel)
521 manus 26913 left_tools.extend (cluster_tool.explorer_bar_item)
522     create show_cmd.make (Current, cluster_tool.explorer_bar_item)
523     show_tool_commands.extend (show_cmd)
524     toolbarable_commands.extend (show_cmd)
525     add_recyclable (cluster_tool)
526    
527     -- Build the favorites tool
528 jfiat 48452 create favorites_tool.make (Current, favorites_manager)
529     favorites_tool.attach_to_explorer_bar (left_panel)
530 manus 26913 left_tools.extend (favorites_tool.explorer_bar_item)
531     create show_cmd.make (Current, favorites_tool.explorer_bar_item)
532     show_tool_commands.extend (show_cmd)
533     toolbarable_commands.extend (show_cmd)
534     add_recyclable (favorites_tool)
535    
536     -- Build the windows tool (formerly known as Selector tool)
537 jfiat 48452 create windows_tool.make (Current)
538     windows_tool.attach_to_explorer_bar (left_panel)
539 manus 26913 left_tools.extend (windows_tool.explorer_bar_item)
540     create show_cmd.make (Current, windows_tool.explorer_bar_item)
541     show_tool_commands.extend (show_cmd)
542     toolbarable_commands.extend (show_cmd)
543     add_recyclable (windows_tool)
544    
545     -- Build the search tool
546 jfiat 48452 create search_tool.make (Current)
547     search_tool.attach_to_explorer_bar (left_panel)
548 manus 26913 left_tools.extend (search_tool.explorer_bar_item)
549     create show_cmd.make (Current, search_tool.explorer_bar_item)
550     show_tool_commands.extend (show_cmd)
551     toolbarable_commands.extend (show_cmd)
552     add_recyclable (search_tool)
553    
554     -- Build the editor tool
555 jfiat 48452 create editor_tool.make (Current)
556     editor_tool.attach_to_explorer_bar (right_panel)
557 manus 26913 bottom_tools.extend (editor_tool.explorer_bar_item)
558     editor_tool.text_area.add_edition_observer(save_cmd)
559     editor_tool.text_area.add_edition_observer(save_as_cmd)
560     editor_tool.text_area.add_edition_observer(print_cmd)
561     editor_tool.text_area.add_edition_observer(Current)
562 manus 36309 editor_tool.text_area.drop_actions.set_veto_pebble_function (agent can_drop)
563 xavier 29812 editor_tool.text_area.add_cursor_observer (Current)
564 rogers 40708
565     -- The minimim height masks a bug on windows to do with the sizing of the editors
566     -- scroll bars, which were affecting the resizing although they should not have done so.
567     -- Having a default minimum height on the editor is perfectly reasonable.
568     editor_tool.widget.set_minimum_height (20)
569 manus 26913 add_recyclable (editor_tool)
570    
571     -- Build the context tool
572 jfiat 48452 create context_tool.make (Current)
573     context_tool.attach_to_explorer_bar (right_panel)
574 manus 26913 bottom_tools.extend (context_tool.explorer_bar_item)
575     create show_cmd.make (Current, context_tool.explorer_bar_item)
576     show_tool_commands.extend (show_cmd)
577     toolbarable_commands.extend (show_cmd)
578     add_recyclable (context_tool)
579    
580     -- Set the flag "Tools initialized"
581     tools_initialized := True
582    
583     -- Initialize undo / redo accelerators
584     create undo_accelerator.make_with_key_combination (create {EV_KEY}.make_with_code (Key_z), True, False, False)
585 xavier 27549 if has_case then
586     undo_accelerator.actions.extend (agent (context_tool.editor.undo_cmd).on_ctrl_z)
587     end
588 manus 26913 undo_accelerator.actions.extend (agent undo_cmd.accelerator_execute)
589     create redo_accelerator.make_with_key_combination (create {EV_KEY}.make_with_code (Key_y), True, False, False)
590 xavier 27549 if has_case then
591     redo_accelerator.actions.extend (agent (context_tool.editor.redo_cmd).on_ctrl_y)
592     end
593 manus 26913 redo_accelerator.actions.extend (agent redo_cmd.accelerator_execute)
594     window.accelerators.extend (undo_accelerator)
595     window.accelerators.extend (redo_accelerator)
596 rogers 43098 unlock_update
597 manus 26913 end
598    
599     feature -- Access
600    
601     cluster: CLUSTER_I is
602     -- Cluster for current class. Void if none.
603     local
604     classi_stone: CLASSI_STONE
605     cluster_stone: CLUSTER_STONE
606     do
607     classi_stone ?= stone
608     if classi_stone /= Void then
609     Result := classi_stone.cluster
610     end
611     cluster_stone ?= stone
612     if cluster_stone /= Void then
613     Result := cluster_stone.cluster_i
614     end
615     end
616    
617     class_name: STRING is
618     -- Name of the current class, Void if none.
619     local
620     class_stone: CLASSI_STONE
621     do
622     class_stone ?= stone
623     if class_stone /= Void then
624     Result := class_stone.class_name
625     end
626     end
627    
628     feature_name: STRING is
629     -- Name of the current feature, Void if none.
630     local
631     feature_stone: FEATURE_STONE
632     do
633     feature_stone ?= stone
634     if feature_stone /= Void then
635     Result := feature_stone.feature_name
636     end
637     end
638    
639 xavier 30005 feature -- Status setting
640    
641     disable_sensitive is
642     -- Disable sensitivity of all widgets.
643     do
644     window.disable_sensitive
645     end
646    
647     enable_sensitive is
648     -- Enable sensitivity of all widgets.
649     do
650     window.enable_sensitive
651     end
652    
653 manus 26913 feature -- Window Settings
654    
655     set_initialized is
656     -- Set `initialized' to True.
657     do
658     initialized := True
659     end
660    
661     set_text (a_text: STRING) is
662     -- Assign `a_text' to `text'.
663     require
664     a_text_not_void: a_text /= Void
665     do
666 neilc 49534 editor_tool.text_area.set_editor_text (a_text)
667 manus 26913 ensure
668     --| FIXME This needs to work: text_assigned: text.is_equal (a_text)
669     --| FIXME changed_flag_set: changed
670     end
671    
672     feature -- Window Properties
673    
674     changed: BOOLEAN is
675     -- Has something been changed and not yet been saved?
676     do
677     Result := editor_tool.changed
678     end
679    
680     is_empty: BOOLEAN is
681     -- Does `Current's text is empty?
682     do
683     Result := editor_tool = Void or else editor_tool.text_area.is_empty
684     end
685    
686     text: STRING is
687     -- Text representing Current
688     do
689     Result := editor_tool.text_area.text
690     end
691    
692     pixmap: EV_PIXMAP is
693     -- Pixmap representing Current window.
694     do
695     Result := Pixmaps.Icon_development_window
696     end
697    
698     preference_tool_is_hidden: BOOLEAN
699     -- Is the preference tool hidden?
700    
701     profile_tool_is_hidden: BOOLEAN
702     -- Is the profile tool hidden?
703 neilc 33002
704     has_argument_dialog: BOOLEAN is
705     -- Does Current have an associted arguments dialog?
706     do
707     Result := arguments_dialog /= Void
708     end
709 manus 26913
710     feature -- Pulldown Menus
711    
712     metric_menu: EV_MENU
713     -- Menu for entries of metric tool.
714    
715     format_menu: EV_MENU
716     -- ID Menu for formats.
717     -- Only used during debugging
718    
719     compile_menu: EV_MENU
720     -- Compile ID menu.
721    
722     debug_menu: EV_MENU
723     -- Debug ID menu.
724    
725     active_menus (erase: BOOLEAN) is
726     -- Enable all the menus and if `erase' clean
727     -- the content of the Project tool.
728     do
729     compile_menu.enable_sensitive
730     if erase then
731     output_manager.clear
732     end
733     end
734    
735     disable_menus is
736     -- Disable all the menus.
737     do
738     compile_menu.disable_sensitive
739     end
740    
741     feature -- Modifiable menus
742    
743     melt_menu_item: EV_MENU_ITEM
744     -- Melt menu entry
745    
746     freeze_menu_item: EV_MENU_ITEM
747     -- Freeze menu entry
748    
749     finalize_menu_item: EV_MENU_ITEM
750     -- Finalize menu entry
751    
752     feature -- Update
753    
754     synchronize is
755     -- Synchronize stones.
756     local
757     st: STONE
758     do
759     during_synchronization := True
760     favorites_manager.refresh
761     context_tool.synchronize
762     cluster_tool.synchronize
763     history_manager.synchronize
764     features_tool.synchronize
765     if stone /= Void then
766     st := stone.synchronized_stone
767     end
768 manus 27952 editor_tool.text_area.update_click_list (False)
769 manus 26913 set_stone (st)
770     update_save_symbol
771     address_manager.refresh
772     during_synchronization := False
773     end
774    
775     synchronize_routine_tool_to_default is
776     -- Synchronize the editor tool to the debug format.
777     do
778     --| FIXME ARNAUD: To be implemented
779     end
780    
781     clear_object_tool is
782     -- Clear the contents of the object tool if shown.
783     do
784     --| FIXME ARNAUD: To be implemented
785     end
786    
787     build_menus is
788     -- Build all menus displayed in the development window.
789     do
790     -- Build each menu
791     build_file_menu
792     build_edit_menu
793     build_view_menu
794     build_favorites_menu
795     build_project_menu
796     build_debug_menu
797     build_tools_menu
798     build_window_menu
799     build_help_menu
800     -- Build the menu bar.
801     build_menu_bar
802     end
803    
804     build_debug_menu is
805     -- Build the `Debug' menu through the debugger_manager.
806     local
807     conv_mit: EB_COMMAND_MENU_ITEM
808     do
809     debug_menu := debugger_manager.new_debug_menu
810     from
811     debug_menu.start
812     until
813     debug_menu.after
814     loop
815     conv_mit ?= debug_menu.item
816     if conv_mit /= Void then
817     add_recyclable (conv_mit)
818     end
819     debug_menu.forth
820     end
821     end
822    
823     build_menu_bar is
824     -- Build the menu bar
825     local
826     mb: EV_MENU_BAR
827     do
828     check
829     window.menu_bar /= Void implies not window.menu_bar.is_empty
830     -- If a menu bar was already present, it shouldn't be empty.
831     end
832     if window.menu_bar /= Void then
833     mb := window.menu_bar
834     from
835     mb.start
836     mb.forth
837     until
838     mb.after
839     loop
840     mb.remove
841     end
842     else
843     create mb
844     window.set_menu_bar (mb)
845     mb.extend (file_menu)
846     end
847    
848     if Eiffel_project.manager.is_created then
849     mb.extend (edit_menu)
850     mb.extend (view_menu)
851     mb.extend (favorites_menu)
852     mb.extend (project_menu)
853     mb.extend (debug_menu)
854     else
855     mb.extend (view_menu)
856     end
857     mb.extend (tools_menu)
858     mb.extend (window_menu)
859     mb.extend (help_menu)
860     end
861    
862     feature -- Graphical Interface
863    
864     build_general_toolbar is
865     -- Set up the general toolbar (New, Save, Search, Shell, Undo, Redo, ...)
866     local
867     cell: EV_CELL
868     hsep: EV_HORIZONTAL_SEPARATOR
869     hbox: EV_HORIZONTAL_BOX
870     do
871     -- Create the toolbar.
872     create general_toolbar
873 neilc 49534 general_customizable_toolbar := preferences.development_window_data.retrieve_general_toolbar (toolbarable_commands)
874     if preferences.development_window_data.show_text_in_general_toolbar then
875 king 46348 general_customizable_toolbar.enable_important_text
876 neilc 49534 elseif preferences.development_window_data.show_all_text_in_general_toolbar then
877 manus 26913 general_customizable_toolbar.enable_text_displayed
878     end
879 king 46348
880 manus 26913 create hbox
881     hbox.extend (general_customizable_toolbar.widget)
882     hbox.disable_item_expand (general_customizable_toolbar.widget)
883    
884     -- Generate the toolbar.
885     general_customizable_toolbar.update_toolbar
886    
887     -- Cell to fill in empty space and receive the right click menu holder.
888     create cell
889 manus 36309 cell.pointer_button_release_actions.extend (agent toolbar_right_click_action)
890 manus 26913 hbox.extend (cell)
891    
892     -- Create the vertical layout (separator + toolbar)
893     create hsep
894     general_toolbar.set_padding (2)
895     general_toolbar.extend (hsep)
896     general_toolbar.disable_item_expand (hsep)
897     general_toolbar.extend (hbox)
898    
899     -- Create the command to show/hide this toolbar.
900     create show_general_toolbar_command.make (general_toolbar, Interface_names.m_General_toolbar)
901     show_toolbar_commands.extend (show_general_toolbar_command)
902 neilc 49534 if preferences.development_window_data.show_general_toolbar then
903 manus 26913 show_general_toolbar_command.enable_visible
904     else
905     show_general_toolbar_command.disable_visible
906     end
907    
908     end
909    
910     build_address_toolbar is
911     -- Set up the address toolbar (Back, Forward, Current, Class name, feature name, ...)
912     local
913     tb: EV_TOOL_BAR
914     -- address_bar: EV_HORIZONTAL_BOX -- Contains "Class" + Combobox + "Feature" + Combobox + "Format" + Combobox
915     hsep: EV_HORIZONTAL_SEPARATOR
916     hbox: EV_HORIZONTAL_BOX -- Contains HistoryToolbar (back, forth, current) + `address_bar'
917     cell: EV_CELL
918 xavier 27498 accel: EV_ACCELERATOR
919 manus 26913 do
920     -- Create the toolbar
921     create address_toolbar
922     create hsep
923     create hbox
924     -- create address_bar
925     create tb
926     address_toolbar.set_padding (2)
927     address_toolbar.extend (hsep)
928     address_toolbar.disable_item_expand (hsep)
929     address_toolbar.extend (hbox)
930    
931     hbox.extend (tb)
932     hbox.disable_item_expand (tb)
933     -- hbox.extend (address_bar)
934     -- hbox.disable_item_expand (address_bar)
935    
936     -- Back icon
937     tb.extend (history_manager.back_command.new_toolbar_item (False, False))
938    
939     -- Forward icon
940     tb.extend (history_manager.forth_command.new_toolbar_item (False, False))
941 xavier 27498
942     -- Set up the accelerators.
943     create accel.make_with_key_combination (
944     create {EV_KEY}.make_with_code (Kcst.Key_right), False, True, False
945     )
946 manus 36309 accel.actions.extend (agent on_forth)
947 xavier 27498 window.accelerators.extend (accel)
948    
949     create accel.make_with_key_combination (
950     create {EV_KEY}.make_with_code (Kcst.Key_left), False, True, False
951     )
952 manus 36309 accel.actions.extend (agent on_back)
953 xavier 27498 window.accelerators.extend (accel)
954 manus 26913
955     ------------------------------------------
956     -- Address bar (Class name & feature name)
957     ------------------------------------------
958     hbox.extend (address_manager.widget)
959 neilc 49534 -- editor_tool.text_area.add_cursor_observer (address_manager)
960 manus 26913
961     -- Create the command to show/hide this toolbar.
962     create show_address_toolbar_command.make (address_toolbar, Interface_names.m_Address_toolbar)
963     show_toolbar_commands.extend (show_address_toolbar_command)
964    
965 neilc 49534 if preferences.development_window_data.show_address_toolbar then
966 manus 26913 show_address_toolbar_command.enable_visible
967     else
968     show_address_toolbar_command.disable_visible
969     end
970    
971     -- Cell to fill in empty space and receive the right click menu holder.
972     create cell
973 manus 36309 cell.pointer_button_release_actions.extend (agent toolbar_right_click_action)
974 manus 26913 hbox.extend (cell)
975     end
976    
977     build_project_toolbar is
978     -- Build toolbar corresponding to the project options bar
979     local
980     cell: EV_CELL
981     hsep: EV_HORIZONTAL_SEPARATOR
982     hbox: EV_HORIZONTAL_BOX
983     do
984     create project_toolbar
985     create hsep
986     project_toolbar.extend (hsep)
987     project_toolbar.disable_item_expand (hsep)
988    
989     -- Generate the toolbar.
990     create hbox
991     project_customizable_toolbar := debugger_manager.new_toolbar
992     hbox.extend (project_customizable_toolbar.widget)
993     hbox.disable_item_expand (project_customizable_toolbar.widget)
994    
995     project_customizable_toolbar.update_toolbar
996    
997     -- Create the command to show/hide this toolbar.
998     create show_project_toolbar_command.make (project_toolbar, Interface_names.m_Project_toolbar)
999     show_toolbar_commands.extend (show_project_toolbar_command)
1000 neilc 49534 if preferences.development_window_data.show_project_toolbar then
1001 manus 26913 show_project_toolbar_command.enable_visible
1002     else
1003     show_project_toolbar_command.disable_visible
1004     end
1005    
1006     -- Cell to fill in empty space and receive the right click menu holder.
1007     create cell
1008 manus 36309 cell.pointer_button_release_actions.extend (agent toolbar_right_click_action)
1009 manus 26913 hbox.extend (cell)
1010     project_toolbar.extend (hbox)
1011     end
1012    
1013 manus 45562 feature {NONE} -- Menu Building
1014 manus 26913
1015     build_file_menu is
1016     -- Build the file menu.
1017     local
1018     new_project_cmd: EB_NEW_PROJECT_COMMAND
1019     open_project_cmd: EB_OPEN_PROJECT_COMMAND
1020     send_to_menu: EV_MENU
1021     menu_item: EV_MENU_ITEM
1022     command_menu_item: EB_COMMAND_MENU_ITEM
1023     do
1024     create file_menu.make_with_text (Interface_names.m_File)
1025    
1026     -- New
1027     command_menu_item := New_development_window_cmd.new_menu_item
1028     add_recyclable (command_menu_item)
1029     file_menu.extend (command_menu_item)
1030    
1031     -- New editor
1032     command_menu_item := New_editor_cmd.new_menu_item
1033     add_recyclable (command_menu_item)
1034     file_menu.extend (command_menu_item)
1035    
1036     -- New context tool
1037     command_menu_item := New_context_tool_cmd.new_menu_item
1038     add_recyclable (command_menu_item)
1039     file_menu.extend (command_menu_item)
1040    
1041     -- Open
1042     command_menu_item := open_cmd.new_menu_item
1043     add_recyclable (command_menu_item)
1044     file_menu.extend (command_menu_item)
1045    
1046     -- Close
1047     create menu_item.make_with_text (Interface_names.m_Close)
1048 manus 36309 menu_item.select_actions.extend (agent destroy)
1049 manus 26913 file_menu.extend (menu_item)
1050    
1051     -- Separator --------------------------------------
1052     file_menu.extend (create {EV_MENU_SEPARATOR})
1053    
1054     -- Save
1055     command_menu_item := save_cmd.new_menu_item
1056     add_recyclable (command_menu_item)
1057     file_menu.extend (command_menu_item)
1058    
1059     -- Save as
1060     command_menu_item := save_as_cmd.new_menu_item
1061     add_recyclable (command_menu_item)
1062     file_menu.extend (command_menu_item)
1063    
1064     -- Sent to
1065     create send_to_menu.make_with_text (Interface_names.m_Send_to)
1066     -- External editor
1067     command_menu_item := shell_cmd.new_menu_item
1068     add_recyclable (command_menu_item)
1069     send_to_menu.extend (command_menu_item)
1070     file_menu.extend (send_to_menu)
1071    
1072     -- Separator --------------------------------------
1073     file_menu.extend (create {EV_MENU_SEPARATOR})
1074     command_menu_item := print_cmd.new_menu_item
1075     add_recyclable (command_menu_item)
1076     file_menu.extend (command_menu_item)
1077    
1078     -- Separator --------------------------------------
1079     file_menu.extend (create {EV_MENU_SEPARATOR})
1080    
1081     -- New Project
1082     create new_project_cmd.make_with_parent (window)
1083     create menu_item.make_with_text (Interface_names.m_New_project)
1084 manus 36309 menu_item.select_actions.extend (agent new_project_cmd.execute)
1085 manus 26913 file_menu.extend (menu_item)
1086    
1087     -- Open Project
1088     create open_project_cmd.make_with_parent (window)
1089     create menu_item.make_with_text (Interface_names.m_Open_project)
1090     menu_item.select_actions.extend (agent open_project_cmd.execute)
1091     file_menu.extend (menu_item)
1092    
1093     -- Recent Projects
1094     recent_projects_menu := recent_projects_manager.new_menu
1095     add_recyclable (recent_projects_menu)
1096     file_menu.extend (recent_projects_menu)
1097    
1098     -- Separator --------------------------------------
1099     file_menu.extend (create {EV_MENU_SEPARATOR})
1100    
1101     -- Exit
1102     command_menu_item := Exit_application_cmd.new_menu_item
1103     add_recyclable (Command_menu_item)
1104     file_menu.extend (command_menu_item)
1105     end
1106    
1107     build_class_info_menu: EV_MENU is
1108     -- Build the class format sub-menu.
1109     local
1110     form: EB_CLASS_INFO_FORMATTER
1111     empty_menu: EV_MENU_ITEM
1112     i: INTEGER
1113     do
1114     create Result.make_with_text (Interface_names.m_Class_info)
1115     i := 1
1116    
1117     create empty_menu.make_with_text (Interface_names.m_Formatter_separators @ i)
1118     i := i + 1
1119     empty_menu.disable_sensitive
1120     Result.extend (empty_menu)
1121     from
1122     managed_class_formatters.start
1123     until
1124     managed_class_formatters.after
1125     loop
1126     form := managed_class_formatters.item
1127     if form /= Void then
1128     Result.extend (form.new_menu_item)
1129     else
1130     create empty_menu.make_with_text (Interface_names.m_Formatter_separators @ i)
1131     i := i + 1
1132     empty_menu.disable_sensitive
1133     Result.extend (empty_menu)
1134     end
1135     managed_class_formatters.forth
1136     end
1137     end
1138    
1139     build_feature_info_menu: EV_MENU is
1140     -- Build the feature format sub-menu.
1141     local
1142     form: EB_FEATURE_INFO_FORMATTER
1143     do
1144     create Result.make_with_text (Interface_names.m_Feature_info)
1145     from
1146     managed_feature_formatters.start
1147     until
1148     managed_feature_formatters.after
1149     loop
1150     form := managed_feature_formatters.item
1151     if form /= Void then
1152     Result.extend (form.new_menu_item)
1153     end
1154     managed_feature_formatters.forth
1155     end
1156     end
1157    
1158     build_edit_menu is
1159     -- Create and build `edit_menu'
1160     local
1161     command_menu_item: EB_COMMAND_MENU_ITEM
1162     sub_menu: EV_MENU
1163     cmd: EB_EDITOR_COMMAND
1164     os_cmd: EB_ON_SELECTION_COMMAND
1165     editor: EB_SMART_EDITOR
1166     do
1167     editor := editor_tool.text_area
1168 xavier 28303 create command_controller.make
1169 manus 26913
1170     create edit_menu.make_with_text (Interface_names.m_Edit)
1171    
1172     -- Undo
1173     command_menu_item := undo_cmd.new_menu_item
1174     add_recyclable (command_menu_item)
1175     edit_menu.extend (command_menu_item)
1176    
1177     -- Redo
1178     command_menu_item := redo_cmd.new_menu_item
1179     add_recyclable (command_menu_item)
1180     edit_menu.extend (command_menu_item)
1181    
1182     -- Separator --------------------------------------
1183     edit_menu.extend (create {EV_MENU_SEPARATOR})
1184    
1185     -- Cut
1186 xavier 28303 create os_cmd.make (Current)
1187     os_cmd.set_menu_name (Interface_names.M_cut)
1188     os_cmd.set_pixmaps (pixmaps.icon_cut)
1189     os_cmd.set_name ("Editor_cut")
1190     os_cmd.set_tooltip (interface_names.f_cut)
1191 manus 36309 os_cmd.add_agent (agent cut_selection)
1192 king 46348 os_cmd.set_tooltext (Interface_names.b_Cut)
1193 xavier 28303 toolbarable_commands.extend (os_cmd)
1194     os_cmd.set_needs_editable (True)
1195     command_controller.add_selection_command (os_cmd)
1196     command_menu_item := os_cmd.new_menu_item
1197 manus 26913 add_recyclable (command_menu_item)
1198     edit_menu.extend (command_menu_item)
1199    
1200     -- Copy
1201 xavier 28303 create os_cmd.make (Current)
1202     os_cmd.set_menu_name (Interface_names.M_copy)
1203     os_cmd.set_pixmaps (pixmaps.icon_copy)
1204     os_cmd.set_name ("Editor_copy")
1205     os_cmd.set_tooltip (interface_names.f_copy)
1206 king 46348 os_cmd.set_tooltext (Interface_names.b_Copy)
1207 manus 36309 os_cmd.add_agent (agent copy_selection)
1208 xavier 28303 toolbarable_commands.extend (os_cmd)
1209     os_cmd.set_needs_editable (False)
1210     command_controller.add_selection_command (os_cmd)
1211     command_menu_item := os_cmd.new_menu_item
1212 manus 26913 add_recyclable (command_menu_item)
1213     edit_menu.extend (command_menu_item)
1214    
1215     -- Paste
1216     command_menu_item := editor_paste_cmd.new_menu_item
1217     add_recyclable (command_menu_item)
1218     edit_menu.extend (command_menu_item)
1219    
1220     -- Separator --------------------------------------
1221     edit_menu.extend (create {EV_MENU_SEPARATOR})
1222    
1223     -- Select all
1224     create cmd.make
1225     cmd.set_menu_name (Interface_names.m_select_all)
1226 manus 36309 cmd.add_agent (agent select_all)
1227 manus 26913 command_menu_item := cmd.new_menu_item
1228 xavier 28303 command_controller.add_edition_command (cmd)
1229 manus 26913 add_recyclable (command_menu_item)
1230     edit_menu.extend (command_menu_item)
1231    
1232     -- Separator --------------------------------------
1233     edit_menu.extend (create {EV_MENU_SEPARATOR})
1234    
1235 neilc 49534 -- Line numbers
1236     create cmd.make
1237     cmd.set_menu_name (Interface_names.m_line_numbers)
1238     cmd.add_agent (agent toggle_line_number_display)
1239     cmd.set_needs_editable (True)
1240     command_menu_item := cmd.new_menu_item
1241     command_controller.add_edition_command (cmd)
1242     add_recyclable (command_menu_item)
1243     edit_menu.extend (command_menu_item)
1244    
1245     -- Separator --------------------------------------
1246     edit_menu.extend (create {EV_MENU_SEPARATOR})
1247    
1248 manus 26913 -- Search
1249     create cmd.make
1250 neilc 49534 cmd.set_menu_name (Interface_names.m_Search + "%T" + preferences.editor_data.shortcut_name_for_action (3))
1251 manus 36309 cmd.add_agent (agent search)
1252 manus 26913 command_menu_item := cmd.new_menu_item
1253 xavier 28303 command_controller.add_edition_command (cmd)
1254 manus 26913 add_recyclable (command_menu_item)
1255     edit_menu.extend (command_menu_item)
1256    
1257 neilc 49534 -- Go to
1258     create cmd.make
1259     cmd.set_menu_name (Interface_names.m_Go_to)
1260     cmd.add_agent (agent goto)
1261     cmd.set_needs_editable (True)
1262     command_menu_item := cmd.new_menu_item
1263     command_controller.add_edition_command (cmd)
1264     add_recyclable (command_menu_item)
1265     edit_menu.extend (command_menu_item)
1266    
1267 manus 26913 -- Replace
1268     create cmd.make
1269 neilc 49534 cmd.set_menu_name (Interface_names.m_Replace + "%T" + preferences.editor_data.shortcut_name_for_action (4))
1270 manus 36309 cmd.add_agent (agent editor.replace)
1271 xavier 27860 cmd.set_needs_editable (True)
1272 manus 26913 command_menu_item := cmd.new_menu_item
1273 xavier 28303 command_controller.add_edition_command (cmd)
1274 manus 26913 add_recyclable (command_menu_item)
1275     edit_menu.extend (command_menu_item)
1276    
1277     -- Find sub menu
1278    
1279     create sub_menu.make_with_text (Interface_names.m_Find)
1280    
1281     -- Find next
1282     create cmd.make
1283 neilc 49534 cmd.set_menu_name (Interface_names.m_Find_next + "%T" + preferences.editor_data.shortcut_name_for_action (6))
1284 manus 36309 cmd.add_agent (agent find_next)
1285 manus 26913 command_menu_item := cmd.new_menu_item
1286 xavier 28303 command_controller.add_edition_command (cmd)
1287 manus 26913 add_recyclable (command_menu_item)
1288     sub_menu.extend (command_menu_item)
1289    
1290     -- Find previous
1291     create cmd.make
1292 neilc 49534 cmd.set_menu_name (Interface_names.m_Find_previous + "%T" + preferences.editor_data.shortcut_name_for_action (7))
1293 manus 36309 cmd.add_agent (agent find_previous)
1294 manus 26913 command_menu_item := cmd.new_menu_item
1295 xavier 28303 command_controller.add_edition_command (cmd)
1296 manus 26913 add_recyclable (command_menu_item)
1297     sub_menu.extend (command_menu_item)
1298    
1299     -- Find selection
1300     create os_cmd.make (Current)
1301 neilc 49534 os_cmd.set_menu_name (Interface_names.m_Find_selection + "%T" + preferences.editor_data.shortcut_name_for_action (5))
1302 manus 36309 os_cmd.add_agent (agent find_selection)
1303 manus 26913 command_menu_item := os_cmd.new_menu_item
1304 xavier 28303 command_controller.add_selection_command (os_cmd)
1305 manus 26913 add_recyclable (command_menu_item)
1306     sub_menu.extend (command_menu_item)
1307    
1308     edit_menu.extend (sub_menu)
1309    
1310    
1311     -- Separator --------------------------------------
1312     edit_menu.extend (create {EV_MENU_SEPARATOR})
1313    
1314     create sub_menu.make_with_text (Interface_names.m_Advanced)
1315    
1316     create os_cmd.make (Current)
1317 xavier 27860 os_cmd.set_needs_editable (True)
1318 xavier 28303 command_controller.add_selection_command (os_cmd)
1319 manus 26913 os_cmd.set_menu_name (Interface_names.m_Indent)
1320 manus 36309 os_cmd.add_agent (agent editor.indent_selection)
1321 manus 26913 command_menu_item := os_cmd.new_menu_item
1322     add_recyclable (command_menu_item)
1323     sub_menu.extend (command_menu_item)
1324    
1325     create os_cmd.make (Current)
1326 xavier 27860 os_cmd.set_needs_editable (True)
1327 xavier 28303 command_controller.add_selection_command (os_cmd)
1328 manus 26913 os_cmd.set_menu_name (Interface_names.m_Unindent)
1329 manus 36309 os_cmd.add_agent (agent editor.unindent_selection)
1330 manus 26913 command_menu_item := os_cmd.new_menu_item
1331     add_recyclable (command_menu_item)
1332     sub_menu.extend (command_menu_item)
1333    
1334     create os_cmd.make (Current)
1335 xavier 27860 os_cmd.set_needs_editable (True)
1336 xavier 28303 command_controller.add_selection_command (os_cmd)
1337 manus 26913 os_cmd.set_menu_name (Interface_names.m_To_lower)
1338 manus 36309 os_cmd.add_agent (agent editor.set_selection_case (True))
1339 manus 26913 command_menu_item := os_cmd.new_menu_item
1340     add_recyclable (command_menu_item)
1341     sub_menu.extend (command_menu_item)
1342    
1343     create os_cmd.make (Current)
1344 xavier 27860 os_cmd.set_needs_editable (True)
1345 xavier 28303 command_controller.add_selection_command (os_cmd)
1346 manus 26913 os_cmd.set_menu_name (Interface_names.m_To_upper)
1347 manus 36309 os_cmd.add_agent (agent editor.set_selection_case (False))
1348 manus 26913 command_menu_item := os_cmd.new_menu_item
1349     add_recyclable (command_menu_item)
1350     sub_menu.extend (command_menu_item)
1351    
1352     create cmd.make
1353 xavier 27860 cmd.set_needs_editable (True)
1354 manus 26913 cmd.set_menu_name (Interface_names.m_Comment)
1355 manus 36309 cmd.add_agent (agent editor.comment_selection)
1356 manus 26913 command_menu_item := cmd.new_menu_item
1357 xavier 28303 command_controller.add_edition_command (cmd)
1358 manus 26913 add_recyclable (command_menu_item)
1359     sub_menu.extend (command_menu_item)
1360    
1361     create cmd.make
1362 xavier 27860 cmd.set_needs_editable (True)
1363 manus 26913 cmd.set_menu_name (Interface_names.m_Uncomment)
1364 manus 36309 cmd.add_agent (agent editor.uncomment_selection)
1365 manus 26913 command_menu_item := cmd.new_menu_item
1366 xavier 28303 command_controller.add_edition_command (cmd)
1367 manus 26913 add_recyclable (command_menu_item)
1368     sub_menu.extend (command_menu_item)
1369    
1370     -- Separator --------------------------------------
1371     sub_menu.extend (create {EV_MENU_SEPARATOR})
1372    
1373     -- Insert if block
1374     create cmd.make
1375 xavier 27860 cmd.set_needs_editable (True)
1376 manus 26913 cmd.set_menu_name (Interface_names.m_If_block)
1377 manus 36309 cmd.add_agent (agent editor.embed_in_block("if then", 3))
1378 manus 26913 command_menu_item := cmd.new_menu_item
1379 xavier 28303 command_controller.add_edition_command (cmd)
1380 manus 26913 add_recyclable (command_menu_item)
1381     sub_menu.extend (command_menu_item)
1382    
1383     -- Insert debug block
1384     create cmd.make
1385 xavier 27860 cmd.set_needs_editable (True)
1386 manus 26913 cmd.set_menu_name (Interface_names.m_debug_block)
1387 manus 36309 cmd.add_agent (agent editor.embed_in_block("debug", 5))
1388 manus 26913 command_menu_item := cmd.new_menu_item
1389 xavier 28303 command_controller.add_edition_command (cmd)
1390 manus 26913 add_recyclable (command_menu_item)
1391     sub_menu.extend (command_menu_item)
1392    
1393    
1394     -- Separator --------------------------------------
1395     sub_menu.extend (create {EV_MENU_SEPARATOR})
1396    
1397     -- Complete word
1398     create cmd.make
1399 xavier 27860 cmd.set_needs_editable (True)
1400 neilc 49534 cmd.set_menu_name (Interface_names.m_Complete_word + "%T" + preferences.editor_data.shortcut_name_for_action (1))
1401 manus 26913 command_menu_item := cmd.new_menu_item
1402 xavier 28303 command_controller.add_edition_command (cmd)
1403 manus 36309 cmd.add_agent (agent editor.complete_feature_name)
1404 manus 26913
1405     add_recyclable (command_menu_item)
1406     sub_menu.extend (command_menu_item)
1407    
1408 etienne 27163 -- Complete class name
1409     create cmd.make
1410 xavier 27860 cmd.set_needs_editable (True)
1411 neilc 49534 cmd.set_menu_name (Interface_names.m_Complete_class_name + "%T" + preferences.editor_data.shortcut_name_for_action (2))
1412 etienne 27163 command_menu_item := cmd.new_menu_item
1413 xavier 28303 command_controller.add_edition_command (cmd)
1414 manus 36309 cmd.add_agent (agent editor.complete_class_name)
1415 etienne 27163
1416     add_recyclable (command_menu_item)
1417     sub_menu.extend (command_menu_item)
1418    
1419 manus 26913 sub_menu.extend (create {EV_MENU_SEPARATOR})
1420    
1421     -- show/hide formatting marks.
1422     create cmd.make
1423     if editor_tool.text_area.view_invisible_symbols then
1424     cmd.set_menu_name (Interface_names.m_Hide_formatting_marks)
1425     else
1426     cmd.set_menu_name (Interface_names.m_Show_formatting_marks)
1427     end
1428     formatting_marks_command_menu_item := cmd.new_menu_item
1429 xavier 28303 command_controller.add_edition_command (cmd)
1430 manus 36309 cmd.add_agent (agent toggle_formatting_marks)
1431 manus 26913
1432     add_recyclable (formatting_marks_command_menu_item)
1433     sub_menu.extend (formatting_marks_command_menu_item)
1434    
1435     edit_menu.extend (sub_menu)
1436     end
1437    
1438     build_view_menu is
1439     -- Build the view menu.
1440     local
1441     form: EB_CLASS_INFO_FORMATTER
1442     new_menu_item: EB_COMMAND_MENU_ITEM
1443     new_basic_item: EV_MENU_ITEM
1444     do
1445     Precursor
1446    
1447     new_menu_item := toggle_stone_cmd.new_menu_item
1448     view_menu.extend (new_menu_item)
1449     add_recyclable (new_menu_item)
1450    
1451     new_menu_item := send_stone_to_context_cmd.new_menu_item
1452     view_menu.extend (new_menu_item)
1453     add_recyclable (new_menu_item)
1454     -- Go to menu
1455     new_basic_item := history_manager.new_menu
1456     view_menu.extend (new_basic_item)
1457    
1458     -- Separator --------------------------------------
1459     view_menu.extend (create {EV_MENU_SEPARATOR})
1460     view_menu.extend (build_class_info_menu)
1461     view_menu.extend (build_feature_info_menu)
1462    
1463     -- Separator --------------------------------------
1464     view_menu.extend (create {EV_MENU_SEPARATOR})
1465    
1466     from
1467     managed_main_formatters.start
1468     until
1469     managed_main_formatters.after
1470     loop
1471     form := managed_main_formatters.item
1472     new_basic_item := form.new_menu_item
1473 manus 36309 new_basic_item.select_actions.put_front (agent form.invalidate)
1474 manus 26913 view_menu.extend (new_basic_item)
1475     --add_recyclable (new_basic_item)
1476     managed_main_formatters.forth
1477     end
1478     end
1479    
1480     build_favorites_menu is
1481     -- Build the favorites menu
1482     do
1483     Precursor {EB_TOOL_MANAGER}
1484    
1485     create show_favorites_menu_item
1486     update_show_favorites_menu_item
1487 manus 36309 show_favorites_menu_item.select_actions.extend (agent execute_show_favorites)
1488 manus 26913
1489     favorites_menu.start
1490     favorites_menu.put_right (show_favorites_menu_item)
1491 manus 36309 favorites_menu.select_actions.extend (agent update_show_favorites_menu_item)
1492 manus 26913 end
1493    
1494     build_project_menu is
1495     -- Build the project menu.
1496     local
1497     command_menu_item: EB_COMMAND_MENU_ITEM
1498     do
1499     create project_menu.make_with_text (Interface_names.m_Project)
1500    
1501     -- Melt
1502     command_menu_item := Melt_project_cmd.new_menu_item
1503     add_recyclable (command_menu_item)
1504     project_menu.extend (command_menu_item)
1505    
1506 xavier 29812 -- Quick melt
1507     command_menu_item := Quick_melt_project_cmd.new_menu_item
1508     add_recyclable (command_menu_item)
1509     project_menu.extend (command_menu_item)
1510    
1511 manus 26913 -- Freeze
1512     command_menu_item := Freeze_project_cmd.new_menu_item
1513     add_recyclable (command_menu_item)
1514     project_menu.extend (command_menu_item)
1515    
1516     -- Finalize
1517     command_menu_item := Finalize_project_cmd.new_menu_item
1518     add_recyclable (command_menu_item)
1519     project_menu.extend (command_menu_item)
1520    
1521     -- Precompile
1522     command_menu_item := precompilation_cmd.new_menu_item
1523     add_recyclable (command_menu_item)
1524     project_menu.extend (command_menu_item)
1525    
1526     -- Separator -------------------------------------------------
1527     project_menu.extend (create {EV_MENU_SEPARATOR})
1528    
1529     -- Compile Workbench C code
1530     command_menu_item := c_workbench_compilation_cmd.new_menu_item
1531     add_recyclable (command_menu_item)
1532     project_menu.extend (command_menu_item)
1533    
1534     -- Compile Finalized C code
1535     command_menu_item := c_finalized_compilation_cmd.new_menu_item
1536     add_recyclable (command_menu_item)
1537     project_menu.extend (command_menu_item)
1538    
1539     -- Execute Finalized code
1540     command_menu_item := run_finalized_cmd.new_menu_item
1541     add_recyclable (command_menu_item)
1542     project_menu.extend (command_menu_item)
1543    
1544     -- Separator -------------------------------------------------
1545     project_menu.extend (create {EV_MENU_SEPARATOR})
1546    
1547     -- System Tool window
1548     command_menu_item := system_cmd.new_menu_item
1549     add_recyclable (command_menu_item)
1550     project_menu.extend (command_menu_item)
1551    
1552     -- System information
1553     command_menu_item := system_info_cmd.new_menu_item
1554     add_recyclable (command_menu_item)
1555     project_menu.extend (command_menu_item)
1556    
1557     -- Error information
1558     command_menu_item := display_error_help_cmd.new_menu_item
1559     add_recyclable (command_menu_item)
1560     project_menu.extend (command_menu_item)
1561    
1562 xavier 27549 if has_documentation_generation or has_xmi_generation then
1563     -- Separator -------------------------------------------------
1564     project_menu.extend (create {EV_MENU_SEPARATOR})
1565     end
1566 manus 26913
1567 xavier 27549 if has_documentation_generation then
1568     -- Generate Documentation
1569     command_menu_item := document_cmd.new_menu_item
1570     add_recyclable (command_menu_item)
1571     project_menu.extend (command_menu_item)
1572     end
1573 manus 26913
1574 xavier 27549 if has_xmi_generation then
1575     -- Export XMI
1576     command_menu_item := export_cmd.new_menu_item
1577     add_recyclable (command_menu_item)
1578     project_menu.extend (command_menu_item)
1579     end
1580 manus 26913 end
1581    
1582     build_tools_menu is
1583     -- Create and build `tools_menu'
1584     local
1585     command_menu_item: EB_COMMAND_MENU_ITEM
1586     menu_item: EV_MENU_ITEM
1587     do
1588     create tools_menu.make_with_text (Interface_names.m_Tools)
1589    
1590 xavier 28240 -- New Cluster command.
1591     command_menu_item := new_cluster_cmd.new_menu_item
1592     add_recyclable (command_menu_item)
1593     tools_menu.extend (command_menu_item)
1594 manus 26913
1595 xavier 28240 -- New Class command.
1596     command_menu_item := new_class_cmd.new_menu_item
1597     add_recyclable (command_menu_item)
1598     tools_menu.extend (command_menu_item)
1599    
1600     -- New Feature command.
1601     command_menu_item := new_feature_cmd.new_menu_item
1602     add_recyclable (command_menu_item)
1603     tools_menu.extend (command_menu_item)
1604 jfiat 42965
1605 xavier 28240 -- Delete class/cluster command.
1606     command_menu_item := delete_class_cluster_cmd.new_menu_item
1607     add_recyclable (command_menu_item)
1608     tools_menu.extend (command_menu_item)
1609    
1610     -- Separator --------------------------------------
1611     tools_menu.extend (create {EV_MENU_SEPARATOR})
1612    
1613    
1614 xavier 27549 if has_metrics then
1615     -- Metric tool
1616 xavier 28693 create metric_menu.make_with_text (interface_names.metric_metrics)
1617 xavier 27549 create menu_item.make_with_text (interface_names.metric_calculate)
1618     metric_menu.extend (menu_item)
1619     create menu_item.make_with_text (interface_names.metric_add)
1620     metric_menu.extend (menu_item)
1621     create menu_item.make_with_text (interface_names.metric_delete)
1622     metric_menu.extend (menu_item)
1623     create menu_item.make_with_text (interface_names.metric_details)
1624     metric_menu.extend (menu_item)
1625     create menu_item.make_with_text (interface_names.metric_new_metrics)
1626     metric_menu.extend (menu_item)
1627     create menu_item.make_with_text (interface_names.metric_management)
1628     metric_menu.extend (menu_item)
1629     create menu_item.make_with_text (interface_names.metric_archive)
1630     metric_menu.extend (menu_item)
1631     metric_menu.disable_sensitive
1632     tools_menu.extend (metric_menu)
1633     end
1634 manus 26913
1635 xavier 27549 if has_profiler then
1636     -- Profiler Window
1637     command_menu_item := show_profiler.new_menu_item
1638     add_recyclable (command_menu_item)
1639     tools_menu.extend (command_menu_item)
1640     end
1641 manus 26913
1642     -- Precompile Wizard
1643     command_menu_item := wizard_precompile_cmd.new_menu_item
1644     add_recyclable (command_menu_item)
1645     tools_menu.extend (command_menu_item)
1646    
1647 xavier 27549 if has_dll_generation then
1648     -- Dynamic Library Window
1649     command_menu_item := show_dynamic_lib_tool.new_menu_item
1650     add_recyclable (command_menu_item)
1651     tools_menu.extend (command_menu_item)
1652     end
1653 manus 26913
1654     -- Separator -------------------------------------------------
1655     tools_menu.extend (create {EV_MENU_SEPARATOR})
1656    
1657     -- Preferences
1658     command_menu_item := Show_preferences_cmd.new_menu_item
1659     add_recyclable (command_menu_item)
1660     tools_menu.extend (command_menu_item)
1661 xavier 30005
1662     -- External commands editor
1663     command_menu_item := Edit_external_commands_cmd.new_menu_item
1664     add_recyclable (command_menu_item)
1665     tools_menu.extend (command_menu_item)
1666    
1667     -- Separator -------------------------------------------------
1668     tools_menu.extend (create {EV_MENU_SEPARATOR})
1669    
1670     rebuild_tools_menu
1671 manus 26913 end
1672    
1673     feature -- Stone process
1674    
1675     stone: STONE
1676     -- Current stone
1677    
1678     toggle_unified_stone is
1679     -- Change the stone management mode.
1680     do
1681     unified_stone := not unified_stone
1682     if unified_stone then
1683     send_stone_to_context
1684     send_stone_to_context_cmd.disable_sensitive
1685     context_tool.link_to_development_window
1686     else
1687     if stone /= Void then
1688     send_stone_to_context_cmd.enable_sensitive
1689     end
1690     context_tool.cut_from_development_window
1691     end
1692     end
1693    
1694     set_stone (a_stone: STONE) is
1695 xavier 29993 -- Change the currently focused stone.
1696     local
1697 xavier 30037 cd: STANDARD_DISCARDABLE_CONFIRMATION_DIALOG
1698 xavier 29993 cv_cst: CLASSI_STONE
1699 neilc 49534 ef_stone: EXTERNAL_FILE_STONE
1700 xavier 29993 l: LIST [EB_DEVELOPMENT_WINDOW]
1701 neilc 49534 l_filename: STRING
1702 xavier 29993 do
1703     cv_cst ?= a_stone
1704     if cv_cst /= Void then
1705 neilc 49534 l_filename := cv_cst.class_i.name
1706     else
1707     ef_stone ?= a_stone
1708     if ef_stone /= Void then
1709     l_filename := ef_stone.file_name.string
1710     end
1711     end
1712    
1713     if cv_cst /= Void or ef_stone /= Void then
1714     l := Window_manager.development_windows_with_class (l_filename)
1715     if l.is_empty or else l.has (Current) then
1716 xavier 29993 -- We're not editing the class in another window.
1717     set_stone_after_first_check (a_stone)
1718     else
1719 neilc 50326 create cd.make_initialized (2, preferences.dialog_data.already_editing_class_string, warning_messages.w_Class_already_edited, Interface_names.L_do_not_show_again, preferences.preferences)
1720 manus 36309 cd.set_ok_action (agent set_stone_after_first_check (a_stone))
1721 xavier 29993 cd.show_modal_to_window (window)
1722     end
1723 manus 50607 else
1724     set_stone_after_first_check (a_stone)
1725 xavier 29993 end
1726     end
1727    
1728 manus 50607 set_stone_after_first_check (a_stone: STONE) is
1729     -- Display text associated with `a_stone', if any and if possible
1730     local
1731     feature_stone: FEATURE_STONE
1732     old_class_stone: CLASSI_STONE
1733     test_stone: CLASSI_STONE
1734     same_class: BOOLEAN
1735     conv_ferrst: FEATURE_ERROR_STONE
1736     ef_stone: EXTERNAL_FILE_STONE
1737     do
1738     old_class_stone ?= stone
1739     feature_stone ?= a_stone
1740     ef_stone ?= a_stone
1741     if old_class_stone /= Void then
1742     create test_stone.make (old_class_stone.class_i)
1743     same_class := test_stone.same_as (a_stone)
1744     -- 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
1746     -- we have a CLASSI_STONE.
1747     if same_class and then feature_stone /= Void then
1748     same_class := False
1749     -- 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
1751     -- 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
1753 manus 26913 if not during_synchronization then
1754 manus 50607 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 manus 26913 end
1759 manus 50607 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
1766 manus 26913 end
1767     end
1768 manus 50607 elseif ef_stone /= Void then
1769    
1770    
1771 manus 26913 end
1772 neilc 49534
1773 manus 50607 -- 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 neilc 49534 end
1792 manus 50607
1793     force_stone (s: STONE) is
1794     -- make `s' the new value of `stone', and
1795     -- change the display accordingly. Try to
1796     -- extract a class from `s' whenever possible.
1797     do
1798     if s.is_storable then
1799     set_stone (s)
1800     if not unified_stone then
1801     context_tool.advanced_set_stone (s)
1802     end
1803 manus 26913 end
1804     end
1805    
1806 manus 50607 process_class (s: CLASSI_STONE) is
1807     -- Process class stone
1808     do
1809 neilc 49534 set_stone (s)
1810 manus 50607 end
1811    
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 manus 26913 end
1826     end
1827    
1828 manus 50607
1829     process_class_syntax (s: CL_SYNTAX_STONE) is
1830     -- Process class syntax.
1831     local
1832     cl_stone: CLASSC_STONE
1833     do
1834     -- call set_stone to ensure the proper class is displayed
1835     create cl_stone.make (s.e_class)
1836     set_stone (cl_stone)
1837     editor_tool.text_area.deselect_all
1838     editor_tool.text_area.highlight_when_ready (s.line, s.line)
1839 manus 26913 end
1840 manus 50607
1841     refresh is
1842     -- Synchronize clickable elements with text, if possible.
1843     do
1844     --| FIXME ARNAUD
1845     -- synchronise_stone
1846     --| END FIXME
1847     --| FIXME XR: Refresh current display in the editor.
1848     editor_tool.text_area.update_click_list (False)
1849     update_save_symbol
1850     address_manager.refresh
1851     -- The cluster manager should already be refreshed by the window manager.
1852     -- cluster_manager.refresh
1853     -- context_tool.refresh
1854     end
1855 manus 26913
1856 manus 50607 quick_refresh is
1857     -- Redraw the main editor's drawing area.
1858     do
1859     editor_tool.text_area.refresh
1860     context_tool.quick_refresh
1861     end
1862 manus 26913
1863 manus 50607 set_default_format is
1864     -- Default format of windows.
1865     --| FIXME ARNAUD: To be implemented.
1866     -- local
1867     -- f: EB_FORMATTER
1868     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 manus 26913
1882 manus 50607 feature -- Resource Update
1883 manus 26913
1884 manus 50607 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 manus 26913
1895 manus 50607 -- 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 manus 26913
1902 manus 50607 -- 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 manus 26913 end
1915    
1916 manus 50607 update_splitters is
1917     -- Refresh the position of the splitter on screen according to
1918     -- our internal values.
1919     do
1920     -- Set the interior layout
1921     if panel.full then
1922     panel.set_split_position (splitter_position.max (panel.minimum_split_position))
1923     end
1924 manus 26913 end
1925    
1926 manus 50607 register is
1927     -- Register to preferences we want notification of.
1928     do
1929 manus 26913 end
1930    
1931 manus 50607 unregister is
1932     -- unregister to preferences we want notification of.
1933     do
1934 manus 26913 end
1935    
1936 manus 50607 reset is
1937     -- Reset the window contents
1938     do
1939     Precursor
1940     address_manager.reset
1941 manus 26913
1942 manus 50607 --| FIXME ARNAUD, multiformat not yet implemented.
1943     -- format_list.enable_imp_formats_sensitive
1944     --| END FIXME
1945     end
1946 neilc 49534
1947 manus 50607 rebuild_tools_menu is
1948     -- Refresh the list of external commands.
1949     local
1950     ms: LIST [EB_COMMAND_MENU_ITEM]
1951     do
1952     -- Remove all the external commands, which are at the end of the menu.
1953     from
1954     tools_menu.go_i_th (tools_menu.count + 1 - number_of_displayed_external_commands)
1955     until
1956     tools_menu.after
1957     loop
1958     tools_menu.remove
1959     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 neilc 49534
1973 manus 50607 syntax_is_correct: BOOLEAN is
1974     -- file was successfully parsed.
1975     do
1976     Result := editor_tool.text_area.syntax_is_correct
1977     end
1978 manus 26913
1979 manus 50607 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 xavier 30005 end
1993 manus 50607
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 manus 26913 end
2002    
2003 manus 50607 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 manus 26913 end
2019    
2020 manus 50607 save_before_compiling is
2021     -- save the text but do not update clickable positions
2022     do
2023     save_only := True
2024     save_text
2025 manus 26913 end
2026    
2027 manus 50607 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
2036 manus 26913 end
2037 manus 50607 if changed then
2038     editor_tool.text_area.strip_unwanted_indentation
2039     end
2040     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
2048     check_passed := True
2049     end
2050 manus 26913 end
2051 manus 50607
2052     continue_save is
2053     -- continue saving
2054     do
2055 manus 26913 check_passed := True
2056     end
2057    
2058 manus 50607 cancel_save is
2059     -- cancel saving
2060     do
2061     check_passed := False
2062     end
2063 manus 26913
2064 manus 50607 process is
2065     -- process the user entry in the address bar
2066     do
2067     save_canceled := False
2068     end
2069 manus 26913
2070 manus 50607 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 manus 26913 end
2095    
2096 manus 50607 save_and (an_action: PROCEDURE [ANY, TUPLE]) is
2097     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 manus 26913 end
2107    
2108 manus 50607 feature -- Window management
2109 manus 26913
2110 manus 50607 show_window is
2111     -- Show the window
2112     do
2113     show
2114     end
2115 manus 26913
2116 manus 50607 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 manus 26913
2123 manus 50607 hide_window is
2124     -- Hide the window
2125     do
2126     hide
2127     end
2128 manus 26913
2129 manus 50607 destroy_window is
2130     -- Destroy the window.
2131     do
2132     destroy
2133     end
2134 manus 26913
2135 manus 50607 give_focus is
2136     -- Give the focus to the address manager.
2137     do
2138     address_manager.set_focus
2139 manus 26913 end
2140 manus 50607
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)
2151     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
2156     preferences.development_window_data.save_search_tool_options (search_tool)
2157     -- Commit saves
2158     -- save_resources
2159     end
2160 manus 26913
2161 manus 50607 feature -- Tools & Controls
2162 manus 26913
2163 manus 50607 editor_tool: EB_EDITOR_TOOL
2164 manus 26913
2165 manus 50607 favorites_tool: EB_FAVORITES_TOOL
2166 manus 26913
2167 manus 50607 cluster_tool: EB_CLUSTER_TOOL
2168 manus 26913
2169 manus 50607 search_tool: EB_SEARCH_TOOL
2170 manus 26913
2171 manus 50607 features_tool: EB_FEATURES_TOOL
2172 manus 26913
2173 manus 50607 windows_tool: EB_WINDOWS_TOOL
2174 manus 26913
2175 manus 50607 context_tool: EB_CONTEXT_TOOL
2176     -- Context explorer for current class and system.
2177 manus 26913
2178 manus 50607 address_manager: EB_ADDRESS_MANAGER
2179     -- Text field in the toolbar
2180     -- Allow user to enter the name
2181     -- of the class he wants to edit.
2182 manus 26913
2183 manus 50607 project_manager: EB_PROJECT_MANAGER is
2184     -- Project manager associated to the project the user is working on.
2185     do
2186     Result := Eiffel_project.manager
2187     end
2188 manus 26913
2189 manus 50607 managed_class_formatters: ARRAYED_LIST [EB_CLASS_INFO_FORMATTER]
2190     -- All formatters that operate on a class.
2191 manus 26913
2192 manus 50607 managed_feature_formatters: ARRAYED_LIST [EB_FEATURE_INFO_FORMATTER]
2193     -- All formatters that operate on a class.
2194 manus 26913
2195 manus 50607 managed_main_formatters: ARRAYED_LIST [EB_CLASS_TEXT_FORMATTER]
2196     -- All formatters that can be displayed in the main editor frame.
2197 manus 26913
2198 manus 50607 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 manus 26913
2207 manus 50607 feature -- Multiple editor management
2208 manus 26913
2209 manus 50607 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 neilc 49534
2215 manus 50607 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 manus 26913 end
2224 manus 50607
2225     set_current_editor (an_editor: EB_EDITOR) is
2226     -- set `an_editor' as main editor
2227     local
2228     old_index: INTEGER
2229     new_index: INTEGER
2230     do
2231     old_index := current_editor_index
2232     new_index := editors.index_of (an_editor, 1)
2233     if
2234     editors.valid_index (new_index) and
2235     old_index /= new_index
2236     then
2237     current_editor_index := new_index
2238     from
2239     editors.start
2240     until
2241     editors.after
2242     loop
2243     if editors.index /= current_editor_index and then editors.item.has_selection then
2244     editors.item.disable_selection
2245     end
2246     editors.forth
2247 manus 26913 end
2248 manus 50607 update_paste_cmd
2249     -- Last thing, update the menu entry for the formatting marks.
2250     if current_editor.view_invisible_symbols then
2251     formatting_marks_command_menu_item.set_text (Interface_names.m_Hide_formatting_marks)
2252     else
2253     formatting_marks_command_menu_item.set_text(Interface_names.m_Show_formatting_marks)
2254     end
2255     command_controller.set_current_editor (an_editor)
2256 xavier 27840 end
2257 manus 50607 end
2258    
2259     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 xavier 27860 else
2269 manus 50607 editor_paste_cmd.disable_sensitive
2270 xavier 27860 end
2271     end
2272 manus 50607
2273     feature {NONE} -- Multiple editor management
2274 neilc 49534
2275 manus 50607 editors: ARRAYED_LIST [EB_EDITOR]
2276     -- editor contained in `Current'
2277    
2278     current_editor_index: INTEGER
2279     -- Index in `editors' of the editor that has the focus.
2280    
2281     feature {EB_FEATURES_TOOL, EB_FEATURES_TREE, DOTNET_CLASS_AS, DOTNET_CLASS_CONTEXT} -- Feature Clauses
2282    
2283     set_feature_clauses (a_features: ARRAYED_LIST [DOTNET_FEATURE_CLAUSE_AS [CONSUMED_ENTITY]]; a_type: STRING) is
2284     -- 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 neilc 49534 end
2294    
2295 manus 50607 get_feature_clauses (a_type: STRING): ARRAYED_LIST [DOTNET_FEATURE_CLAUSE_AS [CONSUMED_ENTITY]] is
2296     -- Get list of feature clauses relevant to .NET type with name 'a_type'.
2297     require
2298     a_type_not_void: a_type /= Void
2299     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 neilc 33858 end
2305 manus 50607
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 manus 26913
2312 manus 50607 feature {EB_WINDOW_MANAGER} -- Window management / Implementation
2313 manus 26913
2314 manus 50607 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 manus 26913
2335 manus 50607 -- Commit saves
2336     -- save_resources
2337 manus 26913
2338 manus 50607 toolbars_area.wipe_out
2339     address_manager.recycle
2340     project_customizable_toolbar.recycle
2341     Precursor {EB_TOOL_MANAGER}
2342 manus 26913
2343 manus 50607 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 neilc 49534 end
2350     end
2351    
2352 manus 50607 feature {NONE} -- Implementation
2353 neilc 49534
2354 manus 50607 set_stone_after_check (a_stone: STONE) is
2355     local
2356     old_stone: STONE
2357     new_class_stone: CLASSI_STONE
2358     old_class_stone: CLASSI_STONE
2359     conv_classc: CLASSC_STONE
2360     conv_brkstone: BREAKABLE_STONE
2361     cluster_st: CLUSTER_STONE
2362     feature_stone: FEATURE_STONE
2363     conv_ferrst: FEATURE_ERROR_STONE
2364 neilc 49534
2365 manus 50607 ef_stone: EXTERNAL_FILE_STONE
2366     f: FILE
2367 neilc 49534
2368 manus 50607 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 manus 26913 else
2389 manus 50607 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 neilc 49534 end
2395 manus 26913
2396 manus 50607 conv_brkstone ?= a_stone
2397     conv_errst ?= a_stone
2398     conv_ace ?= a_stone
2399     ef_stone ?= a_stone
2400     if conv_brkstone /= Void then
2401     if Application.is_breakpoint_enabled (conv_brkstone.routine, conv_brkstone.index) then
2402     Application.remove_breakpoint (conv_brkstone.routine, conv_brkstone.index)
2403     else
2404     Application.set_breakpoint (conv_brkstone.routine, conv_brkstone.index)
2405 manus 26913 end
2406 manus 50607 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     -- Set the stone.
2428     old_set_stone (a_stone)
2429     cluster_st ?= a_stone
2430    
2431     new_feature_cmd.disable_sensitive
2432     toggle_feature_signature_cmd.disable_sensitive
2433    
2434     -- We update the state of the `Add to Favorites' command.
2435     if new_class_stone /= Void then
2436     favorites_menu.first.enable_sensitive
2437     else
2438     favorites_menu.first.disable_sensitive
2439 neilc 49534 end
2440 manus 26913
2441 manus 50607 -- Update the history.
2442     if
2443     new_class_stone /= Void
2444     then
2445     history_manager.extend (new_class_stone)
2446     elseif
2447     cluster_st /= Void
2448     then
2449     history_manager.extend (cluster_st)
2450     end
2451     -- Update the address manager if needed.
2452     address_manager.refresh
2453     if new_class_stone /= Void then
2454     -- class stone was dropped
2455     create class_file.make (new_class_stone.class_i.file_name)
2456     class_text_exists := class_file.exists
2457     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
2464     if not feature_stone_already_processed then
2465     if
2466     same_class and then text_saved
2467     then
2468     -- nothing changed in the editor
2469     -- we only have to update click_list
2470     if editor_tool.text_area.is_editable then
2471     editor_tool.text_area.update_click_list (False)
2472     end
2473 manus 26913 else
2474 manus 50607 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 manus 26913 end
2481     end
2482 neilc 49534
2483 manus 50607 conv_classc ?= new_class_stone
2484     if conv_classc = Void or else
2485     conv_classc.e_class.is_external or else
2486     feature_stone /= Void and not
2487     feature_stone_already_processed and not
2488     (same_class and context_tool.sending_stone) then
2489     -- If a classi_stone or a feature_stone or a external call
2490     -- has been dropped, check to see if a .NET class.
2491     if class_text_exists then
2492     if new_class_stone.class_i.is_external_class then
2493     create l_reader
2494     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 neilc 33365 end
2518 manus 50607 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
2527     address_manager.disable_formatters
2528 neilc 33365 else
2529 manus 50607 --| We have a compiled class.
2530     if
2531     class_text_exists and then
2532     Eiffel_project.Workbench.last_reached_degree <= 2
2533     then
2534     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 xavier 28693 from
2571 neilc 33365 managed_main_formatters.start
2572 xavier 28693 until
2573 neilc 33365 managed_main_formatters.after
2574 xavier 28693 loop
2575 neilc 33365 managed_main_formatters.item.set_stone (new_class_stone)
2576     managed_main_formatters.forth
2577 xavier 28693 end
2578 manus 26913 end
2579     end
2580     end
2581 manus 50607 else
2582     -- not a class text : cannot be edited
2583     editor_tool.text_area.disable_editable
2584     address_manager.disable_formatters
2585 manus 26913
2586 manus 50607 --| Disable all formatters.
2587     from
2588     managed_main_formatters.start
2589     until
2590     managed_main_formatters.after
2591     loop
2592     managed_main_formatters.item.set_stone (Void)
2593     managed_main_formatters.forth
2594     end
2595     if cluster_st /= Void then
2596     --| FIXME XR: Really manage cluster display in the main editor
2597     create l_format_context.make_for_case
2598     l_format_context.put_text_item (ti_indexing_keyword)
2599     l_format_context.put_new_line
2600     l_format_context.indent
2601     l_format_context.put_text_item (create {INDEXING_TAG_TEXT}.make ("cluster"))
2602     l_format_context.put_text_item_without_tabs (ti_colon)
2603     l_format_context.put_space
2604     l_format_context.put_string ("%"" + cluster_st.cluster_i.cluster_name + "%"")
2605     l_format_context.put_new_line
2606     l_format_context.put_text_item (create {INDEXING_TAG_TEXT}.make ("cluster_path"))
2607     l_format_context.put_text_item_without_tabs (ti_colon)
2608     l_format_context.put_space
2609     l_format_context.put_string ("%"" + cluster_st.cluster_i.path + "%"")
2610     l_format_context.put_new_line
2611     l_indexes := cluster_st.cluster_i.indexes
2612     if l_indexes /= Void then
2613     l_format_context.set_new_line_between_tokens
2614     l_format_context.format_ast (l_indexes)
2615     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
2621 neilc 49534 end
2622 manus 50607 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     conv_ferrst ?= feature_stone
2624     if conv_ferrst /= Void then
2625     -- Scroll to the line of the error.
2626     editor_tool.text_area.display_line_when_ready (conv_ferrst.line_number, True)
2627     else
2628     -- if a feature_stone has been dropped
2629     -- scroll to the corresponding feature in the basic text format
2630     if not during_synchronization then
2631     scroll_to_feature (feature_stone.e_feature, new_class_stone.class_i)
2632     end
2633 manus 26913 end
2634     end
2635 manus 50607 -- Update the title of the window
2636     if a_stone /= Void then
2637     if changed then
2638     str := a_stone.header.twin
2639     str.prepend ("* ")
2640     set_title (str)
2641     else
2642     set_title (a_stone.header)
2643     end
2644 neilc 49534 else
2645 manus 50607 set_title (Interface_names.t_Empty_development_window)
2646 manus 26913 end
2647 manus 50607
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 neilc 49534 end
2657 manus 50607 if
2658     stone /= Void and then
2659     not unified_stone
2660     then
2661     send_stone_to_context_cmd.enable_sensitive
2662 manus 26913 else
2663 manus 50607 send_stone_to_context_cmd.disable_sensitive
2664 manus 26913 end
2665 manus 50607 if cur_wid = Void then
2666     --| Do nothing.
2667     else
2668     cur_wid.set_pointer_style (old_cur)
2669     old_cur := Void
2670     -- cur_wid.disable_capture
2671     cur_wid := Void
2672 manus 26913 end
2673     end
2674    
2675 manus 50607 scroll_to_feature (feat_as: E_FEATURE; displayed_class: CLASS_I) is
2676     -- highlight the feature correspnding to `feat_as' in the class represented by `displayed_class'
2677     require
2678     class_is_not_void: displayed_class /= Void
2679     feat_as_is_not_void: feat_as /= Void
2680     local
2681     begin_index, offset: INTEGER
2682     tmp_text: STRING
2683     do
2684     if not feat_as.is_il_external then
2685     if feat_as.ast /= Void then
2686     begin_index := feat_as.ast.start_position
2687     if platform_constants.is_windows then
2688     tmp_text := displayed_class.text.substring (1, begin_index)
2689     offset := tmp_text.occurrences('%R')
2690     end
2691     editor_tool.text_area.scroll_to_when_ready (begin_index.item - offset)
2692     end
2693     else
2694     -- FIXME NC: Doesn't work properly for .NET features
2695     -- .NET formatted feature.
2696     begin_index := feature_positions.item (feat_as)
2697 neilc 33858 if platform_constants.is_windows then
2698     tmp_text := displayed_class.text.substring (1, begin_index)
2699 manus 50607 offset := tmp_text.occurrences('%N')
2700 neilc 33858 end
2701 manus 50607 editor_tool.text_area.scroll_to_when_ready (begin_index // 2) -- - offset)
2702 manus 26913 end
2703     end
2704    
2705 manus 50607 check_passed: BOOLEAN
2706 manus 26913
2707 manus 50607 save_canceled: BOOLEAN
2708     -- did user cancel save ?
2709 manus 26913
2710 manus 50607 save_only: BOOLEAN
2711     -- skip parse and update after save ?
2712 manus 26913
2713 manus 50607 text_saved: BOOLEAN
2714     -- has the user chosen to save the file
2715 manus 26913
2716 manus 50607 is_destroying: BOOLEAN
2717     -- Is `current' being currently destroyed?
2718 manus 26913
2719 manus 50607 feature_stone_already_processed: BOOLEAN
2720     -- Is the processed stone a feature stone and has it
2721     -- been already processed by the editor ?
2722 neilc 49534
2723 manus 50607 feature {NONE} -- Implementation
2724 manus 26913
2725 manus 50607 update_save_symbol is
2726     do
2727     Precursor {EB_FILEABLE}
2728     if changed then
2729     save_cmd.enable_sensitive
2730     address_manager.disable_formatters
2731     else
2732     save_cmd.disable_sensitive
2733     update_formatters
2734     end
2735     if is_empty then
2736     print_cmd.disable_sensitive
2737     save_as_cmd.disable_sensitive
2738     else
2739     print_cmd.enable_sensitive
2740     save_as_cmd.enable_sensitive
2741     end
2742 manus 26913 end
2743    
2744 manus 50607 is_stone_external: BOOLEAN
2745     -- Does 'stone' contain a .NET consumed type?
2746 neilc 33294
2747 manus 50607 update_formatters is
2748     -- Give a correct sensitivity to formatters.
2749     local
2750     cist: CLASSI_STONE
2751     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 neilc 33365
2770 manus 50607 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 neilc 33365 -- Change formatters to .NET sensitivity (from normal).
2787 manus 38124 enable_dotnet_formatters
2788     if type_changed then
2789     managed_main_formatters.i_th (4).enable_select
2790     end
2791     else
2792 manus 50607 address_manager.disable_formatters
2793     if cist /= stone then
2794     managed_main_formatters.first.execute
2795 manus 38124 end
2796 neilc 33365 end
2797     end
2798    
2799 manus 50607 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
2810     managed_main_formatters.item.disable_sensitive
2811     end
2812     managed_main_formatters.forth
2813 xavier 27866 end
2814     end
2815 manus 50607
2816 xavier 27866
2817 manus 50607 on_text_reset is
2818     -- 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
2828     address_manager.disable_formatters
2829     status_bar.display_message ("")
2830     status_bar.remove_cursor_position
2831     text_edited := False
2832 manus 26913 end
2833    
2834 manus 50607 on_cursor_moved is
2835     -- The cursor has moved, reflect the change in the status bar.
2836     do
2837     refresh_cursor_position
2838 xavier 29812 end
2839    
2840 manus 50607 on_text_fully_loaded is
2841     -- The main editor has just been reloaded.
2842     do
2843     update_paste_cmd
2844     update_formatters
2845     if editor_tool.text_area.syntax_is_correct then
2846     status_bar.display_message ("")
2847     else
2848     status_bar.display_message (Interface_names.L_syntax_error)
2849     end
2850     refresh_cursor_position
2851     text_edited := False
2852 xavier 27840 end
2853    
2854 manus 50607 on_text_back_to_its_last_saved_state is
2855     local
2856     str: STRING
2857     do
2858 manus 40756 str := title.twin
2859 manus 50607 if str @ 1 = '*' then
2860     str.keep_tail (str.count - 2)
2861 etienne 27144 set_title (str)
2862     end
2863 manus 50607 update_formatters
2864     text_edited := False
2865     end
2866    
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 manus 26913 end
2891 manus 50607 status_bar.display_message ("")
2892 manus 26913 end
2893    
2894 manus 50607 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 xavier 27498 end
2905     end
2906    
2907 manus 50607 on_forth is
2908     -- User pressed Alt+right.
2909     -- Go forth in the history (or the context history).
2910     do
2911     if context_tool_has_focus then
2912     if context_tool.history_manager.is_forth_possible then
2913     context_tool.history_manager.forth_command.execute
2914     editor_tool.text_area.editor_viewport.enable_sensitive
2915     editor_tool.text_area.set_focus
2916     end
2917     elseif history_manager.is_forth_possible then
2918     history_manager.forth_command.execute
2919 neilc 50549 editor_tool.text_area.editor_viewport.enable_sensitive
2920 neilc 49534 editor_tool.text_area.set_focus
2921 xavier 27498 end
2922     end
2923    
2924 manus 50607 context_tool_has_focus: BOOLEAN is
2925     -- Does the context tool or one of its children has the focus?
2926     local
2927     fw: EV_WIDGET
2928     cont: EV_CONTAINER
2929     wid: EV_WIDGET
2930     do
2931     fw := (create {EV_ENVIRONMENT}).application.focused_widget
2932     wid := context_tool.explorer_bar_item.widget
2933     if wid = fw then
2934 xavier 27498 Result := True
2935 manus 50607 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 xavier 27498 end
2949     end
2950    
2951 manus 50607 saved_cursor: CURSOR
2952     -- Saved cursor position for displaying the stack.
2953 manus 26913
2954 manus 50607 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 xavier 27840
2963 manus 50607 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 manus 26913
2969 manus 50607 quick_refresh_on_brk_drop (unused: BREAKABLE_STONE) is
2970     -- Quick refresh all windows.
2971     do
2972     window_manager.quick_refresh_all
2973     end
2974 manus 26913
2975 manus 50607 send_stone_to_context is
2976     -- Send current stone to the context tool.
2977     -- Used by `send_stone_to_context_cmd'.
2978     do
2979     if stone /= Void then
2980     context_tool.set_stone (stone)
2981     end
2982 manus 26913 end
2983    
2984 manus 50607 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 manus 26913 else
3002 manus 50607 Precursor {EB_TOOL_MANAGER}
3003 manus 26913 end
3004     end
3005    
3006 manus 50607 save_and_destroy is
3007     do
3008     save_text
3009     destroy
3010     end
3011 manus 26913
3012 manus 50607 force_destroy is
3013     -- Destroy without asking.
3014     do
3015     confirmed := True
3016     destroy
3017     confirmed := False
3018     end
3019 manus 26913
3020 manus 50607 confirmed: BOOLEAN
3021     -- Did the user say he wanted to exit?
3022 manus 26913
3023 manus 50607 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 manus 26913
3029 manus 50607 recycle is
3030     -- Call the precursors.
3031     do
3032     Precursor {EB_TOOL_MANAGER}
3033     command_controller.recycle
3034     end
3035 manus 26913
3036 manus 50607 feature {NONE} -- Implementation: Editor commands
3037 xavier 27840
3038 manus 50607 refresh_cursor_position is
3039     -- Display the current cursor position in the status bar.
3040     require
3041     text_loaded: not is_empty
3042     local
3043     l, c: INTEGER
3044     do
3045     l := editor_tool.text_area.cursor_y_position
3046     c := editor_tool.text_area.cursor_x_position
3047     status_bar.set_cursor_position (l, c)
3048     end
3049 xavier 29812
3050 manus 50607 select_all is
3051     -- Select the whole text in the focused editor.
3052     do
3053     current_editor.select_all
3054     end
3055 neilc 49534
3056 manus 50607 search is
3057     -- Search some text in the focused editor.
3058     local
3059     cv_ced: EB_CLICKABLE_EDITOR
3060     do
3061     cv_ced ?= current_editor
3062     if cv_ced /= Void then
3063     cv_ced.search
3064     end
3065 xavier 27840 end
3066    
3067 manus 50607 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 xavier 28693 end
3078    
3079 manus 50607 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 xavier 28280 end
3089    
3090 manus 50607 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 xavier 28280 end
3103     end
3104    
3105 manus 50607 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
3118     end
3119    
3120     find_selection is
3121     -- Find the next occurrence of the selection.
3122     local
3123     cv_ced: EB_CLICKABLE_EDITOR
3124     do
3125 xavier 28280 cv_ced ?= current_editor
3126     if cv_ced /= Void then
3127 manus 50607 cv_ced.find_selection
3128 xavier 28280 end
3129     end
3130    
3131 manus 50607 cut_selection is
3132     -- Cut the selection in the current editor.
3133     do
3134     current_editor.cut_selection
3135 xavier 28303 end
3136    
3137 manus 50607 copy_selection is
3138     -- Cut the selection in the current editor.
3139     do
3140     current_editor.copy_selection
3141     end
3142 xavier 28303
3143 manus 50607 toggle_formatting_marks is
3144     -- Show/Hide formatting marks in the editor and update related menu item.
3145     do
3146     current_editor.toggle_view_invisible_symbols
3147     if current_editor.view_invisible_symbols then
3148     formatting_marks_command_menu_item.set_text (Interface_names.m_Hide_formatting_marks)
3149     else
3150     formatting_marks_command_menu_item.set_text(Interface_names.m_Show_formatting_marks)
3151     end
3152 xavier 27860 end
3153    
3154 manus 50607 feature {NONE} -- Implementation / Menus
3155 manus 26913
3156 manus 50607 number_of_displayed_external_commands: INTEGER
3157     -- Number of external commands in the tools menu.
3158 xavier 30005
3159 manus 50607 old_cur: EV_CURSOR
3160     -- Cursor saved while displaying the hourglass cursor.
3161 manus 26913
3162 manus 50607 cur_wid: EV_WIDGET
3163     -- Widget on which the hourglass cursor was set.
3164 manus 26913
3165 manus 50607 project_menu: EV_MENU
3166     -- Menu for entries relative to the Project.
3167 manus 26913
3168 manus 50607 recent_projects_menu: EB_RECENT_PROJECTS_MANAGER_MENU
3169     -- SubMenu for recent projects.
3170 manus 26913
3171 manus 50607 during_synchronization: BOOLEAN
3172     -- Are we during a resynchronization?
3173 manus 26913
3174 manus 50607 formatting_marks_command_menu_item: EB_COMMAND_MENU_ITEM
3175     -- Menu item used to shw/hide formatting marks.
3176 manus 26913
3177 manus 50607 undo_accelerator: EV_ACCELERATOR
3178     -- Accelerator for Ctrl+Z
3179 manus 26913
3180 manus 50607 redo_accelerator: EV_ACCELERATOR
3181     -- Accelerator for Ctrl+Y
3182 manus 26913
3183 manus 50607 feature {EB_TOOL} -- Implementation / Commands
3184 manus 26913
3185 manus 50607 shell_cmd: EB_OPEN_SHELL_COMMAND
3186     -- Command to use an external editor.
3187 manus 26913
3188 manus 50607 undo_cmd: EB_UNDO_COMMAND
3189     -- Command to undo in the editor.
3190 manus 26913
3191 manus 50607 redo_cmd: EB_REDO_COMMAND
3192     -- Command to redo in the editor.
3193 manus 26913
3194 manus 50607 editor_cut_cmd: EB_ON_SELECTION_COMMAND
3195     -- Command to cut text in the editor.
3196 manus 26913
3197 manus 50607 editor_copy_cmd: EB_ON_SELECTION_COMMAND
3198     -- Command to copy text in the editor.
3199 manus 26913
3200 manus 50607 editor_paste_cmd: EB_EDITOR_PASTE_COMMAND
3201     -- Command to paste text in the editor.
3202 manus 26913
3203 manus 50607 melt_cmd: EB_MELT_PROJECT_COMMAND
3204     -- Command to start compilation.
3205 manus 26913
3206 manus 50607 freeze_cmd: EB_FREEZE_PROJECT_COMMAND
3207     -- Command to Freeze the project.
3208 manus 26913
3209 manus 50607 finalize_cmd: EB_FINALIZE_PROJECT_COMMAND
3210     -- Command to Finalize the project.
3211 manus 26913
3212 manus 50607 c_workbench_compilation_cmd: EB_C_COMPILATION_COMMAND
3213     -- Command to compile the workbench C code.
3214 manus 26913
3215 manus 50607 c_finalized_compilation_cmd: EB_C_COMPILATION_COMMAND
3216     -- Command to compile the finalized C code.
3217 manus 26913
3218 manus 50607 new_cluster_cmd: EB_NEW_CLUSTER_COMMAND
3219     -- Command to create a new cluster.
3220 manus 26913
3221 manus 50607 new_class_cmd: EB_NEW_CLASS_COMMAND
3222     -- Command to create a new class.
3223 manus 26913
3224 manus 50607 new_feature_cmd: EB_NEW_FEATURE_COMMAND
3225     -- 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 manus 26913
3230 manus 50607 toggle_stone_cmd: EB_UNIFY_STONE_CMD
3231     -- Command to toggle between the stone management modes.
3232 manus 26913
3233 manus 50607 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 xavier 30005
3237 manus 50607 show_profiler: EB_SHOW_PROFILE_TOOL
3238     -- What allows us to display the profiler window.
3239 manus 26913
3240 manus 50607 toolbarable_commands: ARRAYED_LIST [EB_TOOLBARABLE_COMMAND]
3241     -- All commands that can be put in a toolbar.
3242 manus 26913
3243 manus 50607 command_controller: EB_EDITOR_COMMAND_CONTROLLER
3244     -- Object that takes care of updating the sensitivity of all editor commands.
3245 manus 26913
3246 manus 50607 save_as_cmd: EB_SAVE_FILE_AS_COMMAND
3247     -- Command to save a class with a different file name.
3248 manus 26913
3249 manus 50607 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 manus 26913
3256 manus 50607 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 neilc 49534
3262 manus 50607 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 neilc 49534
3268 manus 50607 send_stone_to_context_cmd: EB_STANDARD_CMD
3269     -- Command to send the current stone to the context tool.
3270 neilc 49534
3271 manus 50607 print_cmd: EB_PRINT_COMMAND
3272     -- Command to print the content of editor with focus
3273 neilc 49534
3274 manus 50607 eac_browser_cmd: EB_OPEN_EAC_BROWSER_CMD is
3275     -- Command to display the eac browser
3276     do
3277     Result := Debugger_manager.eac_browser_cmd
3278     end
3279 neilc 49534
3280 manus 50607 show_favorites_menu_item: EV_MENU_ITEM
3281     -- Show/Hide favorites menu item.
3282 neilc 49534
3283 manus 50607 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 manus 26913 end
3292    
3293 manus 50607 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 manus 26913 end
3304 manus 50607
3305     feature {EB_TOOL_WINDOW, EB_EXPLORER_BAR, EB_DEBUGGER_MANAGER} -- Floating tool handling
3306 manus 26913
3307 manus 50607 all_tool_windows: ARRAYED_LIST [EB_TOOL_WINDOW]
3308     -- All tool windows under the control of `Current'.
3309 neilc 49534
3310 manus 50607 add_tool_window (a_tool_window: EB_TOOL_WINDOW) is
3311     -- Add `a_tool_window' to `all_tool_windows', ensuring it is
3312     -- then under the control of `Current'.
3313     require
3314     a_tool_window_not_void: a_tool_window /= Void
3315     do
3316     if all_tool_windows = Void then
3317     create all_tool_windows.make (2)
3318     end
3319     all_tool_windows.extend (a_tool_window)
3320     ensure
3321     extended: all_tool_windows.has (a_tool_window)
3322 neilc 49534 end
3323 manus 50607
3324     remove_tool_window (a_widget: EV_WIDGET) is
3325     -- Remove tool window associate with `a_widget'.
3326     require
3327     a_widget_not_void: a_widget /= Void
3328     do
3329     if all_tool_windows /= Void then
3330     from
3331     all_tool_windows.start
3332     until
3333     all_tool_windows.off
3334     loop
3335     if all_tool_windows.item.tool = a_widget then
3336     all_tool_windows.remove
3337     all_tool_windows.finish
3338     end
3339     all_tool_windows.forth
3340 rogers 40708 end
3341     end
3342     end
3343 manus 50607
3344     remove_all_tool_windows is
3345     -- Ensure `all_tool_windows' is empty if non Void.
3346     do
3347     if all_tool_windows /= Void then
3348     all_tool_windows.wipe_out
3349     end
3350     ensure
3351     tool_windows_empty: all_tool_windows /= Void implies all_tool_windows.is_empty
3352 rogers 44501 end
3353 manus 50607
3354    
3355     window_moved (x_pos, y_pos: INTEGER) is
3356     -- `Current' has been moved, so move all associated tool windows within `all_tool_windows'.
3357     local
3358     tool_window: EB_TOOL_WINDOW
3359     do
3360     if all_tool_windows /= Void then
3361     from
3362     all_tool_windows.start
3363     until
3364     all_tool_windows.off
3365     loop
3366     tool_window := all_tool_windows.item
3367     check
3368     not_destroyed: not tool_window.window.is_destroyed
3369     end
3370 neilc 50976 if preferences.development_window_data.dock_tracking then
3371 manus 50607 tool_window.window.move_actions.block
3372     tool_window.window.set_x_position (x_pos + tool_window.x_position)
3373     tool_window.window.set_y_position (y_pos + tool_window.y_position)
3374     tool_window.window.move_actions.resume
3375     else
3376     -- If we are not performing dock tracking, we must update the relative position
3377     -- of the tool window, so that if dock tracking is enabled, the relative
3378     -- positions are correct.
3379     tool_window.set_x_position ( tool_window.window.screen_x - x_pos)
3380     tool_window.set_y_position ( tool_window.window.screen_y - y_pos)
3381     end
3382     all_tool_windows.forth
3383 rogers 40708 end
3384 manus 50607 end
3385     end
3386    
3387     feature {NONE} -- Execution
3388 manus 26913
3389 manus 50607 Kcst: EV_KEY_CONSTANTS is
3390     -- A way to access key constants.
3391     once
3392     create Result
3393     end
3394 manus 26913
3395 manus 50607 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     -- Action called when the user right-click in the toolbar.
3397     -- Display a popup menu to show/hide toolbars and customize the general toolbar.
3398     local
3399     popup_menu: EV_MENU
3400     do
3401     if a_button = 3 then
3402     popup_menu := build_toolbar_menu
3403     popup_menu.show
3404     end
3405 manus 26913 end
3406    
3407 manus 50607 enable_commands_on_project_created is
3408     -- Enable commands when a new project has been created (not yet compiled)
3409     do
3410     system_info_cmd.enable_sensitive
3411     if
3412     stone /= Void and then
3413     not unified_stone
3414     then
3415     send_stone_to_context_cmd.enable_sensitive
3416     end
3417 manus 26913 end
3418    
3419 manus 50607 enable_commands_on_project_loaded is
3420     -- Enable commands when a new project has been created and compiled
3421     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