class EV_INTERNALLY_PROCESSED_TEXTABLE_IMP

(source code)

Description

Objects that process text to include extra hidden characters at the Windows level.

note
	description: "Objects that process `text' to include extra hidden characters %
		%at the Windows level."
	legal: "See notice at end of class."
	status: "See notice at end of class."
	date: "$Date: 2011-10-04 13:10:27 -0700 (Tue, 04 Oct 2011) $"
	revision: "$Revision: 87401 $"

deferred class
	EV_INTERNALLY_PROCESSED_TEXTABLE_IMP

inherit
	EV_TEXTABLE_IMP
		redefine
			text,
			set_text
		end

feature -- Access

	text: STRING_32
			-- Text displayed in `Current'.
		do
			Result := unescaped_text (wel_text)
		end

feature -- Element change

	set_text (a_text: READABLE_STRING_GENERAL)
			-- Assign `a_text' to `text'.
		do
			wel_set_text (escaped_text (a_text))
		end

feature {NONE} -- Implementation

	escaped_text (s: READABLE_STRING_GENERAL): READABLE_STRING_GENERAL
			-- `text' with doubled ampersands.
		local
			n, l_count: INTEGER
			l_amp_code: NATURAL_32
			l_string_32: STRING_32
		do
			l_amp_code := ('&').code.as_natural_32
			l_count := s.count
			n := s.index_of_code (l_amp_code, 1)

			if n > 0 then
					-- There is an ampersand present in `s'.
					-- Replace all occurrences of "&" with "&&".
					--| Cannot be replaced with `{STRING_32}.replace_substring_all' because
					--| we only want it to happen once, not forever.
				from
					create l_string_32.make (l_count + 1)
					l_string_32.append_string_general (s)
				until
					n > l_count
				loop
					n := l_string_32.index_of_code (l_amp_code, n)
					if n > 0 then
						l_string_32.insert_character ('&', n)
							-- Increase count local by one as a character has been inserted.
						l_count := l_count + 1
						n := n + 2
					else
						n := l_count + 1
					end
				end
				Result := l_string_32
			else
				Result := s
			end
		ensure
			ampersand_occurrences_doubled: Result.as_string_32.occurrences ('&') = -- AUTO EDITION: fix
				(old s.twin.as_string_32).occurrences ('&') * 2
		end

	unescaped_text (s: STRING_32): STRING_32
			-- Replace all occurrences of "&&" with "&".
			--| Cannot be replaced with {STRING_32}.replace_substring_all because
			--| it will replace any number of ampersands with only one.
			--| Has to be a previously escaped string. Enforced with a check
			--| inside routine body.
		require
			s_not_void: s /= Void
		local
			n, l_count: INTEGER
		do
			from
				n := 1
				l_count := s.count
			until
				n > l_count
			loop
				n := s.index_of ('&', n)
				if n > 0 then
					s.remove (n)
					l_count := l_count - 1
					n := n + 1
				else
					n := l_count + 1
				end
			end
			Result := s
		ensure
			ampersand_occurrences_halved: old s.twin.occurrences ('&') = s.occurrences ('&') * 2
		end

note
	copyright:	"Copyright (c) 1984-2006, Eiffel Software and others"
	license:	"Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
	source: "[
			 Eiffel Software
			 356 Storke Road, Goleta, CA 93117 USA
			 Telephone 805-685-1006, Fax 805-685-6869
			 Website http://www.eiffel.com
			 Customer support http://support.eiffel.com
		]"




end -- class EV_INTERNALLY_PROCESSED_TEXTABLE_IMP