/[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 50326 - (show annotations)
Fri Apr 22 01:24:09 2005 UTC (14 years, 10 months ago) by neilc
Original Path: trunk/Src/bench/Eiffel/interface/new_graphical/windows/eb_development_window.e
File size: 100725 byte(s)
Updated calls to discardable dialog

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

Properties

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

  ViewVC Help
Powered by ViewVC 1.1.23