/[eiffelstudio]/branches/Eiffel_57_docking/Src/Eiffel/interface/new_graphical/case_tool/eiffel_view/class_figure.e
ViewVC logotype

Contents of /branches/Eiffel_57_docking/Src/Eiffel/interface/new_graphical/case_tool/eiffel_view/class_figure.e

Parent Directory Parent Directory | Revision Log Revision Log


Revision 62171 - (show annotations)
Tue Aug 1 01:27:17 2006 UTC (13 years, 4 months ago) by larryl
File size: 21526 byte(s)
First commit docking tabbed Eiffel Studio.
1 indexing
2 description: "Common functionality for all views for ES_CLASSes."
3 legal: "See notice at end of class."
4 status: "See notice at end of class."
5 author: "Benno Baumgartner"
6 date: "$Date$"
7 revision: "$Revision$"
8
9 deferred class
10 EIFFEL_CLASS_FIGURE
11
12 inherit
13 EG_LINKABLE_FIGURE
14 redefine
15 initialize,
16 model,
17 default_create,
18 add_link,
19 world,
20 on_handle_end,
21 on_handle_start,
22 recycle,
23 xml_element,
24 set_with_xml_element
25 end
26
27 EB_CONSTANTS
28 undefine
29 default_create
30 end
31
32 SHARED_WORKBENCH
33 export
34 {NONE} all
35 undefine
36 default_create
37 end
38
39 feature {NONE} -- Initialization
40
41 default_create is
42 -- Create an CLASS_FIGURE
43 do
44 Precursor {EG_LINKABLE_FIGURE}
45 set_pointer_style (default_pixmaps.sizeall_cursor)
46
47 drop_actions.extend (agent on_class_drop)
48 drop_actions.set_veto_pebble_function (agent veto_function)
49
50 start_actions.extend (agent save_position)
51 end_actions.extend (agent extend_history)
52 move_actions.extend (agent on_move)
53
54 pointer_double_press_actions.extend (agent on_pointer_double_pressed)
55 end
56
57 initialize is
58 -- Initialize a class figure with given model.
59 do
60 Precursor {EG_LINKABLE_FIGURE}
61
62 pebble_function := agent on_pebble_request
63 model.needed_on_diagram_changed_actions.extend (agent on_needed_on_diagram_changed)
64 end
65
66 feature -- Status report
67
68 is_faded: BOOLEAN
69 -- Is `Current' faded out?
70
71 feature -- Access
72
73 model: ES_CLASS
74 -- Model for `Current'.
75
76 world: EIFFEL_WORLD is
77 -- World `Current' is part of.
78 do
79 Result ?= Precursor {EG_LINKABLE_FIGURE}
80 end
81
82 feature -- Element change
83
84 recycle is
85 -- Free `Current's resources.
86 do
87 Precursor {EG_LINKABLE_FIGURE}
88 drop_actions.prune_all (agent on_class_drop)
89 start_actions.prune_all (agent save_position)
90 end_actions.prune_all (agent extend_history)
91 move_actions.prune_all (agent on_move)
92 pointer_double_press_actions.prune_all (agent on_pointer_double_pressed)
93 if model /= Void then
94 model.needed_on_diagram_changed_actions.prune_all (agent on_needed_on_diagram_changed)
95 end
96 end
97
98 apply_right_angles is
99 -- Apply right angles to all links in `links'.
100 local
101 l_item: EIFFEL_LINK_FIGURE
102 l_links: like links
103 i, nb: INTEGER
104 do
105 from
106 l_links := links
107 i := 1
108 nb := l_links.count
109 until
110 i > nb
111 loop
112 l_item ?= l_links.i_th (i)
113 if l_item /= Void then
114 l_item.apply_right_angles
115 end
116 i := i + 1
117 end
118 end
119
120 fade_out is
121 -- Fade out `Current'.
122 deferred
123 ensure
124 is_faded: is_faded
125 end
126
127 fade_in is
128 -- Fade in `Current'.
129 deferred
130 ensure
131 not_is_faded: not is_faded
132 end
133
134 update_fade is
135 -- Fade out if `is_cluster_above'.
136 do
137 if is_cluster_above then
138 if not is_faded then
139 fade_out
140 end
141 else
142 if is_faded then
143 fade_in
144 end
145 end
146 end
147
148 feature -- XML
149
150 id_string: STRING is "CLASS_FIGURE_ID"
151 -- ID string
152
153 group_id_string: STRING is "GROUP_ID"
154 -- Group id
155
156 xml_element (node: XM_ELEMENT): XM_ELEMENT is
157 -- XML element
158 do
159 Result := Precursor {EG_LINKABLE_FIGURE} (node)
160 Result.add_attribute (id_string, xml_namespace, model.es_class_id)
161 Result.add_attribute (group_id_string, xml_namespace, model.group_id)
162 end
163
164 set_with_xml_element (node: XM_ELEMENT) is
165 -- Retrive state from `node'.
166 do
167 -- Discard CLASS_FIGURE_ID and GROUP_ID, since they have been read in factory.
168 node.forth
169 node.forth
170 Precursor {EG_LINKABLE_FIGURE} (node)
171 end
172
173 feature {EG_FIGURE_WORLD} -- Element change
174
175 add_link (a_link: EG_LINK_FIGURE) is
176 -- Add `a_link' to `links'.
177 local
178 l_cluster: EG_CLUSTER_FIGURE
179 cs_link: EIFFEL_CLIENT_SUPPLIER_FIGURE
180 i_link: EIFFEL_INHERITANCE_FIGURE
181 c_fig: EG_LINKABLE_FIGURE
182 do
183 Precursor {EG_LINKABLE_FIGURE} (a_link)
184 if a_link.source /= Void and then a_link.target /= Void then
185 if a_link.source.cluster /= Void and then a_link.target.cluster /= Void then
186 if a_link.model.source.cluster = a_link.model.target.cluster then
187 l_cluster := a_link.source.cluster
188 elseif a_link.model.source.cluster.flat_linkables.has (a_link.model.target) then
189 l_cluster := a_link.source.cluster
190 elseif a_link.model.target.cluster.flat_linkables.has (a_link.model.source) then
191 l_cluster := a_link.target.cluster
192 end
193 if l_cluster /= Void then
194 l_cluster.go_i_th (l_cluster.number_of_figures)
195 cs_link ?= a_link
196 if cs_link /= Void or else l_cluster.index = l_cluster.count then
197 l_cluster.put_right (a_link)
198 else
199 from
200 until
201 i_link /= Void or else c_fig /= Void
202 loop
203 l_cluster.forth
204 i_link ?= l_cluster.item
205 c_fig ?= l_cluster.item
206 end
207 l_cluster.put_left (a_link)
208 end
209 end
210 end
211 end
212 end
213
214 feature {NONE} -- Implementation
215
216 on_needed_on_diagram_changed is
217 -- `model'.`is_needed_on_diagram' changed.
218 do
219 if model.is_needed_on_diagram then
220 show
221 enable_sensitive
222 else
223 hide
224 disable_sensitive
225 end
226 request_update
227 end
228
229 on_pebble_request: ANY is
230 -- A pebble was requested for `Current'.
231 local
232 class_list: ARRAYED_LIST [EIFFEL_CLASS_FIGURE]
233 cf: EIFFEL_CLASS_FIGURE
234 l_selected: LIST [EG_FIGURE]
235 do
236 if not workbench.is_compiling then
237 if world.selected_figures.count < 2 or else not world.selected_figures.has (Current) then
238 if model.is_compiled then
239 create {CLASSC_FIGURE_STONE} Result.make (Current)
240 else
241 create {CLASSI_FIGURE_STONE} Result.make (Current)
242 end
243 set_accept_cursor (Cursors.cur_Class)
244 set_deny_cursor (Cursors.cur_X_class)
245 else
246 l_selected := world.selected_figures
247 create class_list.make (l_selected.count)
248 from
249 l_selected.start
250 until
251 l_selected.after
252 loop
253 cf ?= l_selected.item
254 if cf /= Void then
255 class_list.extend (cf)
256 end
257 l_selected.forth
258 end
259 create {CLASS_FIGURE_LIST_STONE} Result.make_with_list (class_list)
260 set_accept_cursor (cursors.cur_class_list)
261 set_deny_cursor (cursors.cur_x_class_list)
262 end
263 end
264 end
265
266 on_pointer_double_pressed (ax, ay, button: INTEGER; x_tilt, y_tilt, pressure: DOUBLE; screen_x, screen_y: INTEGER) is
267 -- User double pressed on `Current'.
268 local
269 cg: ES_CLASS_GRAPH
270 old_center: EG_LINKABLE_FIGURE
271 old_es_center: ES_CLASS
272 fdl: EG_FORCE_DIRECTED_LAYOUT
273 ce: EB_DIAGRAM_TOOL
274 new_classes: LIST [ES_CLASS]
275 layout: EIFFEL_INHERITANCE_LAYOUT
276 do
277 if button = 1 then
278 ce := world.context_editor
279 cg := ce.class_graph
280 if cg /= Void then
281 old_es_center := cg.center_class
282 old_center ?= world.figure_from_model (old_es_center)
283 check
284 old_center_exists: old_center /= Void
285 end
286 old_center.set_is_fixed (False)
287 cg.set_new_center_class (model)
288
289 new_classes := cg.last_created_classes
290 cg.reset_last_created_classes
291
292 if ce.is_force_directed_used then
293 arrange_around (new_classes, port_x, port_y, 200)
294 fdl := ce.force_directed_layout
295 ce.restart_force_directed
296 fdl.set_center (port_x, port_y)
297 set_is_fixed (True)
298 if not world.context_editor.history.undo_list.is_empty then
299 world.context_editor.history.remove_last
300 end
301 world.context_editor.history.register_named_undoable (
302 interface_names.t_diagram_set_center_class + ": " + model.name,
303 [<<
304 agent old_center.set_is_fixed (False),
305 agent cg.set_new_center_class (model),
306 agent set_is_fixed (True),
307 agent fdl.set_center (port_x, port_y),
308 agent ce.restart_force_directed,
309 agent world.update_cluster_legend
310 >>],
311 [<<
312 agent set_is_fixed (False),
313 agent cg.set_new_center_class (old_es_center),
314 agent old_center.set_is_fixed (True),
315 agent fdl.set_center (old_center.port_x, old_center.port_y),
316 agent ce.restart_force_directed,
317 agent world.update_cluster_legend
318 >>])
319 else
320 create layout.make_with_world (world)
321 if world.is_uml then
322 layout.set_spacing ({EB_DIAGRAM_TOOL}.default_uml_horizontal_spacing, {EB_DIAGRAM_TOOL}.default_uml_vertical_spacing)
323 else
324 layout.set_spacing ({EB_DIAGRAM_TOOL}.default_bon_horizontal_spacing, {EB_DIAGRAM_TOOL}.default_bon_vertical_spacing)
325 end
326 layout.layout
327 if not world.context_editor.history.undo_list.is_empty then
328 world.context_editor.history.remove_last
329 end
330 world.context_editor.history.register_named_undoable (
331 interface_names.t_diagram_set_center_class + ": " + model.name,
332 [<<
333 agent cg.set_new_center_class (model),
334 agent layout.layout,
335 agent world.update_cluster_legend
336 >>],
337 [<<
338 agent cg.set_new_center_class (old_es_center),
339 agent layout.layout,
340 agent world.update_cluster_legend
341 >>])
342 end
343 world.update_cluster_legend
344 world.context_editor.develop_window.tools.set_stone (create {CLASSI_STONE}.make (model.class_i))
345 end
346 end
347 end
348
349 arrange_around (classes: LIST [ES_CLASS]; ax,ay: INTEGER; radius: INTEGER) is
350 -- Arrange classes on a circle with center at (`ax', `ay') and `radius'.
351 local
352 nb: INTEGER
353 l_angle, angle_inc: DOUBLE
354 cf: EIFFEL_CLASS_FIGURE
355 do
356 nb := classes.count
357 l_angle := 0.0
358 angle_inc := 2*pi / nb
359 from
360 classes.start
361 until
362 classes.after
363 loop
364 cf ?= world.figure_from_model (classes.item)
365 if cf /= Void then
366 cf.set_port_position (port_x + as_integer (cosine (l_angle) * radius), port_y + as_integer (sine (l_angle) * radius))
367 end
368 classes.forth
369 l_angle := l_angle + angle_inc
370 end
371 end
372
373 feature {NONE} -- Implementation (adding relations)
374
375 on_class_drop (a_stone: CLASSI_FIGURE_STONE) is
376 -- `a_stone' was dropped on `Current'.
377 local
378 dial: EV_CONFIRMATION_DIALOG
379 class_file: PLAIN_TEXT_FILE
380 l_error_window: EV_WARNING_DIALOG
381 do
382 create class_file.make (a_stone.class_i.file_name)
383 if not class_file.exists then
384 create l_error_window.make_with_text ("Class is not editable.%N" +
385 warning_messages.w_file_not_exist (a_stone.class_i.file_name))
386 l_error_window.show_modal_to_window (world.context_editor.develop_window.window)
387 elseif class_file.is_writable and then not a_stone.class_i.group.is_readonly then
388 if world.context_editor.is_link_inheritance then
389 if drop_allowed (a_stone) then
390 add_inheritance_relation (a_stone.source)
391 else
392 create dial.make_with_text_and_actions (
393 "An inheritance cycle was created.%N%
394 %Do you still want to add this link?",
395 <<agent add_inheritance_relation (a_stone.source)>>)
396 dial.show_modal_to_window (world.context_editor.develop_window.window)
397 end
398 elseif world.context_editor.is_link_client then
399 add_client_relation (a_stone.source, False)
400 elseif world.context_editor.is_link_aggregate then
401 add_client_relation (a_stone.source, True)
402 end
403 else
404 create l_error_window.make_with_text ("Class is not editable")
405 l_error_window.show_modal_to_window (world.context_editor.develop_window.window)
406 end
407 end
408
409 add_inheritance_relation (other: EIFFEL_CLASS_FIGURE) is
410 -- Add `Current' to others inheritance clause.
411 local
412 es_link: ES_INHERITANCE_LINK
413 other_model: ES_CLASS
414 do
415 if world.model.has_node (other.model) then
416 other_model := other.model
417 other_model.code_generator.add_ancestor (model.class_i.name_in_upper)
418 if not other_model.code_generator.class_modified_outside_diagram then
419 es_link ?= model.graph.inheritance_link_connecting (other_model, model)
420 if es_link = Void then
421 create es_link.make_with_classes (other_model, model)
422 model.graph.add_link (es_link)
423 elseif not es_link.is_needed_on_diagram then
424 es_link.enable_needed_on_diagram
425 end
426 world.context_editor.history.register_named_undoable (
427 interface_names.t_diagram_add_inh_link_cmd (es_link.ancestor.name, es_link.descendant.name),
428 agent add_ancestor (other_model, es_link),
429 agent remove_ancestor (other_model, es_link))
430 end
431 end
432 end
433
434 add_ancestor (an_other: like model; a_link: ES_INHERITANCE_LINK) is
435 -- Add `Current' to `an_other's inheritance clause, show `a_link' if succesfull.
436 do
437 an_other.code_generator.add_ancestor (model.class_i.name_in_upper)
438 if not an_other.code_generator.class_modified_outside_diagram then
439 a_link.enable_needed_on_diagram
440 end
441 end
442
443 remove_ancestor (an_other: like model; a_link: ES_INHERITANCE_LINK) is
444 -- Remove `Current' from `an_other's inheritance clause, hide `a_link' if succesfull.
445 do
446 an_other.code_generator.remove_ancestor (model.class_i.name_in_upper)
447 if not an_other.code_generator.class_modified_outside_diagram then
448 a_link.disable_needed_on_diagram
449 end
450 end
451
452 add_client_relation (client: EIFFEL_CLASS_FIGURE; is_aggregated: BOOLEAN) is
453 -- Add relation with `Current' as supplier and `client' as client
454 -- expanded if `is_aggregated'.
455 require
456 client_not_void: client /= Void
457 local
458 screen: EB_STUDIO_SCREEN
459 x_pos, y_pos, screen_w, screen_h: INTEGER
460 cg: CLASS_TEXT_MODIFIER
461 added_code: LIST [TUPLE [STRING, INTEGER]]
462 es_link: ES_CLIENT_SUPPLIER_LINK
463 last_query: FEATURE_AS
464 client_model: ES_CLASS
465 do
466 if world.model.has_node (client.model) then
467 -- Call wizard.
468 create screen
469 screen_w := screen.virtual_right
470 screen_h := screen.virtual_bottom
471 x_pos := client.port_x + world.context_editor.widget.screen_x
472 y_pos := client.port_y + world.context_editor.widget.screen_y
473 client_model := client.model
474 cg := client_model.code_generator
475 if not is_aggregated then
476 cg.new_query_from_diagram (model.name, x_pos, y_pos, screen_w, screen_h)
477 else
478 cg.new_aggregate_query_from_diagram (model.name, x_pos, y_pos, screen_w, screen_h)
479 end
480 -- Reflect new added code in diagram if any is added.
481 if cg.extend_from_diagram_successful then
482 last_query := cg.last_feature_as
483 client_model.add_query (last_query)
484
485 added_code := cg.last_added_code.twin
486
487 es_link ?= model.graph.client_supplier_link_connecting (client_model, model)
488
489 if es_link = Void or else not es_link.is_needed_on_diagram then
490 if es_link = Void then
491 create es_link.make (client_model, model)
492 model.graph.add_link (es_link)
493 else
494 es_link.enable_needed_on_diagram
495 es_link.synchronize
496 end
497
498 world.context_editor.history.register_named_undoable (
499 interface_names.t_diagram_add_cs_link_cmd (es_link.client.name, es_link.supplier.name),
500 agent reinclude_removed_feature_and_link (client_model, added_code, last_query, es_link),
501 agent remove_added_feature_and_link (client_model, added_code, last_query, es_link))
502 else
503
504 es_link.synchronize
505 world.context_editor.history.register_named_undoable (
506 interface_names.t_diagram_add_cs_link_cmd (es_link.client.name, es_link.supplier.name),
507 agent reinclude_removed_feature_and_link (client_model, added_code, last_query, es_link),
508 agent remove_added_feature (client_model, added_code, last_query, es_link))
509 end
510 end
511 end
512 end
513
514 reinclude_removed_feature_and_link (a_client: ES_CLASS; added_code: LIST [TUPLE [STRING, INTEGER]]; added_feature: FEATURE_AS; a_link: ES_CLIENT_SUPPLIER_LINK) is
515 --
516 do
517 a_client.code_generator.undelete_code (added_code)
518 if not a_client.code_generator.class_modified_outside_diagram then
519 a_client.add_query (added_feature)
520 a_link.enable_needed_on_diagram
521 a_link.synchronize
522 end
523 end
524
525 remove_added_feature_and_link (a_client: ES_CLASS; added_code: LIST [TUPLE [STRING, INTEGER]]; added_feature: FEATURE_AS; a_link: ES_CLIENT_SUPPLIER_LINK) is
526 --
527 do
528 a_client.code_generator.delete_code (added_code)
529 if not a_client.code_generator.class_modified_outside_diagram then
530 a_client.remove_query (added_feature)
531 a_link.disable_needed_on_diagram
532 end
533 end
534
535 remove_added_feature (a_client: ES_CLASS; added_code: LIST [TUPLE [STRING, INTEGER]]; added_feature: FEATURE_AS; a_link: ES_CLIENT_SUPPLIER_LINK) is
536 --
537 do
538 a_client.code_generator.delete_code (added_code)
539 if not a_client.code_generator.class_modified_outside_diagram then
540 a_client.remove_query (added_feature)
541 a_link.synchronize
542 end
543 end
544
545 drop_allowed (a_stone: CLASSI_FIGURE_STONE): BOOLEAN is
546 -- Is `a_stone' droppable on `Current'?
547 local
548 new_child: CLASS_I
549 do
550 if world.context_editor.is_link_inheritance then
551 new_child := a_stone.class_i
552 if new_child.compiled and model.class_i.compiled then
553 Result := not model.class_i.compiled_class.conform_to (new_child.compiled_class)
554 else
555 Result := not model.class_i.name.is_equal ("ANY")
556 end
557 else
558 Result := True
559 end
560 end
561
562 feature {NONE} -- Implementation (move)
563
564 veto_function (a_any: ANY): BOOLEAN is
565 -- Veto function
566 require
567 a_any_not_void: a_any /= Void
568 local
569 l_class_fig_stone: CLASSI_FIGURE_STONE
570 l_world: EIFFEL_CLUSTER_DIAGRAM
571 do
572 if not model.class_i.is_read_only then
573 l_class_fig_stone ?= a_any
574 if l_class_fig_stone /= Void then
575 Result := True
576 l_world ?= world
577 if l_world /= Void then
578 if l_class_fig_stone.source = Current or else
579 not l_world.classes_in_same_scope (l_class_fig_stone.source.model, model)
580 then
581 Result := False
582 end
583 end
584 end
585 end
586 end
587
588 save_position is
589 -- Make a backup of current coordinates.
590 do
591 saved_x := port_x
592 saved_y := port_y
593 end
594
595 saved_x, saved_y: INTEGER
596 -- Saved positions.
597
598 extend_history is
599 -- Register move in the history.
600 local
601 offset_x, offset_y: INTEGER
602 l_selected_figures: LIST [EG_FIGURE]
603 do
604 l_selected_figures := world.selected_figures.twin
605 offset_x := port_x - saved_x
606 offset_y := port_y - saved_y
607 world.context_editor.history.register_named_undoable (
608 interface_names.t_diagram_move_class_cmd (model.name),
609 agent move_figures_for (l_selected_figures, offset_x, offset_y),
610 agent move_figures_for (l_selected_figures, -offset_x, -offset_y))
611 if world.context_editor.is_force_directed_used then
612 set_is_fixed (True)
613 end
614 end
615
616 move_figures_for (figures: LIST [EG_FIGURE]; ax, ay: INTEGER) is
617 -- Move all figures in `figures' for `ax', `ay'.
618 require
619 figures_not_void: figures /= Void
620 local
621 l_item: EG_FIGURE
622 l_linkable: EG_LINKABLE_FIGURE
623 l_class: EIFFEL_CLASS_FIGURE
624 do
625 from
626 figures.start
627 until
628 figures.after
629 loop
630 l_item := figures.item
631 l_item.set_point_position (l_item.point_x + ax, l_item.point_y + ay)
632 l_linkable ?= l_item
633 if l_linkable /= Void then
634 l_linkable.set_is_fixed (True)
635 end
636 l_class ?= l_item
637 figures.forth
638 end
639 if world.is_right_angles then
640 world.apply_right_angles
641 end
642 world.context_editor.restart_force_directed
643 end
644
645 on_move (ax, ay: INTEGER; x_tilt, y_tilt, pressure: DOUBLE; screen_x, screen_y: INTEGER) is
646 do
647 if world.context_editor.is_force_directed_used then
648 -- FIXME: The timer event should be fired even when `Current' is moved.
649 world.context_editor.on_time_out
650 end
651 world.context_editor.restart_force_directed
652 if
653 world.context_editor.class_graph /= Void and then
654 model = world.context_editor.class_graph.center_class
655 then
656 world.context_editor.force_directed_layout.set_center (port_x, port_y)
657 end
658 end
659
660 on_handle_start is
661 -- User started to move `Current'.
662 do
663 was_fixed := is_fixed
664 if world.context_editor.is_force_directed_used then
665 set_is_fixed (True)
666 end
667 end
668
669 on_handle_end is
670 -- User ended to move `Current'.
671 do
672 set_is_fixed (was_fixed)
673 end
674
675 faded_color (a_color: EV_COLOR): EV_COLOR is
676 -- Return brighter color then `a_color'
677 require
678 a_color_exists: a_color /= Void
679 do
680 create Result.make_with_rgb ((a_color.red - (a_color.red / 2)).max (0.0),
681 (a_color.green - (a_color.green / 2)).max (0.0),
682 (a_color.blue - (a_color.blue / 2)).max (0.0))
683 ensure
684 Result_exists: Result /= Void
685 end
686
687 indexing
688 copyright: "Copyright (c) 1984-2006, Eiffel Software"
689 license: "GPL version 2 (see http://www.eiffel.com/licensing/gpl.txt)"
690 licensing_options: "http://www.eiffel.com/licensing"
691 copying: "[
692 This file is part of Eiffel Software's Eiffel Development Environment.
693
694 Eiffel Software's Eiffel Development Environment is free
695 software; you can redistribute it and/or modify it under
696 the terms of the GNU General Public License as published
697 by the Free Software Foundation, version 2 of the License
698 (available at the URL listed under "license" above).
699
700 Eiffel Software's Eiffel Development Environment is
701 distributed in the hope that it will be useful, but
702 WITHOUT ANY WARRANTY; without even the implied warranty
703 of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
704 See the GNU General Public License for more details.
705
706 You should have received a copy of the GNU General Public
707 License along with Eiffel Software's Eiffel Development
708 Environment; if not, write to the Free Software Foundation,
709 Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
710 ]"
711 source: "[
712 Eiffel Software
713 356 Storke Road, Goleta, CA 93117 USA
714 Telephone 805-685-1006, Fax 805-685-6869
715 Website http://www.eiffel.com
716 Customer support http://support.eiffel.com
717 ]"
718
719 end -- class EIFFEL_CLASS_FIGURE

Properties

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

  ViewVC Help
Powered by ViewVC 1.1.23