/[eiffelstudio]/branches/Eiffel_57_docking/Src/Eiffel/interface/new_graphical/dialogs/eb_create_class_dialog.e
ViewVC logotype

Contents of /branches/Eiffel_57_docking/Src/Eiffel/interface/new_graphical/dialogs/eb_create_class_dialog.e

Parent Directory Parent Directory | Revision Log Revision Log


Revision 61872 - (show annotations)
Sun Jul 30 05:46:23 2006 UTC (13 years, 4 months ago) by manus
File size: 22629 byte(s)
EiffelStudio docking branch. It only contains modified classes needed to get the docking version of EiffelStudio.
1 indexing
2 description : "Dialog for choosing where to put a new class"
3 legal: "See notice at end of class."
4 status: "See notice at end of class."
5 date : "$Date$"
6 revision : "$Revision$"
7
8 class
9 EB_CREATE_CLASS_DIALOG
10
11 inherit
12 EB_DIALOG
13
14 EB_CONSTANTS
15 export
16 {NONE} all
17 undefine
18 default_create, copy
19 end
20
21 SHARED_EIFFEL_PROJECT
22 export
23 {NONE} all
24 undefine
25 default_create, copy
26 end
27
28 EB_SHARED_WINDOW_MANAGER
29 export
30 {NONE} all
31 undefine
32 default_create, copy
33 end
34
35 EIFFEL_ENV
36 export
37 {NONE} all
38 undefine
39 default_create, copy
40 end
41
42 EB_VISION2_FACILITIES
43 export
44 {NONE} all
45 undefine
46 default_create, copy
47 end
48
49 EB_CLUSTER_MANAGER_OBSERVER
50 export
51 {NONE} all
52 undefine
53 default_create, copy
54 end
55
56 EV_KEY_CONSTANTS
57 export
58 {NONE} all
59 undefine
60 default_create, copy
61 end
62
63 EV_DIALOG_CONSTANTS
64 export
65 {NONE} all
66 undefine
67 default_create, copy
68 end
69
70 EB_SHARED_PREFERENCES
71 export
72 {NONE} all
73 undefine
74 default_create, copy
75 end
76
77 EB_CONSTANTS
78 export
79 {NONE} all
80 undefine
81 default_create, copy
82 end
83
84 CONF_REFACTORING
85 undefine
86 default_create, copy
87 end
88
89 create
90 make_default
91
92 feature {NONE} -- Initialization
93
94 make_default (a_target: EB_HISTORY_OWNER) is
95 require
96 a_target_not_void: a_target /= Void
97 local
98 vb: EV_VERTICAL_BOX
99 buttons_box: EV_HORIZONTAL_BOX
100 identification_frame, properties_frame, parents_frame: EV_FRAME
101 cluster_label, name_label, file_label, creation_label: EV_LABEL
102 cancel_b: EV_BUTTON -- Button to discard the class
103 bbox: EV_HORIZONTAL_BOX
104 l_cell: EV_CELL
105 sz: INTEGER
106 do
107 target := a_target
108
109 make_with_title (Interface_names.t_new_class)
110 set_icon_pixmap (pixmaps.icon_pixmaps.new_class_icon)
111 set_height (Layout_constants.dialog_unit_to_pixels (400).min ((create {EV_SCREEN}).height))
112 set_width (Layout_constants.dialog_unit_to_pixels (300).min ((create {EV_SCREEN}).width))
113
114 -- Build the widgets
115 create class_entry
116 class_entry.change_actions.extend (agent update_file_entry)
117 create file_entry
118 create creation_entry
119 create cluster_list.make_without_targets
120 cluster_list.set_minimum_size (Cluster_list_minimum_width, Cluster_list_minimum_height)
121 cluster_list.refresh
122 create deferred_check.make_with_text (Interface_names.L_deferred)
123 deferred_check.select_actions.extend (agent on_deferred)
124 create expanded_check.make_with_text (Interface_names.L_expanded)
125 expanded_check.select_actions.extend (agent on_expanded)
126 create empty_check.make_with_text (Interface_names.L_not_empty)
127 empty_check.enable_select
128 create creation_check.make_with_text (Interface_names.l_generate_creation)
129 creation_check.select_actions.extend (agent on_creation_check)
130 create parents_list.make (agent compute_group)
131 parents_list.text_field.focus_in_actions.extend (agent on_focus_in)
132 parents_list.text_field.focus_out_actions.extend (agent on_focus_out)
133
134 -- Build the frames
135 create properties_frame.make_with_text (Interface_names.l_general)
136 create identification_frame.make_with_text (Interface_names.l_identification)
137 create name_label.make_with_text (Interface_names.l_class_name)
138 name_label.align_text_left
139 create cluster_label.make_with_text (Interface_names.l_cluster)
140 cluster_label.align_text_left
141 create file_label.make_with_text (Interface_names.l_file_name)
142 file_label.align_text_left
143 create vb
144 sz := name_label.width.max (file_label.width)
145 name_label.set_minimum_width (sz)
146 file_label.set_minimum_width (sz)
147 create bbox
148 extend_no_expand (bbox, name_label)
149 bbox.extend (class_entry)
150 extend_no_expand (vb, bbox)
151 create bbox
152 extend_no_expand (bbox, file_label)
153 bbox.extend (file_entry)
154 extend_no_expand (vb, bbox)
155 extend_no_expand (vb, cluster_label)
156 vb.extend (cluster_list)
157 vb.set_border_width (Layout_constants.Small_border_size)
158 identification_frame.extend (vb)
159
160 create vb
161 create bbox
162 bbox.enable_homogeneous
163 bbox.extend (deferred_check)
164 bbox.extend (expanded_check)
165 extend_no_expand (vb, bbox)
166 create creation_label.make_with_text (Interface_names.l_creation)
167 creation_label.align_text_left
168 extend_no_expand (vb, creation_check)
169 create bbox
170 create l_cell
171 l_cell.set_minimum_width (22)
172 extend_no_expand (bbox, l_cell)
173 extend_no_expand (bbox, creation_label)
174 bbox.extend (creation_entry)
175 bbox.disable_sensitive
176 extend_no_expand (vb, bbox)
177 extend_no_expand (vb, empty_check)
178 vb.set_border_width (Layout_constants.Small_border_size)
179 properties_frame.extend (vb)
180
181 create parents_frame.make_with_text (Interface_names.l_parents)
182 create vb
183 vb.extend (parents_list)
184 vb.set_border_width (Layout_constants.Small_border_size)
185 parents_frame.extend (vb)
186
187 -- Build the buttons
188 create create_button.make_with_text_and_action (Interface_names.b_create, agent create_new_class)
189 Layout_constants.set_default_size_for_button (create_button)
190 create cancel_b.make_with_text_and_action (Interface_names.b_cancel, agent cancel)
191 Layout_constants.set_default_size_for_button (cancel_b)
192
193 -- Build the button box
194 create buttons_box
195 buttons_box.set_padding (Layout_constants.Small_border_size)
196 buttons_box.extend (create {EV_CELL}) -- Expandable item
197 extend_no_expand (buttons_box, create_button)
198 extend_no_expand (buttons_box, cancel_b)
199
200 -- Build the vertical layout
201 create vb
202 vb.set_padding (Layout_constants.Small_border_size)
203 vb.set_border_width (Layout_constants.Small_border_size)
204 vb.extend (identification_frame)
205 vb.extend (properties_frame)
206 vb.extend (parents_frame)
207 extend_no_expand (vb, buttons_box)
208
209 -- Add the main container to the dialog.
210 extend (vb)
211
212 -- Setup the default buttons and show actions.
213 set_default_cancel_button (cancel_b)
214 set_default_push_button (create_button)
215 show_actions.extend (agent on_show_actions)
216
217 cancelled := False
218 cluster_preset := False
219 ensure
220 target_set: target = a_target
221 end
222
223 feature -- Status Report
224
225 cancelled: BOOLEAN
226 -- Was `Current' closed by discarding the dialog
227 -- (by clicking the Cancel button for example)?
228
229 class_i: CLASS_I
230 -- Created class
231
232 cluster: CONF_CLUSTER
233 -- Selected cluster
234
235 path: STRING
236 -- Selected subfolder path
237
238 is_deferred: BOOLEAN
239 -- Is new class deferred?
240
241 feature -- Status Settings
242
243 set_stone_when_finished is
244 -- `Current' will send a stone when its execution is over.
245 do
246 set_stone := True
247 end
248
249 preset_cluster (a_cluster: CONF_CLUSTER) is
250 -- Assign `a_cluster' to `cluster'.
251 require
252 a_cluster_not_void: a_cluster /= Void
253 do
254 cluster := a_cluster
255 path := ""
256 cluster_preset := True
257 ensure
258 cluster_set: cluster = a_cluster
259 cluster_preset_enabled: cluster_preset
260 end
261
262 feature -- Basic operations
263
264 call_default is
265 -- Create a new dialog with a pre-computed class name.
266 do
267 call ("NEW_CLASS_" + new_class_counter.item.out)
268 new_class_counter.put (new_class_counter.item + 1)
269 end
270
271 call (class_n: STRING) is
272 -- Create a new dialog with `class_n' as preset class name.
273 require
274 valid_args: class_n /= Void
275 local
276 str: STRING
277 do
278 if not cluster_preset then
279 if target.stone /= Void then
280 cluster_list.show_stone (target.stone)
281 end
282 else
283 cluster_list.show_subfolder (cluster, path)
284 end
285 str := class_n.as_upper
286 class_entry.set_text (str)
287 if cluster /= Void then
288 cluster_list.show_subfolder (cluster, path)
289 end
290 show_modal_to_window (target.window)
291 end
292
293 feature {NONE} -- Access
294
295 change_cluster is
296 -- Set `cluster' to selected cluster from tree.
297 local
298 l_folder: EB_CLASSES_TREE_FOLDER_ITEM
299 clu: EB_SORTED_CLUSTER
300 wd: EV_WARNING_DIALOG
301 do
302 if cluster_list.selected_item /= Void then
303 l_folder ?= cluster_list.selected_item
304 if l_folder /= Void then
305 clu := l_folder.data
306 else
307 l_folder ?= cluster_list.selected_item.parent
308 if l_folder /= Void then
309 clu := l_folder.data
310 end
311 end
312 if clu = Void or else not clu.is_cluster then
313 aok := False
314 create wd.make_with_text (Warning_messages.w_unknown_cluster_name)
315 wd.show_modal_to_window (Current)
316 else
317 aok := True
318 cluster := clu.actual_cluster
319 path := l_folder.path
320 end
321 else
322 aok := False
323 create wd.make_with_text (warning_messages.w_no_cluster_selected_for_class_creation)
324 wd.show_modal_to_window (Current)
325 end
326 end
327
328 feature {NONE} -- Implementation
329
330 class_name: STRING is
331 -- Name of the class entered by the user.
332 do
333 Result := class_entry.text.as_upper
334 ensure
335 class_name_not_void: class_name /= Void
336 end
337
338 file_name: FILE_NAME is
339 -- File name of the class chosen by the user.
340 local
341 str: STRING
342 dotpos: INTEGER
343 do
344 str := file_entry.text
345 str.right_adjust
346 str.left_adjust
347 -- str.count < 3 means there no extension to the file name.
348 if str.is_empty or else str.count < 3 then
349 update_file_entry
350 create Result.make_from_string (file_entry.text)
351 else
352 if
353 str @ (str.count) /= 'e' or else
354 str @ (str.count - 1) /= '.'
355 then
356 dotpos := str.index_of ('.', 1) - 1
357 str.keep_head (dotpos.max (0))
358 create Result.make_from_string (str)
359 Result.add_extension ("e")
360 else
361 create Result.make_from_string (str)
362 end
363 end
364 end
365
366 aok: BOOLEAN
367
368 could_not_load_file: BOOLEAN
369 -- Was there an error when attempting to create the class file?
370
371 cluster_preset: BOOLEAN
372 -- Was a target cluster set by `preset_cluster'?
373
374 set_stone: BOOLEAN
375 -- Should `Current' send a stone when its execution is over?
376
377 target: EB_HISTORY_OWNER
378 -- Associated target.
379
380 create_new_class is
381 -- Create a new class
382 local
383 f_name: FILE_NAME
384 file: RAW_FILE -- Windows specific
385 base_name: STRING
386 wd: EV_WARNING_DIALOG
387 retried: BOOLEAN
388 do
389 if not retried then
390 aok := False
391 change_cluster
392 if aok then
393 check_valid_class_name
394 end
395 if aok then
396 check_class_not_exists
397 end
398 if aok and then creation_check.is_selected then
399 check_valid_creation_procedure
400 end
401 if aok then
402 create f_name.make_from_string (cluster.location.build_path (path, ""))
403 f_name.set_file_name (file_name)
404 base_name := file_name
405 create file.make (f_name)
406 if file.exists then
407 create wd.make_with_text (Warning_messages.w_class_already_in_cluster (base_name))
408 wd.show_modal_to_window (Current)
409 class_entry.set_focus
410 elseif not file.is_creatable then
411 create wd.make_with_text (Warning_messages.w_cannot_create_file (f_name))
412 wd.show_modal_to_window (target.window)
413 else
414 destroy
415 load_default_class_text (file)
416 if not could_not_load_file then
417 manager.add_class_to_cluster (base_name, cluster, path)
418 class_i := manager.last_added_class
419 if set_stone and class_i /= Void then
420 target.advanced_set_stone (create {CLASSI_STONE}.make (class_i))
421 end
422 end
423 end
424 end
425 else
426 -- We were rescued.
427 class_entry.remove_text
428 file_entry.remove_text
429 class_entry.set_focus
430 end
431 rescue
432 retried := True
433 retry
434 end
435
436 load_default_class_text (output: RAW_FILE) is
437 -- Loads the default class text.
438 local
439 input: RAW_FILE
440 in_buf: STRING
441 cr: STRING
442 wd: EV_WARNING_DIALOG
443 retried: BOOLEAN
444 writing: BOOLEAN
445 clf: FILE_NAME
446 inheritance: STRING
447 par: STRING
448 pcnt: INTEGER
449 last: BOOLEAN
450 tmp: STRING
451 do
452 if not retried then
453 clf := Templates_path.twin
454 if not empty_check.is_selected then
455 clf.set_file_name ("empty")
456 else
457 clf.set_file_name ("full")
458 end
459 clf.add_extension ("cls")
460 create input.make (clf)
461 if input.exists and then input.is_readable then
462 input.open_read
463 input.read_stream (input.count)
464 in_buf := input.last_string
465 in_buf.replace_substring_all ("$classname", class_name)
466 if deferred_check.is_selected then
467 in_buf.replace_substring_all ("$class_type", "deferred ")
468 elseif expanded_check.is_selected then
469 in_buf.replace_substring_all ("$class_type", "expanded ")
470 else
471 in_buf.replace_substring_all ("$class_type", "")
472 end
473 pcnt := parents_list.count
474 if pcnt > 0 then
475 --| Ten characters for "inherit%N",
476 --| 15 for each line for each parent.
477 create inheritance.make (10 + 15 * pcnt)
478 from
479 inheritance.append ("inherit%N")
480 parents_list.list.start
481 last := parents_list.list.after
482 until
483 parents_list.list.after
484 loop
485 par := parents_list.list.item.text
486 par.to_upper
487 inheritance.append_character ('%T')
488 inheritance.append (par)
489 inheritance.append_character ('%N')
490 inheritance.append_character ('%N')
491 parents_list.list.forth
492 end
493 in_buf.replace_substring_all ("$inheritance_clause", inheritance)
494 else
495 in_buf.replace_substring_all ("$inheritance_clause", "")
496 end
497 cr := creation_entry.text
498 if not deferred_check.is_selected and then not cr.is_empty then
499 if expanded_check.is_selected and not cr.is_equal ("default_create") then
500 in_buf.replace_substring_all ("$creation_clause", "create%N%T" + cr + ", default_create%N%N")
501 else
502 in_buf.replace_substring_all ("$creation_clause", "create%N%T" + cr + "%N%N")
503 end
504 else
505 in_buf.replace_substring_all ("$creation_clause", "")
506 end
507 if not deferred_check.is_selected and then creation_check.is_selected then
508 tmp := "feature {NONE} -- Initialization%N%N%T$cr_name is%N%T%T%T-- Initialize `Current'.%N%
509 %%T%Tdo%N%T%T%T%N%T%Tend%N%N"
510 if cr.is_empty then
511 tmp.replace_substring_all ("$cr_name", "default_create")
512 else
513 tmp.replace_substring_all ("$cr_name", cr)
514 end
515 in_buf.replace_substring_all ("$initialization_clause", tmp)
516 else
517 in_buf.replace_substring_all ("$initialization_clause", "")
518 end
519 --| In case we crash later, to know where we were.
520 writing := True
521 output.open_write
522 if not in_buf.is_empty then
523 in_buf.prune_all ('%R')
524 if preferences.misc_data.text_mode_is_windows then
525 in_buf.replace_substring_all ("%N", "%R%N")
526 output.put_string (in_buf)
527 else
528 output.put_string (in_buf)
529 if in_buf.item (in_buf.count) /= '%N' then
530 -- Add a carriage return like `vi' if there's none at the end
531 output.put_new_line
532 end
533 end
534 end
535 output.close
536 could_not_load_file := False
537 else
538 create wd.make_with_text (Warning_messages.w_cannot_read_file (input.name))
539 wd.show_modal_to_window (target.window)
540 could_not_load_file := True
541 end
542 else
543 if not writing then
544 create wd.make_with_text (Warning_messages.w_cannot_read_file (input.name))
545 else
546 create wd.make_with_text (Warning_messages.w_cannot_create_file (output.name))
547 end
548 wd.show_modal_to_window (target.window)
549 end
550 rescue
551 retried := True
552 retry
553 end
554
555 on_show_actions is
556 -- The dialog has just been shown, set it up.
557 local
558 curr_selected_item: EV_TREE_NODE
559 do
560 --| Make sure the currently selected item is visible
561 curr_selected_item := cluster_list.selected_item
562 if curr_selected_item /= Void then
563 cluster_list.ensure_item_visible (curr_selected_item)
564 end
565
566 --| Make sure the text in the class entry is entirely visible
567 --| and is selected.
568 class_entry.set_focus
569 class_entry.set_caret_position (1)
570 class_entry.select_all
571 end
572
573 check_class_not_exists is
574 -- Check that class with name `class_name' does not exist in the universe.
575 require
576 current_state_is_valid: aok
577 local
578 wd: EV_WARNING_DIALOG
579 do
580 if cluster.classes.has (class_name) then
581 aok := False
582 create wd.make_with_text (Warning_messages.w_class_already_exists (class_name))
583 wd.show_modal_to_window (Current)
584 end
585 end
586
587 check_valid_class_name is
588 -- Check that name `class_name' is a valid class name.
589 require
590 current_state_is_valid: aok
591 local
592 cn: STRING
593 wd: EV_WARNING_DIALOG
594 do
595 cn := class_name
596 aok := (create {IDENTIFIER_CHECKER}).is_valid (cn)
597 if not aok then
598 create wd.make_with_text (Warning_messages.w_invalid_class_name (cn))
599 wd.show_modal_to_window (Current)
600 end
601 end
602
603 check_valid_creation_procedure is
604 -- Check that creation procedure name is valid
605 require
606 current_state_is_valid: aok
607 creation_check_selected: creation_check.is_selected
608 local
609 fn: STRING
610 wd: EV_WARNING_DIALOG
611 do
612 fn := creation_entry.text
613 aok := (create {IDENTIFIER_CHECKER}).is_valid (fn)
614 if not aok then
615 create wd.make_with_text (Warning_messages.w_invalid_feature_name (fn))
616 wd.show_modal_to_window (Current)
617 end
618 end
619
620 update_file_entry is
621 -- Update the file name according to the class name.
622 local
623 str: STRING
624 do
625 str := class_entry.text
626 str.right_adjust
627 str.left_adjust
628 if str.is_empty then
629 file_entry.remove_text
630 else
631 str.to_lower
632 str.append (".e")
633 file_entry.set_text (str)
634 end
635 end
636
637 cancel is
638 -- User pressed `cancel_b'.
639 do
640 cancelled := True
641 destroy
642 ensure
643 cancelled_set: cancelled
644 end
645
646 on_deferred is
647 -- User selected deferred => uncheck expanded.
648 do
649 if deferred_check.is_selected then
650 expanded_check.disable_select
651 creation_check.disable_sensitive
652 if creation_check.is_selected then
653 creation_entry.parent.disable_sensitive
654 end
655 creation_check.disable_select
656 is_deferred := True
657 else
658 creation_check.enable_sensitive
659 if creation_check.is_selected then
660 creation_entry.parent.enable_sensitive
661 end
662 is_deferred := False
663 end
664 end
665
666 on_creation_check is
667 -- User selected or unselected the `creation procedure' check box.
668 do
669 if creation_check.is_selected then
670 creation_entry.parent.enable_sensitive
671 else
672 creation_entry.parent.disable_sensitive
673 end
674 end
675
676 on_expanded is
677 -- User selected expanded => uncheck deferred.
678 do
679 if expanded_check.is_selected then
680 deferred_check.disable_select
681 end
682 end
683
684 on_focus_in is
685 -- When the parents list has the focus, we disable the default push button.
686 do
687 if default_push_button /= Void then
688 remove_default_push_button
689 end
690 end
691
692 on_focus_out is
693 -- When the parents list loses the focus, we enable the default push button.
694 do
695 -- Need to check that the dialog is not destroyed as sometimes
696 -- we get called while destroying the dialog.
697 if not is_destroyed then
698 set_default_push_button (create_button)
699 end
700 end
701
702 compute_group: CONF_GROUP is
703 -- Compute group.
704 do
705 change_cluster
706 Result := cluster
707 end
708
709 feature {NONE} -- Vision2 widgets
710
711 create_button: EV_BUTTON
712 -- Button to create the class
713
714 cluster_list: EB_CLASSES_TREE
715 -- List of all available clusters.
716
717 class_entry: EV_TEXT_FIELD
718 -- Text field in which the user will type the name of the class
719
720 file_entry: EV_TEXT_FIELD
721 -- Text field in which the user may type the file name of the class.
722
723 creation_entry: EV_TEXT_FIELD
724 -- Text field in which the user may type the (main) creation procedure of the class.
725
726 parents_list: EB_ADD_REMOVE_CLASS_LIST
727 -- List in which the user enters the class parents.
728
729 deferred_check: EV_CHECK_BUTTON
730 -- Check box which defines whether the class is deferred.
731
732 expanded_check: EV_CHECK_BUTTON
733 -- Check box which defines whether the class is expanded.
734
735 empty_check: EV_CHECK_BUTTON
736 -- Check box which defines whether the class is a dummy class (few features).
737
738 creation_check: EV_CHECK_BUTTON
739 -- Check box which defines whether we should define a creation feature.
740
741 feature {NONE} -- Constants
742
743 Cluster_list_minimum_width: INTEGER is
744 -- Minimum width for the cluster list.
745 do
746 Result := Layout_constants.Dialog_unit_to_pixels (250)
747 end
748
749 Cluster_list_minimum_height: INTEGER is
750 -- Minimum height for the cluster list.
751 do
752 Result := Layout_constants.Dialog_unit_to_pixels (100)
753 end
754
755 new_class_counter: CELL [INTEGER] is
756 -- Number of classes being created so far
757 once
758 create Result.put (1)
759 ensure
760 new_class_counter_not_void: new_class_counter /= Void
761 end
762
763 invariant
764 create_button_valid: create_button /= Void and then not create_button.is_destroyed
765 cluster_list_valid: cluster_list /= Void and then not cluster_list.is_destroyed
766 class_entry_valid: class_entry /= Void and then not class_entry.is_destroyed
767 file_entry_valid: file_entry /= Void and then not file_entry.is_destroyed
768 parents_list_valid: parents_list /= Void and then not parents_list.is_destroyed
769 expanded_check_valid: expanded_check /= Void and then not expanded_check.is_destroyed
770 empty_check_valid: empty_check /= Void and then not empty_check.is_destroyed
771 deferred_check_valid: deferred_check /= Void and then not deferred_check.is_destroyed
772 creation_check_valid: creation_check /= Void and then not creation_check.is_destroyed
773 creation_entry_valid: creation_entry /= Void and then not creation_entry.is_destroyed
774 creation_entry_parented: creation_entry.parent /= Void
775 target_not_void: target /= Void
776 cluster_implies_path: cluster /= Void implies path /= Void
777
778 indexing
779 copyright: "Copyright (c) 1984-2006, Eiffel Software"
780 license: "GPL version 2 (see http://www.eiffel.com/licensing/gpl.txt)"
781 licensing_options: "http://www.eiffel.com/licensing"
782 copying: "[
783 This file is part of Eiffel Software's Eiffel Development Environment.
784
785 Eiffel Software's Eiffel Development Environment is free
786 software; you can redistribute it and/or modify it under
787 the terms of the GNU General Public License as published
788 by the Free Software Foundation, version 2 of the License
789 (available at the URL listed under "license" above).
790
791 Eiffel Software's Eiffel Development Environment is
792 distributed in the hope that it will be useful, but
793 WITHOUT ANY WARRANTY; without even the implied warranty
794 of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
795 See the GNU General Public License for more details.
796
797 You should have received a copy of the GNU General Public
798 License along with Eiffel Software's Eiffel Development
799 Environment; if not, write to the Free Software Foundation,
800 Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
801 ]"
802 source: "[
803 Eiffel Software
804 356 Storke Road, Goleta, CA 93117 USA
805 Telephone 805-685-1006, Fax 805-685-6869
806 Website http://www.eiffel.com
807 Customer support http://support.eiffel.com
808 ]"
809
810 end

Properties

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

  ViewVC Help
Powered by ViewVC 1.1.23