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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 58027 - (show annotations)
Wed Apr 5 07:08:57 2006 UTC (13 years, 10 months ago) by manus
Original Path: trunk/Src/bench/Eiffel/interface/new_graphical/windows/eb_development_window.e
File size: 129299 byte(s)
Fixed mixing paranthesis in indexing clause for the licensing.
Added missing license reference in newly created Eiffel classes.

1 indexing
2 description : "Window holding a project tool"
3 legal: "See notice at end of class."
4 status: "See notice at end of class."
5 date : "$Date$"
6 revision : "$Revision$"
7 author : "$Author$"
8
9 class
10 EB_DEVELOPMENT_WINDOW
11
12 inherit
13 EB_TOOL_MANAGER
14 redefine
15 make,
16 init_size_and_position,
17 window_displayed,
18 init_commands,
19 build_menu_bar,
20 build_menus,
21 build_file_menu,
22 build_edit_menu,
23 build_view_menu,
24 build_tools_menu,
25 build_favorites_menu,
26 refresh,
27 recycle,
28 destroy_imp,
29 destroy,
30 position,
31 pos_container
32 end
33
34 EB_FILEABLE
35 export {NONE}
36 set_position,
37 set_pos_container
38 redefine
39 set_stone,
40 reset,
41 stone,
42 on_text_saved,
43 perform_check_before_save,
44 check_passed,
45 update_save_symbol,
46 position,
47 pos_container
48 select
49 set_stone
50 end
51
52 EB_FILEABLE
53 rename
54 set_stone as old_set_stone
55 export {NONE}
56 old_set_stone,
57 set_position,
58 set_pos_container
59 redefine
60 reset,
61 stone,
62 on_text_saved,
63 perform_check_before_save,
64 check_passed,
65 update_save_symbol,
66 position,
67 pos_container
68 end
69
70
71 -- Shared tools & contexts
72
73 SHARED_EIFFEL_PROJECT
74
75 PROJECT_CONTEXT
76
77 EB_SHARED_MANAGERS
78
79 EB_SHARED_GRAPHICAL_COMMANDS
80
81 EB_SHARED_PREFERENCES
82 export
83 {NONE} all
84 end
85
86 EV_STOCK_PIXMAPS
87
88 EB_CONFIRM_SAVE_CALLBACK
89
90 -- Errors
91 EB_GRAPHICAL_ERROR_MANAGER
92
93 TEXT_OBSERVER
94 redefine
95 on_text_reset, on_text_edited,
96 on_text_back_to_its_last_saved_state,
97 on_text_fully_loaded, on_cursor_moved
98 end
99
100 EV_KEY_CONSTANTS
101 export
102 {NONE} All
103 end
104
105 EIFFEL_ENV
106 export
107 {NONE} All
108 end
109
110 SHARED_TEXT_ITEMS
111 export
112 {NONE} All
113 end
114
115 create {EB_WINDOW_MANAGER}
116 make,
117 make_with_session_data,
118 make_as_context_tool,
119 make_as_editor
120
121 feature {NONE} -- Initialization
122
123 make_as_context_tool is
124 -- Create a new development window and expand the context tool.
125 do
126 make
127 -- Perform window setting from `show_actions', as the
128 -- resizing executed as a result only works correctly
129 -- while the window is displayed.
130 window.show_actions.extend (agent set_context_mode)
131 end
132
133 set_context_mode is
134 -- Set `current' into context mode, that is the context tool
135 -- maximized, and the non editor panel is hidden.
136 do
137 if not context_tool.shown then
138 context_tool.show
139 end
140 if not unified_stone then
141 toggle_stone_cmd.execute
142 end
143 context_tool.explorer_bar_item.maximize
144 close_all_bars_except (right_panel)
145 end
146
147 make_as_editor is
148 -- Create a new development window and expand the editor tool.
149 do
150 make
151 -- Perform window setting from `show_actions', as the resizing executed
152 -- must be performed after `current' is displayed.
153 window.show_actions.extend (agent (editor_tool.explorer_bar_item).maximize)
154 window.show_actions.extend (agent close_all_bars_except (right_panel))
155 end
156
157 make_with_session_data (a_session_data: EB_DEVELOPMENT_WINDOW_SESSION_DATA) is
158 -- Recreate a previously existing development window using `a_session_data'.
159 local
160 l_class_i: CLASS_I
161 l_class_c_stone: CLASSC_STONE
162 l_cluster_string, l_class_string, l_feature_string: STRING
163 do
164 internal_development_window_data := a_session_data
165 make
166 -- Attempt to reload last edited class of `Current'.
167 if a_session_data.file_name /= Void then
168 conf_todo
169 -- l_class_i := eiffel_universe.class_with_file_name (a_session_data.file_name)
170 if l_class_i /= Void and then l_class_i.compiled then
171 -- Create compiled class stone and target `Current' to it.
172 create l_class_c_stone.make (l_class_i.compiled_class)
173 set_stone_after_check (l_class_c_stone)
174 if a_session_data.editor_position > 0 then
175 editor_tool.text_area.display_line_when_ready (a_session_data.editor_position, False)
176 end
177 end
178 end
179 if context_tool /= Void then
180 -- Presumption is made that if the strings are not void then they represent
181 -- valid entities in the project.
182 l_cluster_string := a_session_data.context_cluster_string
183 l_class_string := a_session_data.context_class_string
184 l_feature_string := a_session_data.context_feature_string
185 if l_feature_string /= Void then
186 context_tool.address_manager.feature_address.set_text (l_feature_string)
187 context_tool.address_manager.class_address.set_text (l_class_string)
188 context_tool.address_manager.execute_with_feature
189 elseif l_class_string /= Void then
190 context_tool.address_manager.class_address.set_text (l_class_string)
191 context_tool.address_manager.execute_with_class
192 elseif l_cluster_string /= Void then
193 context_tool.address_manager.cluster_address.set_text (l_cluster_string)
194 context_tool.address_manager.execute_with_cluster
195 end
196 -- Set the appropriate notebook tab
197 context_tool.notebook.select_item (context_tool.notebook.i_th (a_session_data.context_tab_index))
198 end
199 end
200
201 make is
202 -- Create a new development window.
203 do
204 unified_stone := preferences.development_window_data.context_unified_stone
205 -- Build the history manager, the address manager, ...
206 create history_manager.make (Current)
207 create address_manager.make (Current, False)
208 build_formatters
209 address_manager.set_formatters (managed_main_formatters)
210
211 -- Init commands, build interface, build menus, ...
212 Precursor
213
214 initialized := False -- Reset the flag since initialization is not yet complete.
215 set_up_accelerators
216
217 window.focus_in_actions.extend(agent on_focus)
218
219 -- Create the toolbars.
220 build_toolbars_area
221 container.put_front (toolbars_area)
222 container.disable_item_expand (toolbars_area)
223
224 -- Update widgets visibilities
225 window.show_actions.extend (agent update)
226 status_bar.remove_cursor_position
227 address_manager.set_output_line (status_bar.label)
228
229 -- Finish initializing the main editor formatters
230 end_build_formatters
231
232 address_manager.disable_formatters
233 if Eiffel_project.manager.is_project_loaded then
234 on_project_created
235 on_project_loaded
236 elseif Eiffel_project.manager.is_created then
237 on_project_unloaded
238 on_project_created
239 else
240 on_project_unloaded
241 end
242
243 -- Create feature position table
244 create feature_positions.make (1)
245 feature_positions.compare_objects
246
247 window.move_actions.force_extend (agent window_moved)
248
249 initialized := True
250 is_destroying := False
251 end
252
253 init_size_and_position is
254 -- Initialize window size.
255 local
256 screen: EB_STUDIO_SCREEN
257 l_x, l_y: INTEGER
258 do
259 create screen
260 window.set_size (
261 development_window_data.width.min (screen.width),
262 development_window_data.height.min (screen.height))
263 l_x := development_window_data.x_position
264 if l_x < screen.virtual_left or l_x > screen.virtual_right then
265 -- Somehow screens have changed, reset it to 0
266 l_x := 0
267 end
268 l_y := development_window_data.y_position
269 if l_y < screen.virtual_top or l_y > screen.virtual_bottom then
270 -- Somehow screens have changed, reset it to 0
271 l_y := 0
272 end
273 window.set_position (l_x, l_y)
274 end
275
276 window_displayed is
277 -- `Current' has been displayed on screen.
278 do
279 -- Minimize or Maximize window if needed.
280 if development_window_data.is_maximized then
281 window.maximize
282 elseif development_window_data.is_minimized then
283 window.minimize
284 end
285 end
286
287 init_commands is
288 -- Initialize commands.
289 local
290 accel: EV_ACCELERATOR
291 do
292 Precursor
293 create toolbarable_commands.make (15)
294
295 -- Open, save, ...
296 toolbarable_commands.extend (new_editor_cmd)
297
298 toolbarable_commands.extend (new_context_tool_cmd)
299
300 create open_cmd.make (Current)
301 toolbarable_commands.extend (open_cmd)
302
303 create save_cmd.make (Current)
304 toolbarable_commands.extend (save_cmd)
305
306 create save_as_cmd.make (Current)
307 if editor_tool = Void or else editor_tool.text_area.is_empty then
308 save_as_cmd.disable_sensitive
309 else
310 save_as_cmd.enable_sensitive
311 end
312
313 create shell_cmd.make (Current)
314 toolbarable_commands.extend (shell_cmd)
315
316 create print_cmd.make (Current)
317 if is_empty then
318 print_cmd.disable_sensitive
319 else
320 print_cmd.enable_sensitive
321 end
322 toolbarable_commands.extend (print_cmd)
323
324 -- Compilation
325 create c_workbench_compilation_cmd.make_workbench (Current)
326 create c_finalized_compilation_cmd.make_finalized (Current)
327 if has_dll_generation then
328 create show_dynamic_lib_tool.make
329 show_dynamic_lib_tool.set_menu_name (Interface_names.m_new_dynamic_lib)
330 show_dynamic_lib_tool.add_agent (agent show_dynamic_library_dialog)
331 end
332 if has_profiler then
333 create show_profiler
334 end
335
336 -- Undo/redo, cut, copy, paste.
337 create undo_cmd.make (Current)
338 toolbarable_commands.extend (undo_cmd)
339
340 create redo_cmd.make (Current)
341 toolbarable_commands.extend (redo_cmd)
342
343 create editor_paste_cmd.make (Current)
344 toolbarable_commands.extend (editor_paste_cmd)
345
346 create new_cluster_cmd.make (Current)
347 toolbarable_commands.extend (new_cluster_cmd)
348
349 create new_class_cmd.make (Current)
350 toolbarable_commands.extend (new_class_cmd)
351
352 create delete_class_cluster_cmd.make (Current)
353 toolbarable_commands.extend (delete_class_cluster_cmd)
354
355 create new_feature_cmd.make (Current)
356 toolbarable_commands.extend (new_feature_cmd)
357
358 create toggle_feature_alias_cmd.make (Current)
359 toolbarable_commands.extend (toggle_feature_alias_cmd)
360
361 create toggle_feature_signature_cmd.make (Current)
362 toolbarable_commands.extend (toggle_feature_signature_cmd)
363
364 create toggle_feature_assigner_cmd.make (Current)
365 toolbarable_commands.extend (toggle_feature_assigner_cmd)
366
367 create toggle_stone_cmd.make (Current)
368 toolbarable_commands.extend (toggle_stone_cmd)
369
370 create send_stone_to_context_cmd.make
371 send_stone_to_context_cmd.set_pixmap (Pixmaps.Icon_send_stone_down)
372 send_stone_to_context_cmd.set_tooltip (Interface_names.e_send_stone_to_context)
373 send_stone_to_context_cmd.set_menu_name (Interface_names.m_send_stone_to_context)
374 send_stone_to_context_cmd.set_name ("Send_to_context")
375 send_stone_to_context_cmd.set_tooltext (Interface_names.b_send_stone_to_context)
376 send_stone_to_context_cmd.add_agent (agent send_stone_to_context)
377 create accel.make_with_key_combination (
378 create {EV_KEY}.make_with_code ({EV_KEY_CONSTANTS}.Key_down), False, True, False
379 )
380 accel.actions.extend (agent send_stone_to_context)
381 send_stone_to_context_cmd.set_accelerator (accel)
382 send_stone_to_context_cmd.disable_sensitive
383 toolbarable_commands.extend (send_stone_to_context_cmd)
384
385 toolbarable_commands.extend (window_manager.minimize_all_cmd)
386 window_manager.minimize_all_cmd.enable_sensitive
387 toolbarable_commands.extend (window_manager.raise_all_cmd)
388 window_manager.raise_all_cmd.enable_sensitive
389
390 toolbarable_commands.extend (New_development_window_cmd)
391 -- Show tool/toolbar commands (will be filled when tools will
392 -- be created)
393 create show_tool_commands.make (7)
394 create show_toolbar_commands.make (3)
395
396 new_feature_cmd.disable_sensitive
397 toggle_feature_alias_cmd.disable_sensitive
398 toggle_feature_signature_cmd.disable_sensitive
399 toggle_feature_assigner_cmd.disable_sensitive
400
401 create editors.make (5)
402 estudio_debug_cmd.set_main_window (window)
403 end
404
405 set_up_accelerators is
406 -- Fill the accelerator of `window' with the accelerators of the `toolbarable_commands'.
407 local
408 cmds: ARRAYED_LIST [EB_TOOLBARABLE_COMMAND]
409 do
410 --| Accelerators related to toolbarable_commands
411 from
412 cmds := toolbarable_commands
413 cmds.start
414 until
415 cmds.after
416 loop
417 if cmds.item.accelerator /= Void then
418 window.accelerators.extend (cmds.item.accelerator)
419 end
420 cmds.forth
421 end
422
423 --| Accelerators related to debugging toolbarable_commands
424 from
425 cmds := Eb_debugger_manager.toolbarable_commands
426 cmds.start
427 until
428 cmds.after
429 loop
430 if
431 cmds.item.accelerator /= Void
432 then
433 window.accelerators.extend (cmds.item.accelerator)
434 end
435 cmds.forth
436 end
437 end
438
439 build_formatters is
440 -- Build all formatters used.
441 local
442 form: EB_CLASS_TEXT_FORMATTER
443 accel: EV_ACCELERATOR
444 do
445 create managed_class_formatters.make (17)
446 managed_class_formatters.extend (create {EB_CLICKABLE_FORMATTER}.make (Current))
447 managed_class_formatters.extend (create {EB_FLAT_FORMATTER}.make (Current))
448 managed_class_formatters.extend (create {EB_SHORT_FORMATTER}.make (Current))
449 managed_class_formatters.extend (create {EB_FLAT_SHORT_FORMATTER}.make (Current))
450 managed_class_formatters.extend (Void)
451 managed_class_formatters.extend (create {EB_ANCESTORS_FORMATTER}.make (Current))
452 managed_class_formatters.extend (create {EB_DESCENDANTS_FORMATTER}.make (Current))
453 managed_class_formatters.extend (create {EB_CLIENTS_FORMATTER}.make (Current))
454 managed_class_formatters.extend (create {EB_SUPPLIERS_FORMATTER}.make (Current))
455 managed_class_formatters.extend (Void)
456 managed_class_formatters.extend (create {EB_ATTRIBUTES_FORMATTER}.make (Current))
457 managed_class_formatters.extend (create {EB_ROUTINES_FORMATTER}.make (Current))
458 managed_class_formatters.extend (create {EB_INVARIANTS_FORMATTER}.make (Current))
459 managed_class_formatters.extend (create {EB_CREATORS_FORMATTER}.make (Current))
460 managed_class_formatters.extend (create {EB_DEFERREDS_FORMATTER}.make (Current))
461 managed_class_formatters.extend (create {EB_ONCES_FORMATTER}.make (Current))
462 managed_class_formatters.extend (create {EB_EXTERNALS_FORMATTER}.make (Current))
463 managed_class_formatters.extend (create {EB_EXPORTED_FORMATTER}.make (Current))
464
465 create managed_feature_formatters.make (12)
466 managed_feature_formatters.extend (create {EB_BASIC_FEATURE_FORMATTER}.make (Current))
467 managed_feature_formatters.extend (create {EB_ROUTINE_FLAT_FORMATTER}.make (Current))
468 managed_feature_formatters.extend (Void)
469 managed_feature_formatters.extend (create {EB_CALLERS_FORMATTER}.make (Current, 0))
470 managed_feature_formatters.extend (create {EB_CALLERS_FORMATTER}.make (Current,
471 {DEPEND_UNIT}.is_in_assignment_flag))
472 managed_feature_formatters.extend (create {EB_CALLERS_FORMATTER}.make (Current,
473 {DEPEND_UNIT}.is_in_creation_flag))
474 managed_feature_formatters.extend (Void)
475 managed_feature_formatters.extend (create {EB_IMPLEMENTERS_FORMATTER}.make (Current))
476 managed_feature_formatters.extend (create {EB_ROUTINE_ANCESTORS_FORMATTER}.make (Current))
477 managed_feature_formatters.extend (create {EB_ROUTINE_DESCENDANTS_FORMATTER}.make (Current))
478 managed_feature_formatters.extend (Void)
479 managed_feature_formatters.extend (create {EB_HOMONYMS_FORMATTER}.make (Current))
480
481
482 create managed_main_formatters.make (6)
483
484 create {EB_BASIC_TEXT_FORMATTER} form.make (Current)
485 create accel.make_with_key_combination (
486 create {EV_KEY}.make_with_code ({EV_KEY_CONSTANTS}.Key_t),
487 True, False, True)
488 accel.actions.extend (agent form.execute)
489 form.set_accelerator (accel)
490 managed_main_formatters.extend (form)
491
492 create {EB_CLICKABLE_FORMATTER} form.make (Current)
493 create accel.make_with_key_combination (
494 create {EV_KEY}.make_with_code ({EV_KEY_CONSTANTS}.Key_c),
495 True, False, True)
496 accel.actions.extend (agent form.execute)
497 form.set_accelerator (accel)
498 managed_main_formatters.extend (form)
499
500 create {EB_FLAT_FORMATTER} form.make (Current)
501 create accel.make_with_key_combination (
502 create {EV_KEY}.make_with_code ({EV_KEY_CONSTANTS}.Key_f),
503 True, False, True)
504 accel.actions.extend (agent form.execute)
505 form.set_accelerator (accel)
506 managed_main_formatters.extend (form)
507
508 create {EB_SHORT_FORMATTER} form.make (Current)
509 create accel.make_with_key_combination (
510 create {EV_KEY}.make_with_code ({EV_KEY_CONSTANTS}.Key_o),
511 True, False, True)
512 accel.actions.extend (agent form.execute)
513 form.set_accelerator (accel)
514 managed_main_formatters.extend (form)
515
516 create {EB_FLAT_SHORT_FORMATTER} form.make (Current)
517 create accel.make_with_key_combination (
518 create {EV_KEY}.make_with_code ({EV_KEY_CONSTANTS}.Key_i),
519 True, False, True)
520 accel.actions.extend (agent form.execute)
521 form.set_accelerator (accel)
522 managed_main_formatters.extend (form)
523 end
524
525 end_build_formatters is
526 -- Finish initialization of formatters (associate them with editor
527 -- and select a formatter).
528 local
529 f_ind: INTEGER
530 do
531 from
532 managed_class_formatters.start
533 until
534 managed_class_formatters.after
535 loop
536 if managed_class_formatters.item /= Void then
537 managed_class_formatters.item.set_manager (context_tool)
538 end
539 managed_class_formatters.forth
540 end
541 from
542 managed_feature_formatters.start
543 until
544 managed_feature_formatters.after
545 loop
546 if managed_feature_formatters.item /= Void then
547 managed_feature_formatters.item.set_manager (context_tool)
548 end
549 managed_feature_formatters.forth
550 end
551 from
552 managed_main_formatters.start
553 until
554 managed_main_formatters.after
555 loop
556 managed_main_formatters.item.set_editor (editor_tool.text_area)
557 managed_main_formatters.item.on_shown
558 if managed_main_formatters.item.accelerator /= Void then
559 window.accelerators.extend (managed_main_formatters.item.accelerator)
560 end
561 managed_main_formatters.forth
562 end
563
564 (managed_main_formatters @ 1).enable_select;
565
566 -- We now select the correct class formatter.
567 f_ind := preferences.context_tool_data.default_class_formatter_index
568 --| This takes the formatter separators in consideration.
569 if f_ind > 4 then
570 f_ind := f_ind + 1
571 end
572 if f_ind > 8 then
573 f_ind := f_ind + 1
574 end
575 if f_ind < 1 or f_ind > managed_class_formatters.count then
576 f_ind := 6
577 end
578 (managed_class_formatters @ f_ind).enable_select;
579 -- We now select the correct feature formatter.
580 f_ind := preferences.context_tool_data.default_feature_formatter_index
581 if f_ind > 2 then
582 f_ind := f_ind + 1
583 end
584 if f_ind < 1 or f_ind > managed_feature_formatters.count then
585 f_ind := 2
586 end
587 managed_class_formatters.i_th (f_ind).enable_select
588 end
589
590 build_tools is
591 -- Build all tools that can take place in this window and put them
592 -- in `left_tools' or `bottom_tools'.
593 local
594 show_cmd: EB_SHOW_TOOL_COMMAND
595 l_accel: EV_ACCELERATOR
596 l_shortcut_preference: SHORTCUT_PREFERENCE
597 do
598 lock_update
599 -- Build the features tool
600 create features_tool.make (Current)
601 features_tool.attach_to_explorer_bar (left_panel)
602 left_tools.extend (features_tool.explorer_bar_item)
603 create show_cmd.make (Current, features_tool.explorer_bar_item)
604 show_tool_commands.extend (show_cmd)
605 toolbarable_commands.extend (show_cmd)
606 add_recyclable (features_tool)
607
608 -- Build the breakpoints tool
609 create breakpoints_tool.make (Current)
610 breakpoints_tool.attach_to_explorer_bar (left_panel)
611 left_tools.extend (breakpoints_tool.explorer_bar_item)
612 create show_cmd.make (Current, breakpoints_tool.explorer_bar_item)
613 show_tool_commands.extend (show_cmd)
614 toolbarable_commands.extend (show_cmd)
615 add_recyclable (breakpoints_tool)
616
617 -- Build the cluster tool
618 create cluster_tool.make (Current, Current)
619 cluster_tool.attach_to_explorer_bar (left_panel)
620 left_tools.extend (cluster_tool.explorer_bar_item)
621 create show_cmd.make (Current, cluster_tool.explorer_bar_item)
622 show_tool_commands.extend (show_cmd)
623 toolbarable_commands.extend (show_cmd)
624 add_recyclable (cluster_tool)
625
626 -- Build the favorites tool
627 create favorites_tool.make (Current, favorites_manager)
628 favorites_tool.attach_to_explorer_bar (left_panel)
629 left_tools.extend (favorites_tool.explorer_bar_item)
630 create show_cmd.make (Current, favorites_tool.explorer_bar_item)
631 show_tool_commands.extend (show_cmd)
632 toolbarable_commands.extend (show_cmd)
633 add_recyclable (favorites_tool)
634
635 -- Build the windows tool (formerly known as Selector tool)
636 create windows_tool.make (Current)
637 windows_tool.attach_to_explorer_bar (left_panel)
638 left_tools.extend (windows_tool.explorer_bar_item)
639 create show_cmd.make (Current, windows_tool.explorer_bar_item)
640 show_tool_commands.extend (show_cmd)
641 toolbarable_commands.extend (show_cmd)
642 add_recyclable (windows_tool)
643
644 -- Build the search tool
645 create search_tool.make (Current)
646 search_tool.attach_to_explorer_bar (right_panel)
647 bottom_tools.extend (search_tool.explorer_bar_item)
648 create show_cmd.make (Current, search_tool.explorer_bar_item)
649 l_shortcut_preference := preferences.editor_data.shortcuts.item ("show_search_panel")
650 create l_accel.make_with_key_combination (l_shortcut_preference.key, l_shortcut_preference.is_ctrl, l_shortcut_preference.is_alt, l_shortcut_preference.is_shift)
651 l_accel.actions.extend (agent search_tool.prepare_search)
652 show_cmd.set_accelerator (l_accel)
653 show_tool_commands.extend (show_cmd)
654 toolbarable_commands.extend (show_cmd)
655 add_recyclable (search_tool)
656
657 -- Build the editor tool
658 create editor_tool.make (Current)
659 editor_tool.attach_to_explorer_bar (right_panel)
660 bottom_tools.extend (editor_tool.explorer_bar_item)
661 editor_tool.text_area.add_edition_observer(save_cmd)
662 editor_tool.text_area.add_edition_observer(save_as_cmd)
663 editor_tool.text_area.add_edition_observer(print_cmd)
664 editor_tool.text_area.add_edition_observer(Current)
665 editor_tool.text_area.add_edition_observer(search_tool)
666 editor_tool.text_area.drop_actions.set_veto_pebble_function (agent can_drop)
667 editor_tool.text_area.add_cursor_observer (Current)
668 create show_cmd.make(Current, editor_tool.explorer_bar_item)
669 show_tool_commands.extend (show_cmd)
670 toolbarable_commands.extend (show_cmd)
671
672 -- The minimim height masks a bug on windows to do with the sizing of the editors
673 -- scroll bars, which were affecting the resizing although they should not have done so.
674 -- Having a default minimum height on the editor is perfectly reasonable.
675 editor_tool.widget.set_minimum_height (20)
676 add_recyclable (editor_tool)
677
678 -- Build the context tool
679 create context_tool.make (Current)
680 context_tool.attach_to_explorer_bar (right_panel)
681 bottom_tools.extend (context_tool.explorer_bar_item)
682 create show_cmd.make (Current, context_tool.explorer_bar_item)
683 show_tool_commands.extend (show_cmd)
684 toolbarable_commands.extend (show_cmd)
685 add_recyclable (context_tool)
686
687 -- Build the refactoring tools
688 toolbarable_commands.extend (refactoring_manager.pull_command)
689 toolbarable_commands.extend (refactoring_manager.rename_command)
690 toolbarable_commands.extend (refactoring_manager.undo_command)
691 toolbarable_commands.extend (refactoring_manager.redo_command)
692
693 -- Set the flag "Tools initialized"
694 tools_initialized := True
695
696 -- Initialize undo / redo accelerators
697 create undo_accelerator.make_with_key_combination (
698 create {EV_KEY}.make_with_code (Key_z), True, False, False)
699 if has_case then
700 undo_accelerator.actions.extend (agent (context_tool.editor.undo_cmd).on_ctrl_z)
701 end
702 undo_accelerator.actions.extend (agent undo_cmd.accelerator_execute)
703 create redo_accelerator.make_with_key_combination (
704 create {EV_KEY}.make_with_code (Key_y), True, False, False)
705 if has_case then
706 redo_accelerator.actions.extend (agent (context_tool.editor.redo_cmd).on_ctrl_y)
707 end
708 redo_accelerator.actions.extend (agent redo_cmd.accelerator_execute)
709 window.accelerators.extend (undo_accelerator)
710 window.accelerators.extend (redo_accelerator)
711 unlock_update
712 end
713
714 feature -- Access
715
716 cluster: CLUSTER_I is
717 -- Cluster for current class. Void if none.
718 do
719 conf_todo_msg ("Update callers to use `group' instead.")
720 Result ?= group
721 end
722
723 group: CONF_GROUP is
724 -- Group of current class. Void if none.
725 local
726 classi_stone: CLASSI_STONE
727 cluster_stone: CLUSTER_STONE
728 do
729 classi_stone ?= stone
730 if classi_stone /= Void then
731 Result := classi_stone.group
732 end
733 cluster_stone ?= stone
734 if cluster_stone /= Void then
735 Result := cluster_stone.group
736 end
737 end
738
739 class_name: STRING is
740 -- Name of the current class, Void if none.
741 local
742 class_stone: CLASSI_STONE
743 do
744 class_stone ?= stone
745 if class_stone /= Void then
746 Result := class_stone.class_name
747 end
748 end
749
750 feature_name: STRING is
751 -- Name of the current feature, Void if none.
752 local
753 feature_stone: FEATURE_STONE
754 do
755 feature_stone ?= stone
756 if feature_stone /= Void then
757 Result := feature_stone.feature_name
758 end
759 end
760
761 feature -- Status setting
762
763 disable_sensitive is
764 -- Disable sensitivity of all widgets.
765 do
766 window.disable_sensitive
767 end
768
769 enable_sensitive is
770 -- Enable sensitivity of all widgets.
771 do
772 window.enable_sensitive
773 end
774
775 feature -- Window Settings
776
777 set_initialized is
778 -- Set `initialized' to True.
779 do
780 initialized := True
781 end
782
783 set_text (a_text: STRING) is
784 -- Assign `a_text' to `text'.
785 require
786 a_text_not_void: a_text /= Void
787 do
788 editor_tool.text_area.set_editor_text (a_text)
789 ensure
790 --| FIXME This needs to work: text_assigned: text.is_equal (a_text)
791 --| FIXME changed_flag_set: changed
792 end
793
794 feature -- Window Properties
795
796 changed: BOOLEAN is
797 -- Has something been changed and not yet been saved?
798 do
799 Result := editor_tool.changed
800 end
801
802 is_empty: BOOLEAN is
803 -- Does `Current's text is empty?
804 do
805 Result := editor_tool = Void or else editor_tool.text_area.is_empty
806 end
807
808 text: STRING is
809 -- Text representing Current
810 do
811 Result := editor_tool.text_area.text
812 end
813
814 pixmap: EV_PIXMAP is
815 -- Pixmap representing Current window.
816 do
817 Result := Pixmaps.Icon_development_window
818 end
819
820 feature -- Pulldown Menus
821
822 metric_menu: EV_MENU
823 -- Menu for entries of metric tool.
824
825 format_menu: EV_MENU
826 -- ID Menu for formats.
827 -- Only used during debugging
828
829 compile_menu: EV_MENU
830 -- Compile ID menu.
831
832 debug_menu: EV_MENU
833 -- Debug ID menu.
834
835 debugging_tools_menu: EV_MENU
836 -- Debugging tools menu item
837
838 active_menus (erase: BOOLEAN) is
839 -- Enable all the menus and if `erase' clean
840 -- the content of the Project tool.
841 do
842 compile_menu.enable_sensitive
843 if erase then
844 output_manager.clear
845 end
846 end
847
848 disable_menus is
849 -- Disable all the menus.
850 do
851 compile_menu.disable_sensitive
852 end
853
854 update_debug_menu is
855 -- Update debug menu
856 do
857 Eb_debugger_manager.update_debugging_tools_menu_from (Current)
858 end
859
860 feature -- Modifiable menus
861
862 melt_menu_item: EV_MENU_ITEM
863 -- Melt menu entry
864
865 freeze_menu_item: EV_MENU_ITEM
866 -- Freeze menu entry
867
868 finalize_menu_item: EV_MENU_ITEM
869 -- Finalize menu entry
870
871 feature -- Update
872
873 synchronize is
874 -- Synchronize stones.
875 local
876 st: STONE
877 l_text_area: EB_SMART_EDITOR
878 do
879 during_synchronization := True
880 favorites_manager.refresh
881 context_tool.synchronize
882 cluster_tool.synchronize
883 history_manager.synchronize
884 features_tool.synchronize
885 breakpoints_tool.synchronize
886 -- Update main views
887 managed_main_formatters.i_th (2).invalidate
888 managed_main_formatters.i_th (3).invalidate
889 managed_main_formatters.i_th (4).invalidate
890 managed_main_formatters.i_th (5).invalidate
891 if stone /= Void then
892 st := stone.synchronized_stone
893 end
894 l_text_area := editor_tool.text_area
895 l_text_area.update_click_list (False)
896 if l_text_area.file_loaded then
897 editor_tool.text_area.check_document_modifications_and_reload
898 end
899 set_stone (st)
900 update_save_symbol
901 address_manager.refresh
902 during_synchronization := False
903 end
904
905 synchronize_routine_tool_to_default is
906 -- Synchronize the editor tool to the debug format.
907 do
908 --| FIXME ARNAUD: To be implemented
909 end
910
911 clear_object_tool is
912 -- Clear the contents of the object tool if shown.
913 do
914 --| FIXME ARNAUD: To be implemented
915 end
916
917 build_menus is
918 -- Build all menus displayed in the development window.
919 do
920 -- Build each menu
921 build_file_menu
922 build_edit_menu
923 build_view_menu
924 build_favorites_menu
925 build_project_menu
926 build_debug_menu
927 build_tools_menu
928 build_window_menu
929 build_help_menu
930 -- Build the menu bar.
931 build_menu_bar
932 end
933
934 build_debug_menu is
935 -- Build the `Debug' menu through the debugger_manager.
936 local
937 conv_mit: EB_COMMAND_MENU_ITEM
938 do
939 debug_menu := Eb_debugger_manager.new_debug_menu
940 from
941 debug_menu.start
942 until
943 debug_menu.after
944 loop
945 conv_mit ?= debug_menu.item
946 if conv_mit /= Void then
947 add_recyclable (conv_mit)
948 end
949 debug_menu.forth
950 end
951 --| Debugging tools menu
952 debugging_tools_menu := Eb_debugger_manager.new_debugging_tools_menu
953 debug_menu.extend (create {EV_MENU_SEPARATOR})
954 debug_menu.extend (debugging_tools_menu)
955 update_debug_menu
956 end
957
958 build_menu_bar is
959 -- Build the menu bar
960 local
961 mb: EV_MENU_BAR
962 do
963 check
964 window.menu_bar /= Void implies not window.menu_bar.is_empty
965 -- If a menu bar was already present, it shouldn't be empty.
966 end
967 if window.menu_bar /= Void then
968 mb := window.menu_bar
969 from
970 mb.start
971 mb.forth
972 until
973 mb.after
974 loop
975 mb.remove
976 end
977 else
978 create mb
979 window.set_menu_bar (mb)
980 mb.extend (file_menu)
981 end
982
983 if Eiffel_project.manager.is_created then
984 mb.extend (edit_menu)
985 mb.extend (view_menu)
986 mb.extend (favorites_menu)
987 mb.extend (project_menu)
988 mb.extend (debug_menu)
989 else
990 mb.extend (view_menu)
991 end
992 mb.extend (tools_menu)
993 mb.extend (window_menu)
994 mb.extend (help_menu)
995 estudio_debug_cmd.build_menu_bar
996 end
997
998 feature -- Graphical Interface
999
1000 build_general_toolbar is
1001 -- Set up the general toolbar (New, Save, Search, Shell, Undo, Redo, ...)
1002 local
1003 cell: EV_CELL
1004 hsep: EV_HORIZONTAL_SEPARATOR
1005 hbox: EV_HORIZONTAL_BOX
1006 do
1007 -- Create the toolbar.
1008 create general_toolbar
1009 general_customizable_toolbar := development_window_data.retrieve_general_toolbar (toolbarable_commands)
1010 if development_window_data.show_text_in_general_toolbar then
1011 general_customizable_toolbar.enable_important_text
1012 elseif development_window_data.show_all_text_in_general_toolbar then
1013 general_customizable_toolbar.enable_text_displayed
1014 end
1015
1016 create hbox
1017 hbox.extend (general_customizable_toolbar.widget)
1018 hbox.disable_item_expand (general_customizable_toolbar.widget)
1019
1020 -- Generate the toolbar.
1021 general_customizable_toolbar.update_toolbar
1022
1023 -- Cell to fill in empty space and receive the right click menu holder.
1024 create cell
1025 cell.pointer_button_release_actions.extend (agent toolbar_right_click_action)
1026 hbox.extend (cell)
1027
1028 -- Create the vertical layout (separator + toolbar)
1029 create hsep
1030 general_toolbar.set_padding (2)
1031 general_toolbar.extend (hsep)
1032 general_toolbar.disable_item_expand (hsep)
1033 general_toolbar.extend (hbox)
1034
1035 -- Create the command to show/hide this toolbar.
1036 create show_general_toolbar_command.make (general_toolbar, Interface_names.m_general_toolbar)
1037 show_toolbar_commands.extend (show_general_toolbar_command)
1038 if development_window_data.show_general_toolbar then
1039 show_general_toolbar_command.enable_visible
1040 else
1041 show_general_toolbar_command.disable_visible
1042 end
1043
1044 end
1045
1046 build_address_toolbar is
1047 -- Set up the address toolbar (Back, Forward, Current, Class name, feature name, ...)
1048 local
1049 tb: EV_TOOL_BAR
1050 -- address_bar: EV_HORIZONTAL_BOX -- Contains "Class" + Combobox + "Feature" + Combobox + "Format" + Combobox
1051 hsep: EV_HORIZONTAL_SEPARATOR
1052 hbox: EV_HORIZONTAL_BOX -- Contains HistoryToolbar (back, forth, current) + `address_bar'
1053 cell: EV_CELL
1054 accel: EV_ACCELERATOR
1055 do
1056 -- Create the toolbar
1057 create address_toolbar
1058 create hsep
1059 create hbox
1060 -- create address_bar
1061 create tb
1062 address_toolbar.set_padding (2)
1063 address_toolbar.extend (hsep)
1064 address_toolbar.disable_item_expand (hsep)
1065 address_toolbar.extend (hbox)
1066
1067 hbox.extend (tb)
1068 hbox.disable_item_expand (tb)
1069 -- hbox.extend (address_bar)
1070 -- hbox.disable_item_expand (address_bar)
1071
1072 -- Back icon
1073 tb.extend (history_manager.back_command.new_toolbar_item (False))
1074
1075 -- Forward icon
1076 tb.extend (history_manager.forth_command.new_toolbar_item (False))
1077
1078 -- Set up the accelerators.
1079 create accel.make_with_key_combination (
1080 create {EV_KEY}.make_with_code ({EV_KEY_CONSTANTS}.Key_right), False, True, False
1081 )
1082 accel.actions.extend (agent on_forth)
1083 window.accelerators.extend (accel)
1084
1085 create accel.make_with_key_combination (
1086 create {EV_KEY}.make_with_code ({EV_KEY_CONSTANTS}.Key_left), False, True, False
1087 )
1088 accel.actions.extend (agent on_back)
1089 window.accelerators.extend (accel)
1090
1091 ------------------------------------------
1092 -- Address bar (Class name & feature name)
1093 ------------------------------------------
1094 hbox.extend (address_manager.widget)
1095 -- editor_tool.text_area.add_cursor_observer (address_manager)
1096
1097 -- Create the command to show/hide this toolbar.
1098 create show_address_toolbar_command.make (address_toolbar, Interface_names.m_address_toolbar)
1099 show_toolbar_commands.extend (show_address_toolbar_command)
1100
1101 if development_window_data.show_address_toolbar then
1102 show_address_toolbar_command.enable_visible
1103 else
1104 show_address_toolbar_command.disable_visible
1105 end
1106
1107 -- Cell to fill in empty space and receive the right click menu holder.
1108 create cell
1109 cell.pointer_button_release_actions.extend (agent toolbar_right_click_action)
1110 hbox.extend (cell)
1111 end
1112
1113 build_project_toolbar is
1114 -- Build toolbar corresponding to the project options bar
1115 local
1116 cell: EV_CELL
1117 hsep: EV_HORIZONTAL_SEPARATOR
1118 hbox: EV_HORIZONTAL_BOX
1119 do
1120 create project_toolbar
1121 create hsep
1122 project_toolbar.extend (hsep)
1123 project_toolbar.disable_item_expand (hsep)
1124
1125 -- Generate the toolbar.
1126 create hbox
1127 project_customizable_toolbar := Eb_debugger_manager.new_toolbar
1128 hbox.extend (project_customizable_toolbar.widget)
1129 hbox.disable_item_expand (project_customizable_toolbar.widget)
1130
1131 project_customizable_toolbar.update_toolbar
1132
1133 -- Create the command to show/hide this toolbar.
1134 create show_project_toolbar_command.make (project_toolbar, Interface_names.m_project_toolbar)
1135 show_toolbar_commands.extend (show_project_toolbar_command)
1136 if development_window_data.show_project_toolbar then
1137 show_project_toolbar_command.enable_visible
1138 else
1139 show_project_toolbar_command.disable_visible
1140 end
1141
1142 -- Cell to fill in empty space and receive the right click menu holder.
1143 create cell
1144 cell.pointer_button_release_actions.extend (agent toolbar_right_click_action)
1145 hbox.extend (cell)
1146 project_toolbar.extend (hbox)
1147 end
1148
1149 build_refactoring_toolbar is
1150 -- Build refactoring toolbar.
1151 local
1152 cell: EV_CELL
1153 hsep: EV_HORIZONTAL_SEPARATOR
1154 hbox: EV_HORIZONTAL_BOX
1155 do
1156 -- Create the toolbar.
1157 create refactoring_toolbar
1158 refactoring_customizable_toolbar := development_window_data.retrieve_refactoring_toolbar (toolbarable_commands)
1159 if development_window_data.show_text_in_refactoring_toolbar then
1160 refactoring_customizable_toolbar.enable_important_text
1161 elseif development_window_data.show_all_text_in_refactoring_toolbar then
1162 refactoring_customizable_toolbar.enable_text_displayed
1163 end
1164
1165 create hbox
1166 hbox.extend (refactoring_customizable_toolbar.widget)
1167 hbox.disable_item_expand (refactoring_customizable_toolbar.widget)
1168
1169 -- Generate the toolbar.
1170 refactoring_customizable_toolbar.update_toolbar
1171
1172 -- Cell to fill in empty space and receive the right click menu holder.
1173 create cell
1174 cell.pointer_button_release_actions.extend (agent toolbar_right_click_action)
1175 hbox.extend (cell)
1176
1177 -- Create the vertical layout (separator + toolbar)
1178 create hsep
1179 refactoring_toolbar.set_padding (2)
1180 refactoring_toolbar.extend (hsep)
1181 refactoring_toolbar.disable_item_expand (hsep)
1182 refactoring_toolbar.extend (hbox)
1183
1184 -- Create the command to show/hide this toolbar.
1185 create show_refactoring_toolbar_command.make (refactoring_toolbar, Interface_names.m_refactoring_toolbar)
1186 show_toolbar_commands.extend (show_refactoring_toolbar_command)
1187 if development_window_data.show_refactoring_toolbar then
1188 show_refactoring_toolbar_command.enable_visible
1189 else
1190 show_refactoring_toolbar_command.disable_visible
1191 end
1192 end
1193
1194
1195 feature {NONE} -- Menu Building
1196
1197 build_file_menu is
1198 -- Build the file menu.
1199 local
1200 new_project_cmd: EB_NEW_PROJECT_COMMAND
1201 open_project_cmd: EB_OPEN_PROJECT_COMMAND
1202 send_to_menu: EV_MENU
1203 menu_item: EV_MENU_ITEM
1204 command_menu_item: EB_COMMAND_MENU_ITEM
1205 do
1206 create file_menu.make_with_text (Interface_names.m_file)
1207
1208 -- New
1209 command_menu_item := New_development_window_cmd.new_menu_item
1210 add_recyclable (command_menu_item)
1211 file_menu.extend (command_menu_item)
1212
1213 -- New editor
1214 command_menu_item := New_editor_cmd.new_menu_item
1215 add_recyclable (command_menu_item)
1216 file_menu.extend (command_menu_item)
1217
1218 -- New context tool
1219 command_menu_item := New_context_tool_cmd.new_menu_item
1220 add_recyclable (command_menu_item)
1221 file_menu.extend (command_menu_item)
1222
1223 -- Open
1224 command_menu_item := open_cmd.new_menu_item
1225 add_recyclable (command_menu_item)
1226 file_menu.extend (command_menu_item)
1227
1228 -- Close
1229 create menu_item.make_with_text (Interface_names.m_close)
1230 menu_item.select_actions.extend (agent destroy)
1231 file_menu.extend (menu_item)
1232
1233 -- Separator --------------------------------------
1234 file_menu.extend (create {EV_MENU_SEPARATOR})
1235
1236 -- Save
1237 command_menu_item := save_cmd.new_menu_item
1238 add_recyclable (command_menu_item)
1239 file_menu.extend (command_menu_item)
1240
1241 -- Save as
1242 command_menu_item := save_as_cmd.new_menu_item
1243 add_recyclable (command_menu_item)
1244 file_menu.extend (command_menu_item)
1245
1246 -- Sent to
1247 create send_to_menu.make_with_text (Interface_names.m_send_to)
1248 -- External editor
1249 command_menu_item := shell_cmd.new_menu_item
1250 add_recyclable (command_menu_item)
1251 send_to_menu.extend (command_menu_item)
1252 file_menu.extend (send_to_menu)
1253
1254 -- Separator --------------------------------------
1255 file_menu.extend (create {EV_MENU_SEPARATOR})
1256 command_menu_item := print_cmd.new_menu_item
1257 add_recyclable (command_menu_item)
1258 file_menu.extend (command_menu_item)
1259
1260 -- Separator --------------------------------------
1261 file_menu.extend (create {EV_MENU_SEPARATOR})
1262
1263 -- New Project
1264 create new_project_cmd.make_with_parent (window)
1265 create menu_item.make_with_text (Interface_names.m_new_project)
1266 menu_item.select_actions.extend (agent new_project_cmd.execute)
1267 file_menu.extend (menu_item)
1268
1269 -- Open Project
1270 create open_project_cmd.make_with_parent (window)
1271 create menu_item.make_with_text (Interface_names.m_open_project)
1272 menu_item.select_actions.extend (agent open_project_cmd.execute)
1273 file_menu.extend (menu_item)
1274
1275 -- Recent Projects
1276 recent_projects_menu := recent_projects_manager.new_menu
1277 add_recyclable (recent_projects_menu)
1278 file_menu.extend (recent_projects_menu)
1279
1280 -- Separator --------------------------------------
1281 file_menu.extend (create {EV_MENU_SEPARATOR})
1282
1283 -- Exit
1284 command_menu_item := Exit_application_cmd.new_menu_item
1285 add_recyclable (Command_menu_item)
1286 file_menu.extend (command_menu_item)
1287 end
1288
1289 build_class_info_menu: EV_MENU is
1290 -- Build the class format sub-menu.
1291 local
1292 form: EB_CLASS_INFO_FORMATTER
1293 empty_menu: EV_MENU_ITEM
1294 i: INTEGER
1295 do
1296 create Result.make_with_text (Interface_names.m_class_info)
1297 i := 1
1298
1299 create empty_menu.make_with_text (Interface_names.m_formatter_separators @ i)
1300 i := i + 1
1301 empty_menu.disable_sensitive
1302 Result.extend (empty_menu)
1303 from
1304 managed_class_formatters.start
1305 until
1306 managed_class_formatters.after
1307 loop
1308 form := managed_class_formatters.item
1309 if form /= Void then
1310 Result.extend (form.new_menu_item)
1311 else
1312 create empty_menu.make_with_text (Interface_names.m_formatter_separators @ i)
1313 i := i + 1
1314 empty_menu.disable_sensitive
1315 Result.extend (empty_menu)
1316 end
1317 managed_class_formatters.forth
1318 end
1319 end
1320
1321 build_feature_info_menu: EV_MENU is
1322 -- Build the feature format sub-menu.
1323 local
1324 form: EB_FEATURE_INFO_FORMATTER
1325 do
1326 create Result.make_with_text (Interface_names.m_feature_info)
1327 from
1328 managed_feature_formatters.start
1329 until
1330 managed_feature_formatters.after
1331 loop
1332 form := managed_feature_formatters.item
1333 if form /= Void then
1334 Result.extend (form.new_menu_item)
1335 end
1336 managed_feature_formatters.forth
1337 end
1338 end
1339
1340 build_edit_menu is
1341 -- Create and build `edit_menu'
1342 local
1343 command_menu_item: EB_COMMAND_MENU_ITEM
1344 sub_menu: EV_MENU
1345 cmd: EB_EDITOR_COMMAND
1346 os_cmd: EB_ON_SELECTION_COMMAND
1347 editor: EB_SMART_EDITOR
1348 ln_cmd: EB_TOGGLE_LINE_NUMBERS_COMMAND
1349 do
1350 editor := editor_tool.text_area
1351 create command_controller.make
1352
1353 create edit_menu.make_with_text (Interface_names.m_edit)
1354
1355 -- Undo
1356 command_menu_item := undo_cmd.new_menu_item
1357 add_recyclable (command_menu_item)
1358 edit_menu.extend (command_menu_item)
1359
1360 -- Redo
1361 command_menu_item := redo_cmd.new_menu_item
1362 add_recyclable (command_menu_item)
1363 edit_menu.extend (command_menu_item)
1364
1365 -- Separator --------------------------------------
1366 edit_menu.extend (create {EV_MENU_SEPARATOR})
1367
1368 -- Cut
1369 create os_cmd.make (Current)
1370 os_cmd.set_menu_name (Interface_names.M_cut)
1371 os_cmd.set_pixmap (pixmaps.icon_cut)
1372 os_cmd.set_name ("Editor_cut")
1373 os_cmd.set_tooltip (interface_names.f_cut)
1374 os_cmd.add_agent (agent cut_selection)
1375 os_cmd.set_tooltext (Interface_names.b_cut)
1376 toolbarable_commands.extend (os_cmd)
1377 os_cmd.set_needs_editable (True)
1378 command_controller.add_selection_command (os_cmd)
1379 command_menu_item := os_cmd.new_menu_item
1380 add_recyclable (command_menu_item)
1381 edit_menu.extend (command_menu_item)
1382
1383 -- Copy
1384 create os_cmd.make (Current)
1385 os_cmd.set_menu_name (Interface_names.M_copy)
1386 os_cmd.set_pixmap (pixmaps.icon_copy)
1387 os_cmd.set_name ("Editor_copy")
1388 os_cmd.set_tooltip (interface_names.f_copy)
1389 os_cmd.set_tooltext (Interface_names.b_copy)
1390 os_cmd.add_agent (agent copy_selection)
1391 toolbarable_commands.extend (os_cmd)
1392 os_cmd.set_needs_editable (False)
1393 command_controller.add_selection_command (os_cmd)
1394 command_menu_item := os_cmd.new_menu_item
1395 add_recyclable (command_menu_item)
1396 edit_menu.extend (command_menu_item)
1397
1398 -- Paste
1399 command_menu_item := editor_paste_cmd.new_menu_item
1400 add_recyclable (command_menu_item)
1401 edit_menu.extend (command_menu_item)
1402
1403 -- Separator --------------------------------------
1404 edit_menu.extend (create {EV_MENU_SEPARATOR})
1405
1406 -- Select all
1407 create cmd.make
1408 cmd.set_menu_name (Interface_names.m_select_all)
1409 cmd.add_agent (agent select_all)
1410 command_menu_item := cmd.new_menu_item
1411 command_controller.add_edition_command (cmd)
1412 add_recyclable (command_menu_item)
1413 edit_menu.extend (command_menu_item)
1414
1415 -- Separator --------------------------------------
1416 edit_menu.extend (create {EV_MENU_SEPARATOR})
1417
1418 -- Line numbers
1419 create ln_cmd.make
1420 command_menu_item := ln_cmd.new_menu_item
1421 add_recyclable (command_menu_item)
1422 edit_menu.extend (command_menu_item)
1423 window.accelerators.extend (ln_cmd.accelerator)
1424
1425
1426 -- Separator --------------------------------------
1427 edit_menu.extend (create {EV_MENU_SEPARATOR})
1428
1429 -- Search
1430 create cmd.make
1431 cmd.set_menu_name (Interface_names.m_search + "%T" + preferences.editor_data.shortcuts.item ("show_search_panel").display_string)
1432 cmd.add_agent (agent search)
1433 command_menu_item := cmd.new_menu_item
1434 command_controller.add_edition_command (cmd)
1435 add_recyclable (command_menu_item)
1436 edit_menu.extend (command_menu_item)
1437
1438 -- Go to
1439 create cmd.make
1440 cmd.set_menu_name (Interface_names.m_go_to)
1441 cmd.add_agent (agent goto)
1442 cmd.set_needs_editable (True)
1443 command_menu_item := cmd.new_menu_item
1444 command_controller.add_edition_command (cmd)
1445 add_recyclable (command_menu_item)
1446 edit_menu.extend (command_menu_item)
1447
1448 -- Replace
1449 create cmd.make
1450 cmd.set_menu_name (Interface_names.m_replace + "%T" + preferences.editor_data.shortcuts.item ("show_search_and_replace_panel").display_string)
1451 cmd.add_agent (agent editor.replace)
1452 cmd.set_needs_editable (True)
1453 command_menu_item := cmd.new_menu_item
1454 command_controller.add_edition_command (cmd)
1455 add_recyclable (command_menu_item)
1456 edit_menu.extend (command_menu_item)
1457
1458 -- Find sub menu
1459
1460 create sub_menu.make_with_text (Interface_names.m_find)
1461
1462 -- Find next
1463 create cmd.make
1464 cmd.set_menu_name (Interface_names.m_find_next + "%T" + preferences.editor_data.shortcuts.item ("search_last").display_string)
1465 cmd.add_agent (agent find_next)
1466 command_menu_item := cmd.new_menu_item
1467 command_controller.add_edition_command (cmd)
1468 add_recyclable (command_menu_item)
1469 sub_menu.extend (command_menu_item)
1470
1471 -- Find previous
1472 create cmd.make
1473 cmd.set_menu_name (Interface_names.m_find_previous + "%T" + preferences.editor_data.shortcuts.item ("search_backward").display_string)
1474 cmd.add_agent (agent find_previous)
1475 command_menu_item := cmd.new_menu_item
1476 command_controller.add_edition_command (cmd)
1477 add_recyclable (command_menu_item)
1478 sub_menu.extend (command_menu_item)
1479
1480 -- Find selection
1481 create os_cmd.make (Current)
1482 os_cmd.set_menu_name (Interface_names.m_find_selection + "%T" + preferences.editor_data.shortcuts.item ("search_selection").display_string)
1483 os_cmd.add_agent (agent find_selection)
1484 command_menu_item := os_cmd.new_menu_item
1485 command_controller.add_selection_command (os_cmd)
1486 add_recyclable (command_menu_item)
1487 sub_menu.extend (command_menu_item)
1488
1489 edit_menu.extend (sub_menu)
1490
1491
1492 -- Separator --------------------------------------
1493 edit_menu.extend (create {EV_MENU_SEPARATOR})
1494
1495 create sub_menu.make_with_text (Interface_names.m_advanced)
1496
1497 create os_cmd.make (Current)
1498 os_cmd.set_needs_editable (True)
1499 command_controller.add_selection_command (os_cmd)
1500 os_cmd.set_menu_name (Interface_names.m_indent)
1501 os_cmd.add_agent (agent editor.indent_selection)
1502 command_menu_item := os_cmd.new_menu_item
1503 add_recyclable (command_menu_item)
1504 sub_menu.extend (command_menu_item)
1505
1506 create os_cmd.make (Current)
1507 os_cmd.set_needs_editable (True)
1508 command_controller.add_selection_command (os_cmd)
1509 os_cmd.set_menu_name (Interface_names.m_unindent)
1510 os_cmd.add_agent (agent editor.unindent_selection)
1511 command_menu_item := os_cmd.new_menu_item
1512 add_recyclable (command_menu_item)
1513 sub_menu.extend (command_menu_item)
1514
1515 create os_cmd.make (Current)
1516 os_cmd.set_needs_editable (True)
1517 command_controller.add_selection_command (os_cmd)
1518 os_cmd.set_menu_name (Interface_names.m_to_lower)
1519 os_cmd.add_agent (agent editor.set_selection_case (True))
1520 command_menu_item := os_cmd.new_menu_item
1521 add_recyclable (command_menu_item)
1522 sub_menu.extend (command_menu_item)
1523
1524 create os_cmd.make (Current)
1525 os_cmd.set_needs_editable (True)
1526 command_controller.add_selection_command (os_cmd)
1527 os_cmd.set_menu_name (Interface_names.m_to_upper)
1528 os_cmd.add_agent (agent editor.set_selection_case (False))
1529 command_menu_item := os_cmd.new_menu_item
1530 add_recyclable (command_menu_item)
1531 sub_menu.extend (command_menu_item)
1532
1533 create cmd.make
1534 cmd.set_needs_editable (True)
1535 cmd.set_menu_name (Interface_names.m_comment)
1536 cmd.add_agent (agent editor.comment_selection)
1537 command_menu_item := cmd.new_menu_item
1538 command_controller.add_edition_command (cmd)
1539 add_recyclable (command_menu_item)
1540 sub_menu.extend (command_menu_item)
1541
1542 create cmd.make
1543 cmd.set_needs_editable (True)
1544 cmd.set_menu_name (Interface_names.m_uncomment)
1545 cmd.add_agent (agent editor.uncomment_selection)
1546 command_menu_item := cmd.new_menu_item
1547 command_controller.add_edition_command (cmd)
1548 add_recyclable (command_menu_item)
1549 sub_menu.extend (command_menu_item)
1550
1551 -- Separator --------------------------------------
1552 sub_menu.extend (create {EV_MENU_SEPARATOR})
1553
1554 -- Insert if block
1555 create cmd.make
1556 cmd.set_needs_editable (True)
1557 cmd.set_menu_name (Interface_names.m_if_block)
1558 cmd.add_agent (agent editor.embed_in_block("if then", 3))
1559 command_menu_item := cmd.new_menu_item
1560 command_controller.add_edition_command (cmd)
1561 add_recyclable (command_menu_item)
1562 sub_menu.extend (command_menu_item)
1563
1564 -- Insert debug block
1565 create cmd.make
1566 cmd.set_needs_editable (True)
1567 cmd.set_menu_name (Interface_names.m_debug_block)
1568 cmd.add_agent (agent editor.embed_in_block("debug", 5))
1569 command_menu_item := cmd.new_menu_item
1570 command_controller.add_edition_command (cmd)
1571 add_recyclable (command_menu_item)
1572 sub_menu.extend (command_menu_item)
1573
1574
1575 -- Separator --------------------------------------
1576 sub_menu.extend (create {EV_MENU_SEPARATOR})
1577
1578 -- Complete word
1579 create cmd.make
1580 cmd.set_needs_editable (True)
1581 cmd.set_menu_name (Interface_names.m_complete_word + "%T" + preferences.editor_data.shortcuts.item ("autocomplete").display_string)
1582 command_menu_item := cmd.new_menu_item
1583 command_controller.add_edition_command (cmd)
1584 cmd.add_agent (agent editor.complete_feature_name)
1585
1586 add_recyclable (command_menu_item)
1587 sub_menu.extend (command_menu_item)
1588
1589 -- Complete class name
1590 create cmd.make
1591 cmd.set_needs_editable (True)
1592 cmd.set_menu_name (Interface_names.m_complete_class_name + "%T" + preferences.editor_data.shortcuts.item ("class_autocomplete").display_string)
1593 command_menu_item := cmd.new_menu_item
1594 command_controller.add_edition_command (cmd)
1595 cmd.add_agent (agent editor.complete_class_name)
1596
1597 add_recyclable (command_menu_item)
1598 sub_menu.extend (command_menu_item)
1599
1600 sub_menu.extend (create {EV_MENU_SEPARATOR})
1601
1602 -- show/hide formatting marks.
1603 create cmd.make
1604 if editor_tool.text_area.view_invisible_symbols then
1605 cmd.set_menu_name (Interface_names.m_hide_formatting_marks)
1606 else
1607 cmd.set_menu_name (Interface_names.m_show_formatting_marks)
1608 end
1609 formatting_marks_command_menu_item := cmd.new_menu_item
1610 command_controller.add_edition_command (cmd)
1611 cmd.add_agent (agent toggle_formatting_marks)
1612
1613 add_recyclable (formatting_marks_command_menu_item)
1614 sub_menu.extend (formatting_marks_command_menu_item)
1615
1616 edit_menu.extend (sub_menu)
1617 end
1618
1619 build_view_menu is
1620 -- Build the view menu.
1621 local
1622 form: EB_CLASS_INFO_FORMATTER
1623 new_menu_item: EB_COMMAND_MENU_ITEM
1624 new_basic_item: EV_MENU_ITEM
1625 do
1626 Precursor
1627
1628 new_menu_item := toggle_stone_cmd.new_menu_item
1629 view_menu.extend (new_menu_item)
1630 add_recyclable (new_menu_item)
1631
1632 new_menu_item := send_stone_to_context_cmd.new_menu_item
1633 view_menu.extend (new_menu_item)
1634 add_recyclable (new_menu_item)
1635 -- Go to menu
1636 new_basic_item := history_manager.new_menu
1637 view_menu.extend (new_basic_item)
1638
1639 -- Separator --------------------------------------
1640 view_menu.extend (create {EV_MENU_SEPARATOR})
1641 view_menu.extend (build_class_info_menu)
1642 view_menu.extend (build_feature_info_menu)
1643
1644 -- Separator --------------------------------------
1645 view_menu.extend (create {EV_MENU_SEPARATOR})
1646
1647 from
1648 managed_main_formatters.start
1649 until
1650 managed_main_formatters.after
1651 loop
1652 form := managed_main_formatters.item
1653 new_basic_item := form.new_menu_item
1654 new_basic_item.select_actions.put_front (agent form.invalidate)
1655 view_menu.extend (new_basic_item)
1656 --add_recyclable (new_basic_item)
1657 managed_main_formatters.forth
1658 end
1659 end
1660
1661 build_favorites_menu is
1662 -- Build the favorites menu
1663 do
1664 Precursor {EB_TOOL_MANAGER}
1665
1666 create show_favorites_menu_item
1667 update_show_favorites_menu_item
1668 show_favorites_menu_item.select_actions.extend (agent execute_show_favorites)
1669
1670 favorites_menu.start
1671 favorites_menu.put_right (show_favorites_menu_item)
1672 favorites_menu.select_actions.extend (agent update_show_favorites_menu_item)
1673 end
1674
1675 -- Jason Wei modified the following on Aug 31 2005
1676 build_project_menu is
1677 -- Build the project menu.
1678 local
1679 command_menu_item: EB_COMMAND_MENU_ITEM
1680 do
1681 create project_menu.make_with_text (Interface_names.m_project)
1682
1683 -- Melt
1684 command_menu_item := Melt_project_cmd.new_menu_item
1685 add_recyclable (command_menu_item)
1686 project_menu.extend (command_menu_item)
1687
1688 -- Quick melt
1689 command_menu_item := Quick_melt_project_cmd.new_menu_item
1690 add_recyclable (command_menu_item)
1691 project_menu.extend (command_menu_item)
1692
1693 -- Freeze
1694 command_menu_item := Freeze_project_cmd.new_menu_item
1695 add_recyclable (command_menu_item)
1696 project_menu.extend (command_menu_item)
1697
1698 -- Finalize
1699 command_menu_item := Finalize_project_cmd.new_menu_item
1700 add_recyclable (command_menu_item)
1701 project_menu.extend (command_menu_item)
1702
1703 -- Precompile
1704 command_menu_item := precompilation_cmd.new_menu_item
1705 add_recyclable (command_menu_item)
1706 project_menu.extend (command_menu_item)
1707
1708 -- Cancel
1709 command_menu_item := project_cancel_cmd.new_menu_item
1710 add_recyclable (command_menu_item)
1711 project_menu.extend (command_menu_item)
1712
1713 -- Separator -------------------------------------------------
1714 project_menu.extend (create {EV_MENU_SEPARATOR})
1715
1716 -- Compile Workbench C code
1717 command_menu_item := c_workbench_compilation_cmd.new_menu_item
1718 add_recyclable (command_menu_item)
1719 project_menu.extend (command_menu_item)
1720
1721 -- Compile Finalized C code
1722 command_menu_item := c_finalized_compilation_cmd.new_menu_item
1723 add_recyclable (command_menu_item)
1724 project_menu.extend (command_menu_item)
1725
1726 -- Jason Wei
1727 -- Terminate C compilation
1728 command_menu_item := Terminate_c_compilation_cmd.new_menu_item
1729 add_recyclable (command_menu_item)
1730 project_menu.extend (command_menu_item)
1731 -- Jason Wei
1732
1733 -- Execute Finalized code
1734 command_menu_item := run_finalized_cmd.new_menu_item
1735 add_recyclable (command_menu_item)
1736 project_menu.extend (command_menu_item)
1737
1738 -- Separator -------------------------------------------------
1739 project_menu.extend (create {EV_MENU_SEPARATOR})
1740
1741 -- System Tool window
1742 command_menu_item := system_cmd.new_menu_item
1743 add_recyclable (command_menu_item)
1744 project_menu.extend (command_menu_item)
1745
1746 -- System information
1747 command_menu_item := system_info_cmd.new_menu_item
1748 add_recyclable (command_menu_item)
1749 project_menu.extend (command_menu_item)
1750
1751 -- Error information
1752 command_menu_item := display_error_help_cmd.new_menu_item
1753 add_recyclable (command_menu_item)
1754 project_menu.extend (command_menu_item)
1755
1756 if has_documentation_generation or has_xmi_generation then
1757 -- Separator -------------------------------------------------
1758 project_menu.extend (create {EV_MENU_SEPARATOR})
1759 end
1760
1761 if has_documentation_generation then
1762 -- Generate Documentation
1763 command_menu_item := document_cmd.new_menu_item
1764 add_recyclable (command_menu_item)
1765 project_menu.extend (command_menu_item)
1766 end
1767
1768 if has_xmi_generation then
1769 -- Export XMI
1770 command_menu_item := export_cmd.new_menu_item
1771 add_recyclable (command_menu_item)
1772 project_menu.extend (command_menu_item)
1773 end
1774 end
1775
1776 ------- This is the original version
1777 -- build_project_menu is
1778 -- -- Build the project menu.
1779 -- local
1780 -- command_menu_item: EB_COMMAND_MENU_ITEM
1781 -- do
1782 -- create project_menu.make_with_text (Interface_names.m_project)
1783 --
1784 -- -- Melt
1785 -- command_menu_item := Melt_project_cmd.new_menu_item
1786 -- add_recyclable (command_menu_item)
1787 -- project_menu.extend (command_menu_item)
1788 --
1789 -- -- Quick melt
1790 -- command_menu_item := Quick_melt_project_cmd.new_menu_item
1791 -- add_recyclable (command_menu_item)
1792 -- project_menu.extend (command_menu_item)
1793 --
1794 -- -- Freeze
1795 -- command_menu_item := Freeze_project_cmd.new_menu_item
1796 -- add_recyclable (command_menu_item)
1797 -- project_menu.extend (command_menu_item)
1798 --
1799 -- -- Finalize
1800 -- command_menu_item := Finalize_project_cmd.new_menu_item
1801 -- add_recyclable (command_menu_item)
1802 -- project_menu.extend (command_menu_item)
1803 --
1804 -- -- Precompile
1805 -- command_menu_item := precompilation_cmd.new_menu_item
1806 -- add_recyclable (command_menu_item)
1807 -- project_menu.extend (command_menu_item)
1808 --
1809 -- -- Separator -------------------------------------------------
1810 -- project_menu.extend (create {EV_MENU_SEPARATOR})
1811 --
1812 -- -- Compile Workbench C code
1813 -- command_menu_item := c_workbench_compilation_cmd.new_menu_item
1814 -- add_recyclable (command_menu_item)
1815 -- project_menu.extend (command_menu_item)
1816 --
1817 -- -- Compile Finalized C code
1818 -- command_menu_item := c_finalized_compilation_cmd.new_menu_item
1819 -- add_recyclable (command_menu_item)
1820 -- project_menu.extend (command_menu_item)
1821 --
1822 -- -- Execute Finalized code
1823 -- command_menu_item := run_finalized_cmd.new_menu_item
1824 -- add_recyclable (command_menu_item)
1825 -- project_menu.extend (command_menu_item)
1826 --
1827 -- -- Separator -------------------------------------------------
1828 -- project_menu.extend (create {EV_MENU_SEPARATOR})
1829 --
1830 -- -- System Tool window
1831 -- command_menu_item := system_cmd.new_menu_item
1832 -- add_recyclable (command_menu_item)
1833 -- project_menu.extend (command_menu_item)
1834 --
1835 -- -- System information
1836 -- command_menu_item := system_info_cmd.new_menu_item
1837 -- add_recyclable (command_menu_item)
1838 -- project_menu.extend (command_menu_item)
1839 --
1840 -- -- Error information
1841 -- command_menu_item := display_error_help_cmd.new_menu_item
1842 -- add_recyclable (command_menu_item)
1843 -- project_menu.extend (command_menu_item)
1844 --
1845 -- if has_documentation_generation or has_xmi_generation then
1846 -- -- Separator -------------------------------------------------
1847 -- project_menu.extend (create {EV_MENU_SEPARATOR})
1848 -- end
1849 --
1850 -- if has_documentation_generation then
1851 -- -- Generate Documentation
1852 -- command_menu_item := document_cmd.new_menu_item
1853 -- add_recyclable (command_menu_item)
1854 -- project_menu.extend (command_menu_item)
1855 -- end
1856 --
1857 -- if has_xmi_generation then
1858 -- -- Export XMI
1859 -- command_menu_item := export_cmd.new_menu_item
1860 -- add_recyclable (command_menu_item)
1861 -- project_menu.extend (command_menu_item)
1862 -- end
1863 -- end
1864 -- Jason Wei modified the above on Aug 31 2005
1865
1866 build_tools_menu is
1867 -- Create and build `tools_menu'
1868 local
1869 command_menu_item: EB_COMMAND_MENU_ITEM
1870 menu_item: EV_MENU_ITEM
1871 do
1872 create tools_menu.make_with_text (Interface_names.m_tools)
1873
1874 -- New Cluster command.
1875 command_menu_item := new_cluster_cmd.new_menu_item
1876 add_recyclable (command_menu_item)
1877 tools_menu.extend (command_menu_item)
1878
1879 -- New Class command.
1880 command_menu_item := new_class_cmd.new_menu_item
1881 add_recyclable (command_menu_item)
1882 tools_menu.extend (command_menu_item)
1883
1884 -- New Feature command.
1885 command_menu_item := new_feature_cmd.new_menu_item
1886 add_recyclable (command_menu_item)
1887 tools_menu.extend (command_menu_item)
1888
1889 -- Delete class/cluster command.
1890 command_menu_item := delete_class_cluster_cmd.new_menu_item
1891 add_recyclable (command_menu_item)
1892 tools_menu.extend (command_menu_item)
1893
1894 -- Separator --------------------------------------
1895 tools_menu.extend (create {EV_MENU_SEPARATOR})
1896
1897
1898 if has_metrics then
1899 -- Metric tool
1900 create metric_menu.make_with_text (interface_names.metric_metrics)
1901 create menu_item.make_with_text (interface_names.metric_calculate)
1902 metric_menu.extend (menu_item)
1903 create menu_item.make_with_text (interface_names.metric_add)
1904 metric_menu.extend (menu_item)
1905 create menu_item.make_with_text (interface_names.metric_delete)
1906 metric_menu.extend (menu_item)
1907 create menu_item.make_with_text (interface_names.metric_details)
1908 metric_menu.extend (menu_item)
1909 create menu_item.make_with_text (interface_names.metric_new_metrics)
1910 metric_menu.extend (menu_item)
1911 create menu_item.make_with_text (interface_names.metric_management)
1912 metric_menu.extend (menu_item)
1913 create menu_item.make_with_text (interface_names.metric_archive)
1914 metric_menu.extend (menu_item)
1915 metric_menu.disable_sensitive
1916 tools_menu.extend (metric_menu)
1917 end
1918
1919 if has_profiler then
1920 -- Profiler Window
1921 command_menu_item := show_profiler.new_menu_item
1922 add_recyclable (command_menu_item)
1923 tools_menu.extend (command_menu_item)
1924 end
1925
1926 -- Precompile Wizard
1927 command_menu_item := wizard_precompile_cmd.new_menu_item
1928 add_recyclable (command_menu_item)
1929 tools_menu.extend (command_menu_item)
1930
1931 if has_dll_generation then
1932 -- Dynamic Library Window
1933 command_menu_item := show_dynamic_lib_tool.new_menu_item
1934 add_recyclable (command_menu_item)
1935 tools_menu.extend (command_menu_item)
1936 end
1937
1938 -- Separator -------------------------------------------------
1939 tools_menu.extend (create {EV_MENU_SEPARATOR})
1940
1941 -- Preferences
1942 command_menu_item := Show_preferences_cmd.new_menu_item
1943 add_recyclable (command_menu_item)
1944 tools_menu.extend (command_menu_item)
1945
1946 -- External commands editor
1947 command_menu_item := Edit_external_commands_cmd.new_menu_item
1948 add_recyclable (command_menu_item)
1949 tools_menu.extend (command_menu_item)
1950
1951 rebuild_tools_menu
1952 end
1953
1954 feature -- Stone process
1955
1956 stone: STONE
1957 -- Current stone
1958
1959 toggle_unified_stone is
1960 -- Change the stone management mode.
1961 do
1962 unified_stone := not unified_stone
1963 if unified_stone then
1964 send_stone_to_context
1965 send_stone_to_context_cmd.disable_sensitive
1966 context_tool.link_to_development_window
1967 else
1968 if stone /= Void then
1969 send_stone_to_context_cmd.enable_sensitive
1970 end
1971 context_tool.cut_from_development_window
1972 end
1973 end
1974
1975 set_stone (a_stone: STONE) is
1976 -- Change the currently focused stone.
1977 local
1978 cd: STANDARD_DISCARDABLE_CONFIRMATION_DIALOG
1979 cv_cst: CLASSI_STONE
1980 ef_stone: EXTERNAL_FILE_STONE
1981 l: LIST [EB_DEVELOPMENT_WINDOW]
1982 l_filename: STRING
1983 do
1984 cv_cst ?= a_stone
1985 if cv_cst /= Void then
1986 l_filename := cv_cst.class_i.name
1987 else
1988 ef_stone ?= a_stone
1989 if ef_stone /= Void then
1990 l_filename := ef_stone.file_name.string
1991 end
1992 end
1993
1994 if cv_cst /= Void or ef_stone /= Void then
1995 l := Window_manager.development_windows_with_class (l_filename)
1996 if l.is_empty or else l.has (Current) then
1997 -- We're not editing the class in another window.
1998 set_stone_after_first_check (a_stone)
1999 else
2000 create cd.make_initialized (2,
2001 preferences.dialog_data.already_editing_class_string,
2002 warning_messages.w_class_already_edited,
2003 Interface_names.l_do_not_show_again,
2004 preferences.preferences)
2005 cd.set_ok_action (agent set_stone_after_first_check (a_stone))
2006 cd.show_modal_to_window (window)
2007 end
2008 else
2009 set_stone_after_first_check (a_stone)
2010 end
2011 end
2012
2013 set_stone_after_first_check (a_stone: STONE) is
2014 -- Display text associated with `a_stone', if any and if possible
2015 local
2016 feature_stone: FEATURE_STONE
2017 old_class_stone: CLASSI_STONE
2018 test_stone: CLASSI_STONE
2019 same_class: BOOLEAN
2020 conv_ferrst: FEATURE_ERROR_STONE
2021 ef_stone: EXTERNAL_FILE_STONE
2022 cluster_st: CLUSTER_STONE
2023 new_class_stone: CLASSI_STONE
2024 conv_ace: ACE_SYNTAX_STONE
2025 conv_errst: ERROR_STONE
2026 conv_brkstone: BREAKABLE_STONE
2027 do
2028 old_class_stone ?= stone
2029 feature_stone ?= a_stone
2030 ef_stone ?= a_stone
2031 new_class_stone ?= a_stone
2032 cluster_st ?= a_stone
2033
2034 -- Update the history.
2035 conv_brkstone ?= a_stone
2036 conv_errst ?= a_stone
2037 conv_ace ?= a_stone
2038 if
2039 conv_brkstone = Void and
2040 conv_errst = Void and
2041 conv_ace = Void and
2042 ef_stone = Void
2043 then
2044 if
2045 new_class_stone /= Void
2046 then
2047 history_manager.extend (new_class_stone)
2048 elseif
2049 cluster_st /= Void
2050 then
2051 history_manager.extend (cluster_st)
2052 end
2053 end
2054
2055 if old_class_stone /= Void then
2056 create test_stone.make (old_class_stone.class_i)
2057 same_class := test_stone.same_as (a_stone)
2058 -- We need to compare classes. If `old_class_stone' is a FEATURE_STONE
2059 -- `same_as' will compare features. Therefore, we need `test_stone' to be sure
2060 -- we have a CLASSI_STONE.
2061 if same_class and then feature_stone /= Void then
2062 same_class := False
2063 -- if the stone corresponding to a feature of currently opened class is dropped
2064 -- we attempt to scroll to the feature without asking to save the file
2065 -- except if it is during a resynchronization, in which case we do not scroll at all.
2066 if editor_tool.text_area.text_is_fully_loaded then
2067 if not during_synchronization then
2068 scroll_to_feature (feature_stone.e_feature, new_class_stone.class_i)
2069 feature_stone_already_processed := True
2070 else
2071 feature_stone_already_processed := True
2072 end
2073 conv_ferrst ?= feature_stone
2074 if feature_stone_already_processed and conv_ferrst /= Void then
2075 -- Scroll to the line of the error.
2076 if not during_synchronization then
2077 editor_tool.text_area.display_line_when_ready (conv_ferrst.line_number, True)
2078 end
2079 end
2080 end
2081 end
2082 elseif ef_stone /= Void then
2083 end
2084
2085 -- first, let's check if there is already something in this window
2086 -- if there's nothing, there's no need to save anything...
2087 if stone = Void or else not changed or else feature_stone_already_processed or else same_class then
2088 set_stone_after_check (a_stone)
2089 feature_stone_already_processed := False
2090 else
2091 -- there is something to be saved
2092 -- if user chooses to save, current file will be parsed
2093 -- if there is a syntax_error, new file is not loaded
2094 save_and (agent set_stone_after_check (a_stone))
2095 if text_saved and then not syntax_is_correct then
2096 text_saved := False
2097 during_synchronization := True
2098 set_stone_after_check (stone)
2099 during_synchronization := False
2100 address_manager.refresh
2101 end
2102 end
2103 if not editor_tool.text_area.has_focus then
2104 ev_application.idle_actions.extend_kamikaze (agent editor_tool.set_focus)
2105 end
2106 end
2107
2108 force_stone (s: STONE) is
2109 -- make `s' the new value of `stone', and
2110 -- change the display accordingly. Try to
2111 -- extract a class from `s' whenever possible.
2112 do
2113 if s.is_storable then
2114 set_stone (s)
2115 if not unified_stone then
2116 context_tool.advanced_set_stone (s)
2117 end
2118 end
2119 end
2120
2121 process_class (s: CLASSI_STONE) is
2122 -- Process class stone
2123 do
2124 set_stone (s)
2125 end
2126
2127 process_feature_error (s: FEATURE_ERROR_STONE) is
2128 -- Process feature error stone.
2129 local
2130 cl_stone: CLASSC_STONE
2131 e_class: CLASS_C
2132 do
2133 set_default_format
2134 e_class := s.e_feature.written_class
2135 create cl_stone.make (e_class)
2136 set_stone (cl_stone)
2137 editor_tool.text_area.deselect_all
2138 if s.line_number > 0 then
2139 editor_tool.text_area.highlight_selected (s.line_number, s.line_number)
2140 end
2141 end
2142
2143
2144 process_class_syntax (s: CL_SYNTAX_STONE) is
2145 -- Process class syntax.
2146 local
2147 cl_stone: CLASSC_STONE
2148 do
2149 -- call set_stone to ensure the proper class is displayed
2150 create cl_stone.make (s.e_class)
2151 set_stone (cl_stone)
2152 editor_tool.text_area.deselect_all
2153 editor_tool.text_area.highlight_when_ready (s.line, s.line)
2154 end
2155
2156 refresh is
2157 -- Synchronize clickable elements with text, if possible.
2158 do
2159 --| FIXME ARNAUD
2160 -- synchronise_stone
2161 --| END FIXME
2162 --| FIXME XR: Refresh current display in the editor.
2163 editor_tool.text_area.update_click_list (False)
2164 update_save_symbol
2165 address_manager.refresh
2166 -- The cluster manager should already be refreshed by the window manager.
2167 -- cluster_manager.refresh
2168 -- context_tool.refresh
2169 end
2170
2171 quick_refresh_editors is
2172 -- Redraw editors' drawing area.
2173 do
2174 editor_tool.text_area.refresh
2175 context_tool.quick_refresh_editors
2176 end
2177
2178 quick_refresh_margins is
2179 -- Redraw the main editor's drawing area.
2180 do
2181 editor_tool.text_area.margin.refresh
2182 context_tool.quick_refresh_margins
2183 end
2184
2185 set_default_format is
2186 -- Default format of windows.
2187 --| FIXME ARNAUD: To be implemented.
2188 -- local
2189 -- f: EB_FORMATTER
2190 do
2191 -- if stone /= Void then
2192 -- if stone.class_i.hide_implementation then
2193 -- f := format_list.precompiled_default_format
2194 -- else
2195 -- f := format_list.default_format
2196 -- end
2197 -- else
2198 -- f := format_list.default_format
2199 -- end
2200 -- set_last_format (f)
2201 --| END FIXME
2202 end
2203
2204 feature -- Position provider
2205
2206 position: like position_internal is
2207 -- Currently shown text position in the editor
2208 do
2209 Result := editor_tool.text_area.first_line_displayed
2210 end
2211
2212 pos_container: like pos_container_internal is
2213 -- Current selected formatter
2214 local
2215 l_end : BOOLEAN
2216 do
2217 from
2218 managed_main_formatters.start
2219 until
2220 managed_main_formatters.after or l_end
2221 loop
2222 if managed_main_formatters.item.selected then
2223 l_end := true
2224 Result := managed_main_formatters.item
2225 end
2226 managed_main_formatters.forth
2227 end
2228 end
2229
2230 feature -- Resource Update
2231
2232 update is
2233 -- Update Current with the registered resources.
2234 do
2235 lock_update
2236 -- Show/hide general toolbar
2237 if development_window_data.show_general_toolbar then
2238 show_general_toolbar_command.enable_visible
2239 else
2240 show_general_toolbar_command.disable_visible
2241 end
2242
2243 -- Show/hide address toolbar
2244 if development_window_data.show_address_toolbar then
2245 show_address_toolbar_command.enable_visible
2246 else
2247 show_address_toolbar_command.disable_visible
2248 end
2249
2250 -- Show/hide project toolbar
2251 if development_window_data.show_project_toolbar then
2252 show_project_toolbar_command.enable_visible
2253 else
2254 show_project_toolbar_command.disable_visible
2255 end
2256
2257 -- Show/hide refactoring toolbar
2258 if development_window_data.show_refactoring_toolbar then
2259 show_refactoring_toolbar_command.enable_visible
2260 else
2261 show_refactoring_toolbar_command.disable_visible
2262 end
2263
2264 left_panel.load_from_resource (development_window_data.left_panel_layout)
2265 right_panel.load_from_resource (development_window_data.right_panel_layout)
2266 splitter_position := development_window_data.left_panel_width
2267 update_splitters
2268 unlock_update
2269 end
2270
2271 update_splitters is
2272 -- Refresh the position of the splitter on screen according to
2273 -- our internal values.
2274 do
2275 -- Set the interior layout
2276 if panel.full then
2277 panel.set_split_position (splitter_position.max (panel.minimum_split_position))
2278 end
2279 end
2280
2281 register is
2282 -- Register to preferences we want notification of.
2283 do
2284 end
2285
2286 unregister is
2287 -- unregister to preferences we want notification of.
2288 do
2289 end
2290
2291 reset is
2292 -- Reset the window contents
2293 do
2294 Precursor
2295 address_manager.reset
2296
2297 --| FIXME ARNAUD, multiformat not yet implemented.
2298 -- format_list.enable_imp_formats_sensitive
2299 --| END FIXME
2300 end
2301
2302 rebuild_tools_menu is
2303 -- Refresh the list of external commands.
2304 local
2305 ms: LIST [EB_COMMAND_MENU_ITEM]
2306 l_sep: EV_MENU_SEPARATOR
2307 do
2308 -- Remove all the external commands, which are at the end of the menu.
2309 from
2310 tools_menu.go_i_th (tools_menu.count + 1 - number_of_displayed_external_commands)
2311 until
2312 tools_menu.after
2313 loop
2314 tools_menu.remove
2315 end
2316 ms := Edit_external_commands_cmd.menus
2317 number_of_displayed_external_commands := ms.count
2318
2319 if not ms.is_empty and not tools_menu.is_empty then
2320 l_sep ?= tools_menu.last
2321 if l_sep = Void then
2322 create l_sep
2323 tools_menu.extend (l_sep)
2324 number_of_displayed_external_commands := number_of_displayed_external_commands + 1
2325 end
2326 end
2327
2328 from
2329 ms.start
2330 until
2331 ms.after
2332 loop
2333 tools_menu.extend (ms.item)
2334 add_recyclable (ms.item)
2335 ms.forth
2336 end
2337 end
2338
2339 syntax_is_correct: BOOLEAN is
2340 -- file was successfully parsed.
2341 do
2342 Result := editor_tool.text_area.syntax_is_correct
2343 end
2344
2345 on_project_created is
2346 -- Inform tools that the current project has been loaded or re-loaded.
2347 do
2348 build_menu_bar
2349 enable_commands_on_project_created
2350 context_tool.on_project_created
2351 address_manager.on_project_created
2352 if has_dll_generation then
2353 show_dynamic_lib_tool.enable_sensitive
2354 end
2355 if has_profiler then
2356 show_profiler.enable_sensitive
2357 end
2358 end
2359
2360 on_project_loaded is
2361 -- Inform tools that the current project has been loaded or re-loaded.
2362 do
2363 -- cluster_manager.on_project_loaded
2364 enable_commands_on_project_loaded
2365 cluster_tool.on_project_loaded
2366 context_tool.on_project_loaded
2367 breakpoints_tool.on_project_loaded
2368 end
2369
2370 on_project_unloaded is
2371 -- Inform tools that the current project will soon been unloaded.
2372 do
2373 -- cluster_manager.on_project_unloaded
2374 disable_commands_on_project_unloaded
2375 cluster_tool.on_project_unloaded
2376 context_tool.on_project_unloaded
2377 address_manager.on_project_unloaded
2378 build_menu_bar
2379 if has_dll_generation then
2380 show_dynamic_lib_tool.disable_sensitive
2381 end
2382 if has_profiler then
2383 show_profiler.disable_sensitive
2384 end
2385 end
2386
2387 on_c_compilation_starts is
2388 -- Enable commands when freezing or finalizing starts.
2389 do
2390 c_workbench_compilation_cmd.disable_sensitive
2391 c_finalized_compilation_cmd.disable_sensitive
2392 end
2393
2394 on_c_compilation_stops is
2395 -- Disable commands when freezing or finalizing stops.
2396 do
2397 c_workbench_compilation_cmd.enable_sensitive
2398 c_finalized_compilation_cmd.enable_sensitive
2399 end
2400
2401 save_before_compiling is
2402 -- save the text but do not update clickable positions
2403 do
2404 save_only := True
2405 save_text
2406 end
2407
2408 perform_check_before_save is
2409 -- Perform any pre-save operations/checks
2410 local
2411 dial: EV_CONFIRMATION_DIALOG
2412 do
2413 -- Remove trailing blanks.
2414 if preferences.editor_data.auto_remove_trailing_blank_when_saving then
2415 editor_tool.text_area.text_displayed.remove_trailing_blanks
2416 else
2417 editor_tool.text_area.text_displayed.remove_trailing_fake_blanks
2418 end
2419 editor_tool.text_area.refresh_now
2420
2421 if editor_tool.text_area.open_backup then
2422 create dial.make_with_text(Warning_messages.w_save_backup)
2423 dial.set_buttons_and_actions(<<"Continue", "Cancel">>, <<agent continue_save, agent cancel_save>>)
2424 dial.set_default_push_button(dial.button("Continue"))
2425 dial.set_default_cancel_button(dial.button("Cancel"))
2426 dial.set_title ("Save Backup")
2427 dial.show_modal_to_window (window)
2428 else
2429 check_passed := True
2430 end
2431 end
2432
2433 continue_save is
2434 -- continue saving
2435 do
2436 check_passed := True
2437 end
2438
2439 cancel_save is
2440 -- cancel saving
2441 do
2442 check_passed := False
2443 end
2444
2445 process is
2446 -- process the user entry in the address bar
2447 local
2448 l_class_stone: CLASSI_STONE
2449 l_multi_search_tool: EB_MULTI_SEARCH_TOOL
2450 do
2451 save_canceled := False
2452 l_class_stone ?= stone
2453 if l_class_stone /= Void then
2454 l_multi_search_tool ?= search_tool
2455 if l_multi_search_tool /= Void then
2456 l_multi_search_tool.class_changed (l_class_stone.class_i)
2457 end
2458 end
2459 end
2460
2461 on_text_saved is
2462 -- Notify the editor that the text has been saved
2463 local
2464 str: STRING
2465 do
2466 Precursor
2467 editor_tool.on_text_saved
2468 text_saved := True
2469 if not save_only then
2470 editor_tool.text_area.update_click_list (True)
2471 end
2472 save_only := False
2473 str := title.twin
2474 if str @ 1 = '*' then
2475 str.keep_tail (str.count - 2)
2476 set_title (str)
2477 end
2478 update_formatters
2479 if editor_tool.text_area.syntax_is_correct then
2480 status_bar.display_message ("")
2481 else
2482 status_bar.display_message (Interface_names.L_syntax_error)
2483 end
2484 text_edited := False
2485 end
2486
2487 on_focus is
2488 -- Focus gained
2489 local
2490 editor: TEXT_PANEL
2491 do
2492 editor ?= editor_tool.text_area
2493 if editor /= Void then
2494 editor.on_focus
2495 end
2496 end
2497
2498 save_and (an_action: PROCEDURE [ANY, TUPLE]) is
2499 local
2500 save_dialog: EB_CONFIRM_SAVE_DIALOG
2501 do
2502 save_canceled := True
2503 text_saved := False
2504 create save_dialog.make_and_launch (Current,Current)
2505 if not save_canceled and then syntax_is_correct then
2506 an_action.call(Void)
2507 end
2508 end
2509
2510 feature -- Window management
2511
2512 show_window is
2513 -- Show the window
2514 do
2515 show
2516 end
2517
2518 raise_window is
2519 -- Show the window and set the focus to it.
2520 do
2521 show
2522 --| FIXME, set the focus.
2523 end
2524
2525 hide_window is
2526 -- Hide the window
2527 do
2528 hide
2529 end
2530
2531 destroy_window is
2532 -- Destroy the window.
2533 do
2534 destroy
2535 end
2536
2537 give_focus is
2538 -- Give the focus to the address manager.
2539 do
2540 address_manager.set_focus
2541 end
2542
2543 save_layout is
2544 -- Store layout of `current'.
2545 do
2546 save_layout_to_window_data (development_window_data)
2547 -- Commit saves
2548 preferences.preferences.save_preferences
2549 end
2550
2551 save_layout_to_session (a_session: ES_SESSION) is
2552 -- Save session data of `Current' to session object `a_session'.
2553 local
2554 a_window_data: EB_DEVELOPMENT_WINDOW_SESSION_DATA
2555 a_class_i: CLASSI_STONE
2556 do
2557 create a_window_data.make_from_window_data (preferences.development_window_data)
2558
2559 a_class_i ?= stone
2560 if a_class_i /= Void then
2561 a_window_data.save_filename (a_class_i.file_name)
2562 a_window_data.save_editor_position (editor_tool.text_area.current_cursor_position)
2563 end
2564
2565 if context_tool /= Void then
2566 a_window_data.save_context_data (
2567 context_tool.address_manager.cluster_label_text,
2568 context_tool.address_manager.class_label_text,
2569 context_tool.address_manager.feature_label_text,
2570 context_tool.notebook.selected_item_index
2571 )
2572 end
2573
2574 save_layout_to_window_data (a_window_data)
2575
2576 -- Add the session data of `Current' to the session object.
2577 a_session.window_session_data.extend (a_window_data)
2578 end
2579
2580 save_layout_to_window_data (a_window_data: EB_DEVELOPMENT_WINDOW_DATA) is
2581 -- Store window data of `Current' in `a_window_data'.
2582 require
2583 a_window_data_not_void: a_window_data /= Void
2584 do
2585 -- Now save the windows's layout, but only if the
2586 -- debugger is not displayed in `Current'. By saving the layout,
2587 -- we ensure that future windows may use exactly the same layout.
2588 -- If the debugger is displayed, the previous layout is already saved,
2589 -- and this is the one that must be used, as only one debugger is ever displayed.
2590 if
2591 (Eb_debugger_manager.application_is_executing and Eb_debugger_manager.debugging_window /= Current)
2592 or not Eb_debugger_manager.application_is_executing
2593 then
2594 a_window_data.save_left_panel_layout (left_panel.save_to_resource)
2595 a_window_data.save_right_panel_layout (right_panel.save_to_resource)
2596 a_window_data.save_left_panel_width (panel.split_position)
2597 -- Save width & height.
2598 a_window_data.save_size (window.width, window.height)
2599 a_window_data.save_window_state (window.is_minimized, window.is_maximized)
2600 a_window_data.save_position (window.x_position, window.y_position)
2601 end
2602 a_window_data.save_show_search_options (search_tool.options_shown)
2603 end
2604
2605
2606 feature -- Tools & Controls
2607
2608 editor_tool: EB_EDITOR_TOOL
2609
2610 favorites_tool: EB_FAVORITES_TOOL
2611
2612 cluster_tool: EB_CLUSTER_TOOL
2613
2614 search_tool: EB_MULTI_SEARCH_TOOL
2615
2616 features_tool: EB_FEATURES_TOOL
2617
2618 breakpoints_tool: ES_BREAKPOINTS_TOOL
2619
2620 windows_tool: EB_WINDOWS_TOOL
2621
2622 context_tool: EB_CONTEXT_TOOL
2623 -- Context explorer for current class and system.
2624
2625 address_manager: EB_ADDRESS_MANAGER
2626 -- Text field in the toolbar
2627 -- Allow user to enter the name
2628 -- of the class he wants to edit.
2629
2630 project_manager: EB_PROJECT_MANAGER is
2631 -- Project manager associated to the project the user is working on.
2632 do
2633 Result := Eiffel_project.manager
2634 end
2635
2636 managed_class_formatters: ARRAYED_LIST [EB_CLASS_INFO_FORMATTER]
2637 -- All formatters that operate on a class.
2638
2639 managed_feature_formatters: ARRAYED_LIST [EB_FEATURE_INFO_FORMATTER]
2640 -- All formatters that operate on a class.
2641
2642 managed_main_formatters: ARRAYED_LIST [EB_CLASS_TEXT_FORMATTER]
2643 -- All formatters that can be displayed in the main editor frame.
2644
2645 unified_stone: BOOLEAN
2646 -- Is the stone common with the context tool or not?
2647
2648 arguments_dialog: EB_ARGUMENT_DIALOG
2649 -- The arguments dialog for current, if any
2650
2651 goto_dialog: EB_GOTO_DIALOG
2652 -- The goto dialog for line number access
2653
2654 feature -- Multiple editor management
2655
2656 add_editor_to_list (an_editor: EB_EDITOR) is
2657 -- adds `an_editor' to `editors'
2658 do
2659 editors.extend (an_editor)
2660 end
2661
2662 current_editor: EB_EDITOR is
2663 -- current editor, if none, main editor
2664 do
2665 if current_editor_index /= 0 then
2666 Result := editors @ current_editor_index
2667 else
2668 Result := editors.first
2669 end
2670 end
2671
2672 set_current_editor (an_editor: EB_EDITOR) is
2673 -- set `an_editor' as main editor
2674 local
2675 old_index: INTEGER
2676 new_index: INTEGER
2677 do
2678 old_index := current_editor_index
2679 new_index := editors.index_of (an_editor, 1)
2680 if
2681 editors.valid_index (new_index) and
2682 old_index /= new_index
2683 then
2684 current_editor_index := new_index
2685 update_paste_cmd
2686 -- Last thing, update the menu entry for the formatting marks.
2687 if current_editor.view_invisible_symbols then
2688 formatting_marks_command_menu_item.set_text (Interface_names.m_hide_formatting_marks)
2689 else
2690 formatting_marks_command_menu_item.set_text(Interface_names.m_show_formatting_marks)
2691 end
2692 command_controller.set_current_editor (an_editor)
2693 end
2694 end
2695
2696 update_paste_cmd is
2697 -- Update `editor_paste_cmd'. To be performed when an editor grabs the focus.
2698 do
2699 if
2700 not current_editor.is_empty and then
2701 current_editor.is_editable and then
2702 current_editor.clipboard.has_text
2703 then
2704 editor_paste_cmd.enable_sensitive
2705 else
2706 editor_paste_cmd.disable_sensitive
2707 end
2708 end
2709
2710 feature {NONE} -- Multiple editor management
2711
2712 editors: ARRAYED_LIST [EB_EDITOR]
2713 -- editor contained in `Current'
2714
2715 current_editor_index: INTEGER
2716 -- Index in `editors' of the editor that has the focus.
2717
2718 feature {EB_FEATURES_TOOL, EB_FEATURES_TREE, DOTNET_CLASS_AS, DOTNET_CLASS_CONTEXT} -- Feature Clauses
2719
2720 set_feature_clauses (a_features: ARRAYED_LIST [DOTNET_FEATURE_CLAUSE_AS [CONSUMED_ENTITY]]; a_type: STRING) is
2721 -- Set 'features' to 'a_features' and store in hash table with key 'a_type' denoting name of consumed
2722 -- type pertinent to 'a_features'.
2723 require
2724 a_features_not_void: a_features /= Void
2725 do
2726 if feature_clauses = Void then
2727 create feature_clauses.make (5)
2728 end
2729 feature_clauses.put (a_features, a_type)
2730 end
2731
2732 set_feature_locating (a_locating: BOOLEAN) is
2733 -- Set `feature_locating' with `a_locating'.
2734 do
2735 feature_locating := a_locating
2736 end
2737
2738 get_feature_clauses (a_type: STRING): ARRAYED_LIST [DOTNET_FEATURE_CLAUSE_AS [CONSUMED_ENTITY]] is
2739 -- Get list of feature clauses relevant to .NET type with name 'a_type'.
2740 require
2741 a_type_not_void: a_type /= Void
2742 has_type_clauses: feature_clauses.has (a_type)
2743 do
2744 Result := feature_clauses.item (a_type)
2745 ensure
2746 result_not_void: Result /= Void
2747 end
2748
2749 feature_clauses: HASH_TABLE [ARRAYED_LIST [DOTNET_FEATURE_CLAUSE_AS [CONSUMED_ENTITY]], STRING]
2750 -- List of features clauses for Current window hashed by the .NET name of the consumed_type.
2751
2752 feature_positions: HASH_TABLE [INTEGER, E_FEATURE]
2753 -- Features indexed by line position in class text (for .NET features).
2754
2755 feature_locating: BOOLEAN
2756 -- Is feature tool locating a feature?
2757
2758 feature {EB_WINDOW_MANAGER} -- Window management / Implementation
2759
2760 destroy_imp is
2761 -- Destroy window.
2762 do
2763 -- To avoid reentrance
2764 if not is_destroying then
2765 is_destroying := True
2766 -- If a launched application is still running, kill it.
2767 if
2768 Eb_debugger_manager.application_is_executing
2769 and then Eb_debugger_manager.debugging_window = Current
2770 then
2771 Eb_debugger_manager.Application.kill
2772 else
2773 development_window_data.save_left_panel_layout (left_panel.save_to_resource)
2774 development_window_data.save_right_panel_layout (right_panel.save_to_resource)
2775 end
2776 development_window_data.save_left_panel_width (panel.split_position)
2777 -- Save width & height.
2778 development_window_data.save_size (window.width, window.height)
2779 development_window_data.save_window_state (window.is_minimized, window.is_maximized)
2780 development_window_data.save_position (window.x_position, window.y_position)
2781 left_panel.wipe_out
2782 right_panel.wipe_out
2783 development_window_data.save_show_search_options (search_tool.options_shown)
2784 hide
2785
2786 -- Commit saves
2787 preferences.preferences.save_preferences
2788
2789 toolbars_area.wipe_out
2790 address_manager.recycle
2791 project_customizable_toolbar.recycle
2792 refactoring_customizable_toolbar.recycle
2793 Precursor {EB_TOOL_MANAGER}
2794
2795 managed_class_formatters.wipe_out
2796 managed_feature_formatters.wipe_out
2797 managed_main_formatters.wipe_out
2798 toolbarable_commands.wipe_out
2799 editors.wipe_out
2800 stone := Void
2801 end
2802 end
2803
2804 feature -- C output pixmap management
2805
2806 start_c_output_pixmap_timer is
2807 -- Start timer to draw c output pixmap.
2808 do
2809 if context_tool /= Void then
2810 context_tool.start_c_output_pixmap_timer
2811 end
2812 end
2813
2814 stop_c_output_pixmap_timer is
2815 -- Stop timer to draw c output pixmap.
2816 do
2817 if context_tool /= Void then
2818 context_tool.stop_c_output_pixmap_timer
2819 end
2820 end
2821
2822 feature {NONE} -- Implementation
2823
2824 set_stone_after_check (a_stone: STONE) is
2825 local
2826 old_stone: STONE
2827 new_class_stone: CLASSI_STONE
2828 old_class_stone: CLASSI_STONE
2829 conv_classc: CLASSC_STONE
2830 conv_brkstone: BREAKABLE_STONE
2831 cluster_st: CLUSTER_STONE
2832 old_cluster_st: CLUSTER_STONE
2833 feature_stone: FEATURE_STONE
2834 conv_ferrst: FEATURE_ERROR_STONE
2835
2836 ef_stone: EXTERNAL_FILE_STONE
2837 f: FILE
2838
2839 conv_errst: ERROR_STONE
2840 cl_syntax_stone: CL_SYNTAX_STONE
2841 error_line: INTEGER
2842 class_file: RAW_FILE
2843 class_text_exists: BOOLEAN
2844 same_class: BOOLEAN
2845 test_stone: CLASSI_STONE
2846 conv_ace: ACE_SYNTAX_STONE
2847 externali: EXTERNAL_CLASS_I
2848 external_cons: CONSUMED_TYPE
2849 str: STRING
2850 dotnet_class: BOOLEAN
2851 l_short_formatter: EB_SHORT_FORMATTER
2852 l_flat_formatter: EB_FLAT_SHORT_FORMATTER
2853 l_main_formatter: EB_CLASS_TEXT_FORMATTER
2854 app_exec: APPLICATION_EXECUTION
2855 do
2856 -- the text does not change if the text was saved with syntax errors
2857 cur_wid := window
2858 if cur_wid = Void then
2859 --| Do nothing.
2860 else
2861 if old_cur = Void then
2862 old_cur := cur_wid.pointer_style
2863 end
2864 -- cur_wid.enable_capture
2865 cur_wid.set_pointer_style (Wait_cursor)
2866 end
2867
2868 conv_brkstone ?= a_stone
2869 conv_errst ?= a_stone
2870 conv_ace ?= a_stone
2871 ef_stone ?= a_stone
2872 if conv_brkstone /= Void then
2873 app_exec := Debugger_manager.application
2874 if app_exec.is_breakpoint_enabled (conv_brkstone.routine, conv_brkstone.index) then
2875 app_exec.remove_breakpoint (conv_brkstone.routine, conv_brkstone.index)
2876 else
2877 app_exec.set_breakpoint (conv_brkstone.routine, conv_brkstone.index)
2878 end
2879 Debugger_manager.notify_breakpoints_changes
2880 elseif conv_errst /= Void then
2881 display_error_help_cmd.execute_with_stone (conv_errst)
2882 elseif conv_ace /= Void then
2883 --| FIXME XR: What should we do?!
2884 elseif ef_stone /= Void then
2885 f := ef_stone.file
2886 f.make_open_read (f.name)
2887 f.read_stream (f.count)
2888 f.close
2889 editor_tool.text_area.load_text (f.last_string)
2890 else
2891 -- Remember previous stone.
2892 old_stone := stone
2893 old_class_stone ?= stone
2894 old_cluster_st ?= stone
2895
2896 -- New stone properties
2897 new_class_stone ?= a_stone
2898
2899 -- Set the stone.
2900 old_set_stone (a_stone)
2901 cluster_st ?= a_stone
2902
2903 new_feature_cmd.disable_sensitive
2904 toggle_feature_alias_cmd.disable_sensitive
2905 toggle_feature_signature_cmd.disable_sensitive
2906 toggle_feature_assigner_cmd.disable_sensitive
2907
2908 -- We update the state of the `Add to Favorites' command.
2909 if new_class_stone /= Void then
2910 favorites_menu.first.enable_sensitive
2911 else
2912 favorites_menu.first.disable_sensitive
2913 end
2914
2915 -- Update the address manager if needed.
2916 address_manager.refresh
2917 if new_class_stone /= Void then
2918 -- Text is now editable.
2919 editor_tool.text_area.set_read_only (False)
2920
2921 -- class stone was dropped
2922 create class_file.make (new_class_stone.class_i.file_name)
2923 class_text_exists := class_file.exists
2924 feature_stone ?= a_stone
2925 --| We have to create a classi_stone to check whether the stones are really similar.
2926 --| Otherwise a redefinition of same_as may be called.
2927 create test_stone.make (new_class_stone.class_i)
2928 if test_stone.same_as (old_class_stone) then
2929 same_class := True
2930 end
2931 if not feature_stone_already_processed then
2932 if same_class and then text_saved then
2933 -- nothing changed in the editor
2934 -- we only have to update click_list
2935 if editor_tool.text_area.is_editable then
2936 editor_tool.text_area.update_click_list (False)
2937 end
2938 else
2939 if changed then
2940 -- user has already chosen not to save the file
2941 -- do not ask again
2942 Feature_positions.wipe_out
2943 editor_tool.text_area.no_save_before_next_load
2944 end
2945 end
2946 end
2947
2948 conv_classc ?= new_class_stone
2949
2950 -- First choose possible formatter
2951 l_main_formatter ?= new_class_stone.pos_container
2952 if l_main_formatter /= Void and not during_synchronization then
2953 if
2954 not (conv_classc /= Void and class_text_exists and (not changed or not same_class))
2955 then
2956 l_main_formatter.enable_select
2957 elseif feature_stone = Void then
2958 if l_main_formatter /= pos_container then
2959 l_main_formatter.enable_select
2960 end
2961 if new_class_stone.position > 0 then
2962 editor_tool.text_area.display_line_at_top_when_ready (new_class_stone.position)
2963 end
2964 end
2965 end
2966
2967 if conv_classc = Void or else
2968 conv_classc.e_class.is_external or else
2969 feature_stone /= Void and not
2970 feature_stone_already_processed and not
2971 (same_class and context_tool.sending_stone) then
2972 -- If a classi_stone or a feature_stone or a external call
2973 -- has been dropped, check to see if a .NET class.
2974 if class_text_exists then
2975 if new_class_stone.class_i.is_external_class then
2976 externali ?= new_class_stone.class_i
2977 check
2978 externali_not_void: externali /= Void
2979 end
2980 external_cons := externali.external_consumed_type
2981 if external_cons /= Void then
2982 -- A .NET class.
2983 dotnet_class := True
2984 l_short_formatter ?= managed_main_formatters.i_th (4)
2985 l_flat_formatter ?= managed_main_formatters.i_th (5)
2986 if l_short_formatter /= Void then
2987 l_short_formatter.set_dotnet_mode (True)
2988 end
2989 if l_flat_formatter /= Void then
2990 l_flat_formatter.set_dotnet_mode (True)
2991 end
2992 end
2993 elseif feature_stone /= Void then
2994 from
2995 managed_main_formatters.start
2996 until
2997 managed_main_formatters.after
2998 loop
2999 managed_main_formatters.item.set_stone (new_class_stone)
3000 managed_main_formatters.forth
3001 end
3002 else
3003 managed_main_formatters.first.set_stone (new_class_stone)
3004 managed_main_formatters.first.execute
3005 end
3006 else
3007 editor_tool.text_area.clear_window
3008 editor_tool.text_area.display_message (
3009 Warning_messages.w_file_not_exist (
3010 new_class_stone.class_i.file_name))
3011 end
3012 end
3013 if conv_classc = Void then
3014 --| The dropped class is not compiled.
3015 --| Display only the textual formatter.
3016 if dotnet_class then
3017 managed_main_formatters.i_th (4).set_stone (new_class_stone)
3018 managed_main_formatters.i_th (5).set_stone (new_class_stone)
3019 managed_main_formatters.i_th (4).execute
3020 end
3021 address_manager.disable_formatters
3022 else
3023 --| We have a compiled class.
3024 if
3025 class_text_exists and then
3026 Eiffel_project.Workbench.last_reached_degree <= 2
3027 then
3028 new_feature_cmd.enable_sensitive
3029 toggle_feature_alias_cmd.enable_sensitive
3030 toggle_feature_signature_cmd.enable_sensitive
3031 toggle_feature_assigner_cmd.enable_sensitive
3032 end
3033
3034 --address_manager.enable_formatters
3035 update_formatters
3036 if not class_text_exists then
3037 --| Disable the textual formatter.
3038 managed_main_formatters.first.disable_sensitive
3039 from
3040 managed_main_formatters.start
3041 until
3042 managed_main_formatters.after
3043 loop
3044 managed_main_formatters.item.set_stone (new_class_stone)
3045 managed_main_formatters.forth
3046 end
3047 managed_main_formatters.i_th (2).execute
3048 else
3049 if not changed or not same_class then
3050 --| Enable all formatters.
3051 if
3052 (not feature_stone_already_processed or
3053 not managed_main_formatters.first.selected) and
3054 feature_stone = Void
3055 then
3056 from
3057 managed_main_formatters.start
3058 until
3059 managed_main_formatters.after
3060 loop
3061 managed_main_formatters.item.set_stone (new_class_stone)
3062 managed_main_formatters.forth
3063 end
3064 end
3065 else
3066 if not feature_stone_already_processed then
3067 address_manager.disable_formatters
3068 from
3069 managed_main_formatters.start
3070 until
3071 managed_main_formatters.after
3072 loop
3073 managed_main_formatters.item.set_stone (new_class_stone)
3074 managed_main_formatters.forth
3075 end
3076 end
3077 end
3078 end
3079 end
3080 if not managed_main_formatters.first.selected then
3081 editor_tool.text_area.set_read_only (true)
3082 end
3083 else
3084 -- not a class text : cannot be edited
3085 editor_tool.text_area.set_read_only (True)
3086 address_manager.disable_formatters
3087
3088 --| Disable all formatters.
3089 from
3090 managed_main_formatters.start
3091 until
3092 managed_main_formatters.after
3093 loop
3094 managed_main_formatters.item.set_stone (Void)
3095 managed_main_formatters.forth
3096 end
3097 if cluster_st /= Void then
3098 --| FIXME XR: Really manage cluster display in the main editor
3099 formatted_context_for_cluster (cluster_st.cluster_i)
3100 if cluster_st.position > 0 then
3101 editor_tool.text_area.display_line_at_top_when_ready (cluster_st.position)
3102 end
3103 --| END FIXME
3104 end
3105 end
3106 if class_text_exists then
3107 if feature_stone /= Void and not feature_stone_already_processed and not (same_class and context_tool.sending_stone) then
3108 conv_ferrst ?= feature_stone
3109 if conv_ferrst /= Void then
3110 error_line := conv_ferrst.line_number
3111 else
3112 -- if a feature_stone has been dropped
3113 -- scroll to the corresponding feature in the basic text format
3114 if not during_synchronization then
3115 scroll_to_feature (feature_stone.e_feature, new_class_stone.class_i)
3116 end
3117 end
3118 else
3119 cl_syntax_stone ?= a_stone
3120 if cl_syntax_stone /= Void then
3121 error_line := cl_syntax_stone.line
3122 end
3123 end
3124 if error_line > 0 then
3125 -- Scroll to the line of the error.
3126 editor_tool.text_area.display_line_when_ready (error_line, True)
3127 end
3128 end
3129 -- Update the title of the window
3130 if a_stone /= Void then
3131 if changed then
3132 str := a_stone.header.twin
3133 str.prepend ("* ")
3134 set_title (str)
3135 else
3136 set_title (a_stone.header)
3137 end
3138 else
3139 set_title (Interface_names.t_empty_development_window)
3140 end
3141
3142 -- Refresh the tools.
3143 features_tool.set_stone (a_stone)
3144 cluster_tool.set_stone (a_stone)
3145 -- Update the context tool.
3146 if unified_stone then
3147 context_tool.set_stone (a_stone)
3148 end
3149
3150 end
3151 if
3152 stone /= Void and then
3153 not unified_stone
3154 then
3155 send_stone_to_context_cmd.enable_sensitive
3156 else
3157 send_stone_to_context_cmd.disable_sensitive
3158 end
3159 if cur_wid = Void then
3160 --| Do nothing.
3161 else
3162 cur_wid.set_pointer_style (old_cur)
3163 old_cur := Void
3164 -- cur_wid.disable_capture
3165 cur_wid := Void
3166 end
3167 end
3168
3169 formatted_context_for_cluster (a_cluster: CLUSTER_I) is
3170 -- Formatted context representing the list of classes inside `a_cluster'.
3171 require
3172 a_cluster_not_void: a_cluster /= Void
3173 local
3174 l_assembly: ASSEMBLY_I
3175 l_sorted_cluster: EB_SORTED_CLUSTER
3176 l_indexes: INDEXING_CLAUSE_AS
3177 l_classes: DS_LIST [CLASS_I]
3178 l_subclu: DS_LIST [EB_SORTED_CLUSTER]
3179 l_cl_i: CLASS_I
3180 l_list_cl_i: DS_LIST [CLASS_I]
3181 l_cluster: CLUSTER_I
3182 l_assert_level: ASSERTION_I
3183 l_format_context: TEXT_FORMATTER_DECORATOR
3184 do
3185
3186 create l_format_context.make_for_case (editor_tool.text_area.text_displayed)
3187 editor_tool.text_area.handle_before_processing (false)
3188 l_format_context.process_keyword_text (ti_indexing_keyword, Void)
3189 l_format_context.put_new_line
3190 l_format_context.indent
3191 if a_cluster.is_assembly then
3192 l_assembly ?= a_cluster
3193 check l_assembly /= Void end
3194 l_format_context.process_indexing_tag_text ("assembly_name")
3195 l_format_context.set_without_tabs
3196 l_format_context.process_symbol_text (ti_colon)
3197 l_format_context.put_space
3198 l_format_context.put_quoted_string_item (l_assembly.assembly_name)
3199 l_format_context.put_new_line
3200 l_format_context.process_indexing_tag_text ("assembly_path")
3201 l_format_context.set_without_tabs
3202 l_format_context.process_symbol_text (ti_colon)
3203 l_format_context.put_space
3204 conf_todo
3205 -- l_format_context.put_quoted_string_item (l_assembly.assembly_path)
3206 l_format_context.put_new_line
3207
3208 end
3209 l_format_context.process_indexing_tag_text ("cluster")
3210 l_format_context.set_without_tabs
3211 l_format_context.process_symbol_text (ti_colon)
3212 l_format_context.put_space
3213 l_format_context.put_quoted_string_item (a_cluster.cluster_name)
3214
3215 l_format_context.put_new_line
3216 l_format_context.process_indexing_tag_text ("cluster_path")
3217 l_format_context.set_without_tabs
3218 l_format_context.process_symbol_text (ti_colon)
3219 l_format_context.put_space
3220 l_format_context.put_quoted_string_item (a_cluster.path)
3221 l_format_context.put_new_line
3222 conf_todo
3223 -- l_indexes := a_cluster.indexes
3224 if l_indexes /= Void then
3225 l_format_context.format_indexing_with_no_keyword (l_indexes)
3226 l_format_context.put_new_line
3227 end
3228
3229 if a_cluster.parent_cluster /= Void then
3230 l_format_context.process_indexing_tag_text ("parent cluster")
3231 l_format_context.set_without_tabs
3232 l_format_context.process_symbol_text (ti_colon)
3233 l_format_context.put_new_line
3234 l_format_context.indent
3235 l_format_context.put_manifest_string (" - ")
3236
3237 conf_todo
3238 -- l_format_context.add_cluster (a_cluster.parent_cluster, a_cluster.parent_cluster.cluster_name)
3239 l_format_context.put_new_line
3240 l_format_context.exdent
3241 end
3242
3243 create l_sorted_cluster.make (a_cluster)
3244 l_sorted_cluster.initialize
3245
3246 if not l_sorted_cluster.clusters.is_empty then
3247 l_format_context.process_indexing_tag_text ("sub cluster(s)")
3248 l_format_context.set_without_tabs
3249 l_format_context.process_symbol_text (ti_colon)
3250 l_format_context.put_new_line
3251 l_format_context.indent
3252 from
3253 l_subclu := l_sorted_cluster.clusters
3254 l_subclu.start
3255 until
3256 l_subclu.after
3257 loop
3258 conf_todo
3259 -- l_cluster := l_subclu.item.actual_cluster
3260 -- l_format_context.put_manifest_string (" - ")
3261 -- l_format_context.add_cluster (l_cluster, l_cluster.cluster_name)
3262 -- l_format_context.put_space
3263 -- l_format_context.set_without_tabs
3264 -- l_format_context.process_symbol_text (ti_L_parenthesis)
3265 -- l_format_context.process_comment_text (l_cluster.classes.count.out, Void)
3266 -- l_format_context.set_without_tabs
3267 -- l_format_context.process_symbol_text (ti_R_parenthesis)
3268 -- l_format_context.put_new_line
3269 l_subclu.forth
3270 end
3271 l_format_context.exdent
3272 end
3273
3274 if not l_sorted_cluster.classes.is_empty then
3275 l_format_context.process_indexing_tag_text ("class(es)")
3276 l_format_context.set_without_tabs
3277 l_format_context.process_symbol_text (ti_colon)
3278 l_format_context.put_new_line
3279 l_format_context.indent
3280 from
3281 l_classes := l_sorted_cluster.classes
3282 l_classes.start
3283 until
3284 l_classes.after
3285 loop
3286 l_cl_i := l_classes.item_for_iteration
3287 l_assert_level := l_cl_i.assertion_level
3288 l_format_context.put_manifest_string (" - ")
3289 l_format_context.put_classi (l_cl_i)
3290 l_format_context.set_without_tabs
3291 l_format_context.process_symbol_text (ti_colon)
3292 if l_cl_i.compiled then
3293 if l_assert_level.check_all then
3294 l_format_context.put_space
3295 l_format_context.set_without_tabs
3296 l_format_context.process_keyword_text (ti_All_keyword, Void)
3297 elseif l_assert_level.level = 0 then
3298 l_format_context.put_space
3299 l_format_context.process_comment_text (once "None", Void)
3300 else
3301 if l_assert_level.check_precond then
3302 l_format_context.put_space
3303 l_format_context.set_without_tabs
3304 l_format_context.process_keyword_text (ti_Require_keyword, Void)
3305 end
3306 if l_assert_level.check_postcond then
3307 l_format_context.put_space
3308 l_format_context.set_without_tabs
3309 l_format_context.process_keyword_text (ti_Ensure_keyword, Void)
3310 end
3311 if l_assert_level.check_check then
3312 l_format_context.put_space
3313 l_format_context.set_without_tabs
3314 l_format_context.process_keyword_text (ti_Check_keyword, Void)
3315 end
3316 if l_assert_level.check_loop then
3317 l_format_context.put_space
3318 l_format_context.set_without_tabs
3319 l_format_context.process_keyword_text (ti_Loop_keyword, Void)
3320 end
3321 if l_assert_level.check_invariant then
3322 l_format_context.put_space
3323 l_format_context.set_without_tabs
3324 l_format_context.process_keyword_text (ti_Invariant_keyword, Void)
3325 end
3326 end
3327 else
3328 l_format_context.process_comment_text (" Not in system.", Void)
3329 end
3330 l_format_context.put_new_line
3331 l_classes.forth
3332 end
3333 l_format_context.exdent
3334 end
3335
3336 conf_todo
3337 -- if not a_cluster.overriden_classes.is_empty then
3338 -- l_format_context.process_indexing_tag_text ("overriden class(es)")
3339 -- l_format_context.set_without_tabs
3340 -- l_format_context.process_symbol_text (ti_colon)
3341 -- l_format_context.put_new_line
3342 -- l_format_context.indent
3343 -- from
3344 -- l_classes := a_cluster.overriden_classes.linear_representation
3345 -- l_classes.start
3346 -- until
3347 -- l_classes.after
3348 -- loop
3349 -- l_cl_i := l_classes.item
3350 -- l_format_context.put_manifest_string (" - ")
3351 -- l_format_context.put_classi (l_cl_i)
3352 -- l_list_cl_i := eiffel_universe.classes_with_name (l_cl_i.name)
3353 -- if l_list_cl_i /= Void and then not l_list_cl_i.is_empty then
3354 -- l_format_context.set_without_tabs
3355 -- l_format_context.process_symbol_text (ti_colon)
3356 -- l_format_context.process_comment_text (" overriden by", Void)
3357 -- from
3358 -- l_list_cl_i.start
3359 -- until
3360 -- l_list_cl_i.after
3361 -- loop
3362 -- l_cluster := l_list_cl_i.item.cluster
3363 -- if l_cluster /= a_cluster then
3364 -- l_format_context.put_space
3365 -- l_format_context.set_without_tabs
3366 -- l_format_context.process_symbol_text (ti_double_quote)
3367 -- l_format_context.add_cluster (l_list_cl_i.item.cluster, l_list_cl_i.item.cluster.cluster_name)
3368 -- l_format_context.set_without_tabs
3369 -- l_format_context.process_symbol_text (ti_double_quote)
3370 -- end
3371 -- l_list_cl_i.forth
3372 -- end
3373 -- end
3374 -- l_format_context.put_new_line
3375 -- l_classes.forth
3376 -- end
3377 -- l_format_context.exdent
3378 -- l_format_context.put_new_line
3379 -- end
3380
3381 l_format_context.exdent
3382 l_format_context.put_new_line
3383 editor_tool.text_area.handle_after_processing
3384 end
3385
3386 scroll_to_feature (feat_as: E_FEATURE; displayed_class: CLASS_I) is
3387 -- highlight the feature correspnding to `feat_as' in the class represented by `displayed_class'
3388 require
3389 class_is_not_void: displayed_class /= Void
3390 feat_as_is_not_void: feat_as /= Void
3391 local
3392 begin_index, offset: INTEGER
3393 tmp_text: STRING
3394 do
3395 if not feat_as.is_il_external then
3396 if not managed_main_formatters.first.selected then
3397 if feat_as.ast /= Void then
3398 editor_tool.text_area.find_feature_named (feat_as.name)
3399 end
3400 else
3401 if feat_as.ast /= Void then
3402 begin_index := feat_as.ast.start_position
3403 tmp_text := displayed_class.text.substring (1, begin_index)
3404 offset := tmp_text.occurrences('%R')
3405 editor_tool.text_area.scroll_to_when_ready (begin_index.item - offset)
3406 end
3407 end
3408 else
3409 if not managed_main_formatters.first.selected then
3410 managed_main_formatters.first.execute
3411 end
3412 -- FIXME NC: Doesn't work properly for .NET features
3413 -- .NET formatted feature.
3414 begin_index := feature_positions.item (feat_as)
3415 if platform_constants.is_windows then
3416 tmp_text := displayed_class.text.substring (1, begin_index)
3417 offset := tmp_text.occurrences('%N')
3418 end
3419 editor_tool.text_area.scroll_to_when_ready (begin_index // 2) -- - offset)
3420 end
3421 end
3422
3423 check_passed: BOOLEAN
3424
3425 save_canceled: BOOLEAN
3426 -- did user cancel save ?
3427
3428 save_only: BOOLEAN
3429 -- skip parse and update after save ?
3430
3431 text_saved: BOOLEAN
3432 -- has the user chosen to save the file
3433
3434 is_destroying: BOOLEAN
3435 -- Is `current' being currently destroyed?
3436
3437 feature_stone_already_processed: BOOLEAN
3438 -- Is the processed stone a feature stone and has it
3439 -- been already processed by the editor ?
3440
3441 feature {NONE} -- Implementation
3442
3443 update_save_symbol is
3444 do
3445 Precursor {EB_FILEABLE}
3446 if changed then
3447 save_cmd.enable_sensitive
3448 address_manager.disable_formatters
3449 else
3450 save_cmd.disable_sensitive
3451 update_formatters
3452 end
3453 if is_empty then
3454 print_cmd.disable_sensitive
3455 save_as_cmd.disable_sensitive
3456 else
3457 print_cmd.enable_sensitive
3458 save_as_cmd.enable_sensitive
3459 end
3460 end
3461
3462 is_stone_external: BOOLEAN
3463 -- Does 'stone' contain a .NET consumed type?
3464
3465 update_formatters is
3466 -- Give a correct sensitivity to formatters.
3467 local
3468 cist: CLASSI_STONE
3469 cst: CLASSC_STONE
3470 type_changed: BOOLEAN
3471 do
3472 cst ?= stone
3473 cist ?= stone
3474 -- Check to if formatting context has changed.
3475 if cst /= Void then
3476 type_changed := (cst.e_class.is_true_external and not is_stone_external) or
3477 (not cst.e_class.is_true_external and is_stone_external)
3478 elseif cist /= Void then
3479 type_changed := (cist.class_i.is_external_class and not is_stone_external) or
3480 (not cist.class_i.is_external_class and is_stone_external)
3481 end
3482
3483 if type_changed then
3484 -- Toggle stone flag.
3485 is_stone_external := not is_stone_external
3486 end
3487
3488 if cst /= Void then
3489 address_manager.enable_formatters
3490 if is_stone_external then
3491 -- Change formatters to .NET sensitivity (from normal).
3492 enable_dotnet_formatters
3493 if type_changed then
3494 managed_main_formatters.i_th (4).enable_select
3495 end
3496 else
3497 if changed then
3498 address_manager.disable_formatters
3499 else
3500 --managed_main_formatters.first.disable_sensitive
3501 end
3502 end
3503 elseif cist /= Void and is_stone_external then
3504 -- Change formatters to .NET sensitivity (from normal).
3505 enable_dotnet_formatters
3506 if type_changed then
3507 managed_main_formatters.i_th (4).enable_select
3508 end
3509 else
3510 address_manager.disable_formatters
3511 if cist /= stone then
3512 managed_main_formatters.first.execute
3513 end
3514 end
3515 end
3516
3517 enable_dotnet_formatters is
3518 -- Enable only the .NET class text formatters.
3519 do
3520 from
3521 managed_main_formatters.start
3522 until
3523 managed_main_formatters.after
3524 loop
3525 if managed_main_formatters.item.is_dotnet_formatter then
3526 managed_main_formatters.item.enable_sensitive
3527 else
3528 managed_main_formatters.item.disable_sensitive
3529 end
3530 managed_main_formatters.forth
3531 end
3532 end
3533
3534
3535 on_text_reset is
3536 -- The main editor has just been wiped out
3537 -- before loading a new file.
3538 local
3539 str: STRING
3540 do
3541 str := title.twin
3542 if str @ 1 = '*' then
3543 str.keep_tail (str.count - 2)
3544 set_title (str)
3545 end
3546 address_manager.disable_formatters
3547 status_bar.reset
3548 status_bar.remove_cursor_position
3549 text_edited := False
3550 end
3551
3552 on_cursor_moved is
3553 -- The cursor has moved, reflect the change in the status bar.
3554 -- And reflect location editing in the text in features tool and address bar.
3555 do
3556 refresh_cursor_position
3557 if context_refreshing_timer = Void then
3558 create context_refreshing_timer.make_with_interval (100)
3559 context_refreshing_timer.actions.extend (agent refresh_context_info)
3560 end
3561 if feature_locating then
3562 context_refreshing_timer.set_interval (0)
3563 else
3564 context_refreshing_timer.set_interval (100)
3565 end
3566
3567 end
3568
3569 on_text_fully_loaded is
3570 -- The main editor has just been reloaded.
3571 do
3572 update_paste_cmd
3573 update_formatters
3574 if editor_tool.text_area.syntax_is_correct then
3575 status_bar.reset
3576 else
3577 status_bar.display_message (Interface_names.L_syntax_error)
3578 end
3579 refresh_cursor_position
3580 text_edited := False
3581 end
3582
3583 on_text_back_to_its_last_saved_state is
3584 local
3585 str: STRING
3586 do
3587 str := title.twin
3588 if str @ 1 = '*' then
3589 str.keep_tail (str.count - 2)
3590 set_title (str)
3591 end
3592 update_formatters
3593 text_edited := False
3594 end
3595
3596 text_edited: BOOLEAN
3597 -- Do we know that the text was edited?
3598 -- If so, no need to update the display each time it is edited.
3599
3600 on_text_edited (unused: BOOLEAN) is
3601 -- The text in the editor is modified, add the '*' in the title.
3602 -- Gray out the formatters.
3603 local
3604 str: STRING
3605 cst: CLASSI_STONE
3606 do
3607 if not text_edited then
3608 str := title.twin
3609 if str @ 1 /= '*' then
3610 str.prepend ("* ")
3611 set_title (str)
3612 end
3613 address_manager.disable_formatters
3614 cst ?= stone
3615 if cst /= Void then
3616 Eiffel_project.Manager.class_is_edited (cst.class_i)
3617 end
3618 text_edited := True
3619 end
3620 if not status_bar.message.is_equal (interface_names.e_c_compilation_running) then
3621 -- We don't want the "Background C compilation in progress" message flash every time
3622 -- user presses a key.
3623 status_bar.display_message ("")
3624 end
3625 end
3626
3627 on_back is
3628 -- User pressed Alt+left.
3629 -- Go back in the history (or the context history).
3630 do
3631 if context_tool_has_focus then
3632 if context_tool.history_manager.is_back_possible then
3633 context_tool.history_manager.back_command.execute
3634 end
3635 elseif history_manager.is_back_possible then
3636 history_manager.back_command.execute
3637 end
3638 end
3639
3640 on_forth is
3641 -- User pressed Alt+right.
3642 -- Go forth in the history (or the context history).
3643 do
3644 if context_tool_has_focus then
3645 if context_tool.history_manager.is_forth_possible then
3646 context_tool.history_manager.forth_command.execute
3647 end
3648 elseif history_manager.is_forth_possible then
3649 history_manager.forth_command.execute
3650 end
3651 end
3652
3653 context_tool_has_focus: BOOLEAN is
3654 -- Does the context tool or one of its children has the focus?
3655 local
3656 fw: EV_WIDGET
3657 cont: EV_CONTAINER
3658 wid: EV_WIDGET
3659 do
3660 fw := (create {EV_ENVIRONMENT}).application.focused_widget
3661 wid := context_tool.explorer_bar_item.widget
3662 if wid = fw then
3663 Result := True
3664 elseif fw = Void then
3665 Result := False
3666 else
3667 from
3668 cont := fw.parent
3669 until
3670 cont = wid or cont = Void
3671 loop
3672 cont := cont.parent
3673 end
3674 if cont = wid then
3675 Result := True
3676 end
3677 end
3678 end
3679
3680 saved_cursor: CURSOR
3681 -- Saved cursor position for displaying the stack.
3682
3683 can_drop (st: ANY): BOOLEAN is
3684 -- Can the user drop the stone `st'?
3685 local
3686 conv_ace: ACE_SYNTAX_STONE
3687 do
3688 conv_ace ?= st
3689 Result := conv_ace = Void
3690 end
3691
3692 send_stone_to_context is
3693 -- Send current stone to the context tool.
3694 -- Used by `send_stone_to_context_cmd'.
3695 do
3696 if stone /= Void then
3697 context_tool.set_stone (stone)
3698 end
3699 end
3700
3701 destroy is
3702 -- check if current text has been saved and destroy
3703 local
3704 dialog_w: EV_WARNING_DIALOG
3705 do
3706 if Window_manager.development_windows_count > 1 and then process_manager.is_external_command_running and then Current = external_output_manager.target_development_window then
3707 process_manager.confirm_external_command_termination (agent terminate_external_command_and_destroy, agent do_nothing, window)
3708 else
3709 if editor_tool /= Void and then editor_tool.text_area /= Void and then changed and then not confirmed then
3710 if Window_manager.development_windows_count > 1 then
3711 create dialog_w.make_with_text (Warning_messages.w_save_before_closing)
3712 dialog_w.set_buttons_and_actions (<<"Yes", "No", "Cancel">>, <<agent save_and_destroy, agent force_destroy, agent do_nothing>>)
3713 dialog_w.set_default_push_button (dialog_w.button("Yes"))
3714 dialog_w.set_default_cancel_button (dialog_w.button("Cancel"))
3715 dialog_w.show_modal_to_window (window)
3716 else
3717 -- We let the window manager handle the saving, along with other windows
3718 -- (not development windows)
3719 force_destroy
3720 end
3721 else
3722 Precursor {EB_TOOL_MANAGER}
3723 if context_refreshing_timer /= Void then
3724 context_refreshing_timer.destroy
3725 context_refreshing_timer := Void
3726 end
3727 end
3728 end
3729 end
3730
3731 terminate_external_command_and_destroy is
3732 -- Terminate running external command and destroy.
3733 do
3734 process_manager.terminate_external_command
3735 destroy
3736 ensure
3737 external_command_not_running: not process_manager.is_external_command_running
3738 end
3739
3740 save_and_destroy is
3741 do
3742 save_text
3743 destroy
3744 end
3745
3746 force_destroy is
3747 -- Destroy without asking.
3748 do
3749 confirmed := True
3750 destroy
3751 confirmed := False
3752 end
3753
3754 confirmed: BOOLEAN
3755 -- Did the user say he wanted to exit?
3756
3757 show_dynamic_library_dialog is
3758 -- Create a new dynamic library window and display it.
3759 do
3760 Window_manager.create_dynamic_lib_window
3761 end
3762
3763 context_refreshing_timer: EV_TIMEOUT
3764
3765 recycle is
3766 -- Call the precursors.
3767 do
3768 Precursor {EB_TOOL_MANAGER}
3769 command_controller.recycle
3770 if refactoring_manager /= Void then
3771 refactoring_manager.destroy
3772 end
3773 end
3774
3775 feature {NONE} -- Implementation: Editor commands
3776
3777 refresh_cursor_position is
3778 -- Display the current cursor position in the status bar.
3779 require
3780 text_loaded: not is_empty
3781 local
3782 l, c, v: INTEGER
3783 do
3784 l := editor_tool.text_area.cursor_y_position
3785 c := editor_tool.text_area.cursor_x_position
3786 v := editor_tool.text_area.cursor_visible_x_position
3787 status_bar.set_cursor_position (l, c, v)
3788 end
3789
3790 refresh_context_info is
3791 -- Refresh address bar and features tool to relect
3792 -- where in the code the cursor is located.
3793 local
3794 l_feature: FEATURE_AS
3795 l_classc_stone: CLASSC_STONE
3796 do
3797 context_refreshing_timer.set_interval (0)
3798 l_classc_stone ?= stone
3799 if l_classc_stone /= Void then
3800 l_feature := editor_tool.text_area.text_displayed.current_feature_containing
3801 if l_feature /= Void then
3802 set_editing_location_by_feature (l_feature)
3803 else
3804 set_editing_location_by_feature (Void)
3805 end
3806 end
3807 end
3808
3809 set_editing_location_by_feature (a_feature: FEATURE_AS) is
3810 -- Set editing location, feature tool and combo box changes according to `a_feature'.
3811 local
3812 l_efeature: E_FEATURE
3813 l_class_i: CLASS_I
3814 l_classc: CLASS_C
3815 do
3816 if a_feature /= Void then
3817 address_manager.set_feature_text_simply (a_feature.feature_names.first.internal_name)
3818 l_class_i := eiffel_universe.class_named (class_name, group)
3819 if l_class_i /= Void and then l_class_i.is_compiled then
3820 l_classc := l_class_i.compiled_class
3821 if l_classc.has_feature_table then
3822 l_efeature := l_classc.feature_with_name (a_feature.feature_names.first.internal_name)
3823 end
3824 end
3825 else
3826 address_manager.set_feature_text_simply (once "")
3827 end
3828 seek_item_in_feature_tool (l_efeature)
3829 end
3830
3831 seek_item_in_feature_tool (a_feature: E_FEATURE) is
3832 -- Seek and select item contains data of `a_feature' in features tool.
3833 -- If `a_feature' is void, deselect item in features tool.
3834 do
3835 features_tool.seek_item_in_feature_tool (a_feature)
3836 end
3837
3838 select_all is
3839 -- Select the whole text in the focused editor.
3840 do
3841 current_editor.select_all
3842 end
3843
3844 search is
3845 -- Search some text in the focused editor.
3846 local
3847 cv_ced: EB_CLICKABLE_EDITOR
3848 do
3849 cv_ced ?= current_editor
3850 if cv_ced /= Void then
3851 cv_ced.search
3852 end
3853 end
3854
3855 goto is
3856 -- Display a dialog to select a line to go to in the editor.
3857 local
3858 ed: EB_EDITOR
3859 do
3860 ed ?= current_editor
3861 if ed /= Void then
3862 create goto_dialog.make (ed)
3863 goto_dialog.show_modal_to_window (Current.window)
3864 end
3865 end
3866
3867 toggle_line_number_display is
3868 -- Toggle line number display on/off in editor
3869 do
3870 preferences.editor_data.show_line_numbers_preference.set_value (not preferences.editor_data.show_line_numbers)
3871 end
3872
3873 find_next is
3874 -- Find the next occurrence of the search text.
3875 local
3876 cv_ced: EB_CLICKABLE_EDITOR
3877 do
3878 if search_tool.currently_searched /= Void then
3879 cv_ced ?= current_editor
3880 if cv_ced /= Void then
3881 cv_ced.find_next
3882 end
3883 else
3884 search_tool.show_and_set_focus
3885 end
3886 end
3887
3888 find_previous is
3889 -- Find the previous occurrence of the search text.
3890 local
3891 cv_ced: EB_CLICKABLE_EDITOR
3892 do
3893 if search_tool.currently_searched /= Void then
3894 cv_ced ?= current_editor
3895 if cv_ced /= Void then
3896 cv_ced.find_previous
3897 end
3898 else
3899 search_tool.show_and_set_focus
3900 end
3901 end
3902
3903 find_selection is
3904 -- Find the next occurrence of the selection.
3905 local
3906 cv_ced: EB_CLICKABLE_EDITOR
3907 do
3908 cv_ced ?= current_editor
3909 if cv_ced /= Void then
3910 cv_ced.find_selection
3911 end
3912 end
3913
3914 cut_selection is
3915 -- Cut the selection in the current editor.
3916 do
3917 current_editor.cut_selection
3918 end
3919
3920 copy_selection is
3921 -- Cut the selection in the current editor.
3922 do
3923 current_editor.copy_selection
3924 end
3925
3926 toggle_formatting_marks is
3927 -- Show/Hide formatting marks in the editor and update related menu item.
3928 do
3929 current_editor.toggle_view_invisible_symbols
3930 if current_editor.view_invisible_symbols then
3931 formatting_marks_command_menu_item.set_text (Interface_names.m_hide_formatting_marks)
3932 else
3933 formatting_marks_command_menu_item.set_text(Interface_names.m_show_formatting_marks)
3934 end
3935 end
3936
3937 feature {NONE} -- Implementation / Menus
3938
3939 number_of_displayed_external_commands: INTEGER
3940 -- Number of external commands in the tools menu.
3941
3942 old_cur: EV_CURSOR
3943 -- Cursor saved while displaying the hourglass cursor.
3944
3945 cur_wid: EV_WIDGET
3946 -- Widget on which the hourglass cursor was set.
3947
3948 project_menu: EV_MENU
3949 -- Menu for entries relative to the Project.
3950
3951 recent_projects_menu: EB_RECENT_PROJECTS_MANAGER_MENU
3952 -- SubMenu for recent projects.
3953
3954 during_synchronization: BOOLEAN
3955 -- Are we during a resynchronization?
3956
3957 formatting_marks_command_menu_item: EB_COMMAND_MENU_ITEM
3958 -- Menu item used to shw/hide formatting marks.
3959
3960 undo_accelerator: EV_ACCELERATOR
3961 -- Accelerator for Ctrl+Z
3962
3963 redo_accelerator: EV_ACCELERATOR
3964 -- Accelerator for Ctrl+Y
3965
3966 feature {EB_TOOL} -- Implementation / Commands
3967
3968 shell_cmd: EB_OPEN_SHELL_COMMAND
3969 -- Command to use an external editor.
3970
3971 undo_cmd: EB_UNDO_COMMAND
3972 -- Command to undo in the editor.
3973
3974 redo_cmd: EB_REDO_COMMAND
3975 -- Command to redo in the editor.
3976
3977 editor_cut_cmd: EB_ON_SELECTION_COMMAND
3978 -- Command to cut text in the editor.
3979
3980 editor_copy_cmd: EB_ON_SELECTION_COMMAND
3981 -- Command to copy text in the editor.
3982
3983 editor_paste_cmd: EB_EDITOR_PASTE_COMMAND
3984 -- Command to paste text in the editor.
3985
3986 melt_cmd: EB_MELT_PROJECT_COMMAND
3987 -- Command to start compilation.
3988
3989 feature{EB_TOOL, EB_C_COMPILER_LAUNCHER}
3990
3991 c_workbench_compilation_cmd: EB_C_COMPILATION_COMMAND
3992 -- Command to compile the workbench C code.
3993
3994 c_finalized_compilation_cmd: EB_C_COMPILATION_COMMAND
3995 -- Command to compile the finalized C code.
3996
3997 feature{EB_TOOL}
3998
3999 new_cluster_cmd: EB_NEW_CLUSTER_COMMAND
4000 -- Command to create a new cluster.
4001
4002 new_class_cmd: EB_NEW_CLASS_COMMAND
4003 -- Command to create a new class.
4004
4005 new_feature_cmd: EB_NEW_FEATURE_COMMAND
4006 -- Command to execute the feature wizard.
4007
4008 toggle_feature_alias_cmd: EB_TOGGLE_FEATURE_ALIAS_COMMAND
4009 -- Show/Hide alias name of feature node in eb_feature_tool
4010
4011 toggle_feature_signature_cmd: EB_TOGGLE_FEATURE_SIGNATURE_COMMAND
4012 -- Show/Hide signature of feature node in eb_feature_tool
4013
4014 toggle_feature_assigner_cmd: EB_TOGGLE_FEATURE_ASSIGNER_COMMAND
4015 -- Show/Hide assigner name of feature node in eb_feature_tool
4016
4017 toggle_stone_cmd: EB_UNIFY_STONE_CMD
4018 -- Command to toggle between the stone management modes.
4019
4020 delete_class_cluster_cmd: EB_DELETE_CLASS_CLUSTER_COMMAND
4021 -- Command to remove a class or a cluster from the system
4022 -- (permanent deletion).
4023
4024 show_profiler: EB_SHOW_PROFILE_TOOL
4025 -- What allows us to display the profiler window.
4026
4027 toolbarable_commands: ARRAYED_LIST [EB_TOOLBARABLE_COMMAND]
4028 -- All commands that can be put in a toolbar.
4029
4030 command_controller: EB_EDITOR_COMMAND_CONTROLLER
4031 -- Object that takes care of updating the sensitivity of all editor commands.
4032
4033 save_as_cmd: EB_SAVE_FILE_AS_COMMAND
4034 -- Command to save a class with a different file name.
4035
4036 feature{EB_TOOL, EB_EXTERNAL_OUTPUT_TOOL}
4037
4038 Edit_external_commands_cmd: EB_EXTERNAL_COMMANDS_EDITOR is
4039 -- Command that lets the user add new external commands to the tools menu.
4040 once
4041 create Result.make
4042 Result.enable_sensitive
4043 end
4044
4045 feature{EB_TOOL}
4046
4047 system_info_cmd: EB_STANDARD_CMD is
4048 -- Command to display information about the system (root class,...)
4049 do
4050 Result := Eb_debugger_manager.system_info_cmd
4051 end
4052
4053 display_error_help_cmd: EB_ERROR_INFORMATION_CMD is
4054 -- Command to pop up a dialog giving help on compilation errors.
4055 do
4056 Result := Eb_debugger_manager.display_error_help_cmd
4057 end
4058
4059 send_stone_to_context_cmd: EB_STANDARD_CMD
4060 -- Command to send the current stone to the context tool.
4061
4062 print_cmd: EB_PRINT_COMMAND
4063 -- Command to print the content of editor with focus
4064
4065 eac_browser_cmd: EB_OPEN_EAC_BROWSER_CMD is
4066 -- Command to display the eac browser
4067 do
4068 Result := Eb_debugger_manager.eac_browser_cmd
4069 end
4070
4071 show_favorites_menu_item: EV_MENU_ITEM
4072 -- Show/Hide favorites menu item.
4073
4074 update_show_favorites_menu_item is
4075 -- Update `show_favorites_menu_item' menu label.
4076 do
4077 if favorites_tool.shown then
4078 show_favorites_menu_item.set_text (Interface_names.m_hide_favorites)
4079 else
4080 show_favorites_menu_item.set_text (Interface_names.m_show_favorites)
4081 end
4082 end
4083
4084 execute_show_favorites is
4085 -- Show `favorites_tool' if it is closed, close
4086 -- it in the opposite case.
4087 do
4088 update_show_favorites_menu_item
4089 if favorites_tool.shown then
4090 favorites_tool.close
4091 else
4092 favorites_tool.show
4093 end
4094 end
4095
4096 feature {EB_TOOL_WINDOW, EB_EXPLORER_BAR, EB_DEBUGGER_MANAGER} -- Floating tool handling
4097
4098 all_tool_windows: ARRAYED_LIST [EB_TOOL_WINDOW]
4099 -- All tool windows under the control of `Current'.
4100
4101 add_tool_window (a_tool_window: EB_TOOL_WINDOW) is
4102 -- Add `a_tool_window' to `all_tool_windows', ensuring it is
4103 -- then under the control of `Current'.
4104 require
4105 a_tool_window_not_void: a_tool_window /= Void
4106 do
4107 if all_tool_windows = Void then
4108 create all_tool_windows.make (2)
4109 end
4110 all_tool_windows.extend (a_tool_window)
4111 ensure
4112 extended: all_tool_windows.has (a_tool_window)
4113 end
4114
4115 remove_tool_window (a_widget: EV_WIDGET) is
4116 -- Remove tool window associate with `a_widget'.
4117 require
4118 a_widget_not_void: a_widget /= Void
4119 do
4120 if all_tool_windows /= Void then
4121 from
4122 all_tool_windows.start
4123 until
4124 all_tool_windows.off
4125 loop
4126 if all_tool_windows.item.tool = a_widget then
4127 all_tool_windows.remove
4128 all_tool_windows.finish
4129 end
4130 all_tool_windows.forth
4131 end
4132 end
4133 end
4134
4135 remove_all_tool_windows is
4136 -- Ensure `all_tool_windows' is empty if non Void.
4137 do
4138 if all_tool_windows /= Void then
4139 all_tool_windows.wipe_out
4140 end
4141 ensure
4142 tool_windows_empty: all_tool_windows /= Void implies all_tool_windows.is_empty
4143 end
4144
4145 window_moved (x_pos, y_pos: INTEGER) is
4146 -- `Current' has been moved, so move all associated tool windows within `all_tool_windows'.
4147 local
4148 tool_window: EB_TOOL_WINDOW
4149 do
4150 if all_tool_windows /= Void then
4151 from
4152 all_tool_windows.start
4153 until
4154 all_tool_windows.off
4155 loop
4156 tool_window := all_tool_windows.item
4157 check
4158 not_destroyed: not tool_window.window.is_destroyed
4159 end
4160 if preferences.development_window_data.dock_tracking then
4161 tool_window.window.move_actions.block
4162 tool_window.window.set_x_position (x_pos + tool_window.x_position)
4163 tool_window.window.set_y_position (y_pos + tool_window.y_position)
4164 tool_window.window.move_actions.resume
4165 else
4166 -- If we are not performing dock tracking, we must update the relative position
4167 -- of the tool window, so that if dock tracking is enabled, the relative
4168 -- positions are correct.
4169 tool_window.set_x_position ( tool_window.window.screen_x - x_pos)
4170 tool_window.set_y_position ( tool_window.window.screen_y - y_pos)
4171 end
4172 all_tool_windows.forth
4173 end
4174 end
4175 end
4176
4177 feature {NONE} -- Execution
4178
4179 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
4180 -- Action called when the user right-click in the toolbar.
4181 -- Display a popup menu to show/hide toolbars and customize the general toolbar.
4182 local
4183 popup_menu: EV_MENU
4184 do
4185 if a_button = 3 then
4186 popup_menu := build_toolbar_menu
4187 popup_menu.show
4188 end
4189 end
4190
4191 enable_commands_on_project_created is
4192 -- Enable commands when a new project has been created (not yet compiled)
4193 do
4194 system_info_cmd.enable_sensitive
4195 if
4196 stone /= Void and then
4197 not unified_stone
4198 then
4199 send_stone_to_context_cmd.enable_sensitive
4200 end
4201 end
4202
4203 enable_commands_on_project_loaded is
4204 -- Enable commands when a new project has been created and compiled
4205 do
4206 if has_profiler then
4207 show_profiler.enable_sensitive
4208 end
4209 if has_dll_generation then
4210 show_dynamic_lib_tool.enable_sensitive
4211 end
4212 open_cmd.enable_sensitive
4213 new_class_cmd.enable_sensitive
4214 new_cluster_cmd.enable_sensitive
4215 system_info_cmd.enable_sensitive
4216 if unified_stone then
4217 send_stone_to_context_cmd.disable_sensitive
4218 elseif stone /= Void then
4219 send_stone_to_context_cmd.enable_sensitive
4220 end
4221 new_class_cmd.enable_sensitive
4222 new_cluster_cmd.enable_sensitive
4223 delete_class_cluster_cmd.enable_sensitive
4224 c_workbench_compilation_cmd.enable_sensitive
4225 c_finalized_compilation_cmd.enable_sensitive
4226 refactoring_manager.enable_sensitive
4227 end
4228
4229 disable_commands_on_project_unloaded is
4230 -- Enable commands when a project has been closed.
4231 do
4232 if has_dll_generation then
4233 show_dynamic_lib_tool.disable_sensitive
4234 end
4235 if has_profiler then
4236 show_profiler.disable_sensitive
4237 end
4238 open_cmd.disable_sensitive
4239 new_class_cmd.disable_sensitive
4240 new_cluster_cmd.disable_sensitive
4241 if not project_manager.is_created then
4242 system_info_cmd.disable_sensitive
4243 send_stone_to_context_cmd.disable_sensitive
4244 end
4245 delete_class_cluster_cmd.disable_sensitive
4246 c_workbench_compilation_cmd.disable_sensitive
4247 c_finalized_compilation_cmd.disable_sensitive
4248 refactoring_manager.disable_sensitive
4249 refactoring_manager.forget_undo_redo
4250 end
4251
4252 feature {NONE} -- Access
4253
4254 development_window_data: EB_DEVELOPMENT_WINDOW_DATA is
4255 -- Meta data describing `Current'.
4256 do
4257 if internal_development_window_data /= Void then
4258 Result := internal_development_window_data
4259 else
4260 Result := preferences.development_window_data
4261 end
4262 end
4263
4264 internal_development_window_data: EB_DEVELOPMENT_WINDOW_SESSION_DATA;
4265 -- Internal custom meta data for `Current'.
4266
4267 indexing
4268 copyright: "Copyright (c) 1984-2006, Eiffel Software"
4269 license: "GPL version 2 (see http://www.eiffel.com/licensing/gpl.txt)"
4270 licensing_options: "http://www.eiffel.com/licensing"
4271 copying: "[
4272 This file is part of Eiffel Software's Eiffel Development Environment.
4273
4274 Eiffel Software's Eiffel Development Environment is free
4275 software; you can redistribute it and/or modify it under
4276 the terms of the GNU General Public License as published
4277 by the Free Software Foundation, version 2 of the License
4278 (available at the URL listed under "license" above).
4279
4280 Eiffel Software's Eiffel Development Environment is
4281 distributed in the hope that it will be useful, but
4282 WITHOUT ANY WARRANTY; without even the implied warranty
4283 of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
4284 See the GNU General Public License for more details.
4285
4286 You should have received a copy of the GNU General Public
4287 License along with Eiffel Software's Eiffel Development
4288 Environment; if not, write to the Free Software Foundation,
4289 Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
4290 ]"
4291 source: "[
4292 Eiffel Software
4293 356 Storke Road, Goleta, CA 93117 USA
4294 Telephone 805-685-1006, Fax 805-685-6869
4295 Website http://www.eiffel.com
4296 Customer support http://support.eiffel.com
4297 ]"
4298
4299 end -- class EB_DEVELOPMENT_WINDOW

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

  ViewVC Help
Powered by ViewVC 1.1.23