")
diff --git a/library/server/wsf_html/api/wsf_api_options.e b/library/server/wsf_html/api/wsf_api_options.e
new file mode 100644
index 00000000..eb9396c8
--- /dev/null
+++ b/library/server/wsf_html/api/wsf_api_options.e
@@ -0,0 +1,98 @@
+note
+ description: "Summary description for {WSF_API_OPTIONS}."
+ author: ""
+ date: "$Date$"
+ revision: "$Revision$"
+
+class
+ WSF_API_OPTIONS
+
+inherit
+ TABLE_ITERABLE [detachable ANY, STRING]
+
+create
+ make,
+ make_from_manifest
+
+convert
+ make_from_manifest ({ ARRAY [TUPLE [key: STRING; value: detachable ANY]],
+ ARRAY [TUPLE [STRING_8, ARRAY [TUPLE [STRING_8, STRING_32]]]],
+ ARRAY [TUPLE [STRING_8, ARRAY [TUPLE [STRING_8, STRING_8]]]]
+ })
+
+feature {NONE} -- Initialization
+
+ make (n: INTEGER)
+ do
+ create table.make (n)
+ end
+
+ make_from_manifest (lst: ARRAY [TUPLE [key: STRING; value: detachable ANY]])
+ do
+ make (lst.count)
+ across
+ lst as c
+ loop
+ force (c.item.value, c.item.key)
+ end
+ end
+
+feature -- Access
+
+ item (k: STRING): detachable ANY
+ do
+ Result := table.item (k)
+ end
+
+ force (v: detachable ANY; k: STRING)
+ do
+ table.force (v, k)
+ end
+
+ boolean_item (k: STRING; dft: BOOLEAN): BOOLEAN
+ do
+ if attached {BOOLEAN} item (k) as b then
+ Result := b
+ else
+ Result := dft
+ end
+ end
+
+ string_general_item (k: STRING): detachable READABLE_STRING_GENERAL
+ do
+ if attached {READABLE_STRING_GENERAL} item (k) as s then
+ Result := s
+ end
+ end
+
+ string_item, string_8_item (k: STRING): detachable READABLE_STRING_8
+ do
+ if attached {READABLE_STRING_8} item (k) as s then
+ Result := s
+ end
+ end
+
+ table: HASH_TABLE [detachable ANY, STRING]
+
+feature -- Change
+
+ import (a_opts: WSF_API_OPTIONS)
+ do
+ across
+ a_opts as c
+ loop
+ force (c.item, c.key)
+ end
+ end
+
+feature -- Access
+
+ new_cursor: TABLE_ITERATION_CURSOR [detachable ANY, STRING]
+ -- Fresh cursor associated with current structure
+ do
+ Result := table.new_cursor
+ end
+
+invariant
+
+end
diff --git a/library/server/wsf_html/api/wsf_api_utilities.e b/library/server/wsf_html/api/wsf_api_utilities.e
new file mode 100644
index 00000000..a45b299b
--- /dev/null
+++ b/library/server/wsf_html/api/wsf_api_utilities.e
@@ -0,0 +1,208 @@
+note
+ description: "Summary description for {WSF_API_UTILITIES}."
+ author: ""
+ date: "$Date$"
+ revision: "$Revision$"
+
+deferred class
+ WSF_API_UTILITIES
+
+feature -- Core
+
+ site_url: READABLE_STRING_8
+ deferred
+ end
+
+ base_url: detachable READABLE_STRING_8
+ -- Base url if any.
+ deferred
+ end
+
+ based_path (p: STRING): STRING
+ -- Path `p' in the context of the `base_url'
+ do
+ if attached base_url as l_base_url then
+ create Result.make_from_string (l_base_url)
+ if p.is_empty then
+ else
+ if p[1] = '/' then
+ Result.append (p.substring (2, p.count))
+ else
+ Result.append (p)
+ end
+ end
+ else
+ Result := p
+ end
+ end
+
+feature -- Conversion
+
+ link (a_text: detachable READABLE_STRING_GENERAL; a_path: READABLE_STRING_8; opts: detachable WSF_API_OPTIONS): STRING
+ do
+ create Result.make (32)
+ append_link_to_html (a_text, a_path, opts, Result)
+ end
+
+ link_with_raw_text (a_raw_text: detachable READABLE_STRING_8; a_path: READABLE_STRING_8; opts: detachable WSF_API_OPTIONS): STRING
+ do
+ create Result.make (32)
+ append_link_with_raw_text_to_html (a_raw_text, a_path, opts, Result)
+ end
+
+ append_link_to_html (a_text: detachable READABLE_STRING_GENERAL; a_path: READABLE_STRING_8; opts: detachable WSF_API_OPTIONS; a_html: STRING_8)
+ local
+ l_html: BOOLEAN
+ t: READABLE_STRING_GENERAL
+ do
+ l_html := True
+ if opts /= Void then
+ l_html := opts.boolean_item ("html", l_html)
+ end
+ a_html.append ("
")
+ if a_text = Void then
+ t := a_path
+ else
+ t := a_text
+ end
+ if l_html then
+ a_html.append (html_encoded (t))
+ else
+ a_html.append (checked_plain (t))
+ end
+ a_html.append ("")
+ end
+
+ append_link_with_raw_text_to_html (a_raw_text: detachable READABLE_STRING_8; a_path: READABLE_STRING_8; opts: detachable WSF_API_OPTIONS; a_html: STRING_8)
+ local
+ l_html: BOOLEAN
+ t: READABLE_STRING_8
+ do
+ l_html := True
+ if opts /= Void then
+ l_html := opts.boolean_item ("html", l_html)
+ end
+ a_html.append ("
")
+ if a_raw_text = Void then
+ t := a_path
+ else
+ t := a_raw_text
+ end
+ a_html.append (t)
+ a_html.append ("")
+ end
+
+ absolute_url (a_path: STRING; opts: detachable WSF_API_OPTIONS): STRING
+ local
+ l_opts: detachable WSF_API_OPTIONS
+ do
+ l_opts := opts
+ if l_opts = Void then
+ create l_opts.make (1)
+ end
+ l_opts.force (True, "absolute")
+ Result := url (a_path, l_opts)
+ end
+
+ url (a_path: READABLE_STRING_8; opts: detachable WSF_API_OPTIONS): STRING
+ local
+ q,f: detachable STRING_8
+ l_abs: BOOLEAN
+ do
+ l_abs := False
+
+ if opts /= Void then
+ l_abs := opts.boolean_item ("absolute", l_abs)
+ if attached opts.item ("query") as l_query then
+ if attached {READABLE_STRING_8} l_query as s_value then
+ q := s_value
+ elseif attached {ITERABLE [TUPLE [key, value: READABLE_STRING_GENERAL]]} l_query as lst then
+ create q.make_empty
+ across
+ lst as c
+ loop
+ if q.is_empty then
+ else
+ q.append_character ('&')
+ end
+ q.append (url_encoded (c.item.key))
+ q.append_character ('=')
+ q.append (url_encoded (c.item.value))
+ end
+ end
+ end
+ if attached opts.string_item ("fragment") as s_frag then
+ f := s_frag
+ end
+ end
+ if l_abs then
+ if a_path.substring_index ("://", 1) = 0 then
+ create Result.make_from_string (site_url)
+ if a_path.is_empty then
+ elseif Result.ends_with ("/") then
+ if a_path[1] = '/' then
+ Result.append_string (a_path.substring (2, a_path.count))
+ else
+ Result.append_string (a_path)
+ end
+ else
+ if a_path[1] = '/' then
+ Result.append_string (a_path)
+ else
+ Result.append_character ('/')
+ Result.append_string (a_path)
+ end
+ end
+ else
+ Result := a_path
+ end
+ else
+ Result := based_path (a_path)
+ end
+ if q /= Void then
+ Result.append ("?" + q)
+ end
+ if f /= Void then
+ Result.append ("#" + f)
+ end
+ end
+
+ checked_url (a_url: READABLE_STRING_8): READABLE_STRING_8
+ do
+ Result := a_url
+ end
+
+ checked_plain (a_text: READABLE_STRING_GENERAL): STRING_8
+ do
+ Result := html_encoded (a_text)
+ end
+
+feature -- Encoding
+
+ url_encoded (s: detachable READABLE_STRING_GENERAL): STRING_8
+ local
+ enc: URL_ENCODER
+ do
+ create enc
+ if s /= Void then
+ Result := enc.general_encoded_string (s)
+ else
+ create Result.make_empty
+ end
+ end
+
+ html_encoded (s: detachable READABLE_STRING_GENERAL): STRING_8
+ local
+ enc: HTML_ENCODER
+ do
+ create enc
+ if s /= Void then
+ Result := enc.general_encoded_string (s)
+ else
+ create Result.make_empty
+ end
+ end
+
+
+
+end
diff --git a/library/server/wsf_html/api/wsf_request_theme.e b/library/server/wsf_html/api/wsf_request_theme.e
new file mode 100644
index 00000000..8d72f61d
--- /dev/null
+++ b/library/server/wsf_html/api/wsf_request_theme.e
@@ -0,0 +1,40 @@
+note
+ description: "[
+ WF_THEME associated with a request
+ ]"
+ date: "$Date$"
+ revision: "$Revision$"
+
+class
+ WSF_REQUEST_THEME
+
+inherit
+ WSF_THEME
+
+create
+ make_with_request
+
+feature {NONE} -- Initialization
+
+ make_with_request (req: WSF_REQUEST)
+ do
+ request := req
+ end
+
+ request: WSF_REQUEST
+ -- Associated request
+
+feature -- Core
+
+ site_url: READABLE_STRING_8
+ do
+ Result := request.absolute_script_url ("")
+ end
+
+ base_url: detachable READABLE_STRING_8
+ -- Base url if any.
+ do
+ Result := request.script_url ("")
+ end
+
+end
diff --git a/library/server/wsf_html/api/wsf_theme.e b/library/server/wsf_html/api/wsf_theme.e
new file mode 100644
index 00000000..4af56be2
--- /dev/null
+++ b/library/server/wsf_html/api/wsf_theme.e
@@ -0,0 +1,14 @@
+note
+ description: "Summary description for {WSF_THEME}."
+ author: ""
+ date: "$Date$"
+ revision: "$Revision$"
+
+deferred class
+ WSF_THEME
+
+inherit
+ WSF_API_UTILITIES
+
+
+end
diff --git a/library/server/wsf_html/api/wsf_url_api_options.e b/library/server/wsf_html/api/wsf_url_api_options.e
new file mode 100644
index 00000000..b7d1412c
--- /dev/null
+++ b/library/server/wsf_html/api/wsf_url_api_options.e
@@ -0,0 +1,25 @@
+note
+ description: "Summary description for {WSF_URL_API_OPTIONS}."
+ author: ""
+ date: "$Date$"
+ revision: "$Revision$"
+
+class
+ WSF_URL_API_OPTIONS
+
+inherit
+ WSF_API_OPTIONS
+
+create
+ make,
+ make_absolute
+
+feature {NONE} -- Initialization
+
+ make_absolute
+ do
+ make (1)
+ force (True, "absolute")
+ end
+
+end
diff --git a/library/server/wsf_html/form/wsf_form_data.e b/library/server/wsf_html/form/wsf_form_data.e
index 1e9e5630..dce571af 100644
--- a/library/server/wsf_html/form/wsf_form_data.e
+++ b/library/server/wsf_html/form/wsf_form_data.e
@@ -1,6 +1,5 @@
note
- description : "Objects that ..."
- author : "$Author$"
+ description : "Objects that represent a form filled with data from request."
date : "$Date$"
revision : "$Revision$"
@@ -34,6 +33,9 @@ feature -- Status
Result := errors = Void
end
+ is_applied_to_associated_form: BOOLEAN
+ -- Data already applied to `form'?
+
feature -- Access
item_same_string (a_name: READABLE_STRING_GENERAL; s: READABLE_STRING_GENERAL): BOOLEAN
@@ -158,25 +160,28 @@ feature -- Basic operation
apply_to_associated_form
do
- if attached errors as errs then
- across
- errs as e
- loop
- if attached e.item as err then
- if attached err.field as e_field then
- set_fields_invalid (True, e_field.name)
+ if not is_applied_to_associated_form then
+ if attached errors as errs then
+ across
+ errs as e
+ loop
+ if attached e.item as err then
+ if attached err.field as e_field then
+ set_fields_invalid (True, e_field.name)
+ end
end
end
end
- end
- across
- items as c
- loop
across
- form as i
+ items as c
loop
- apply_to_associated_form_item (c.key, c.item, i.item)
+ across
+ form as i
+ loop
+ apply_to_associated_form_item (c.key, c.item, i.item)
+ end
end
+ is_applied_to_associated_form := True
end
end
diff --git a/library/server/wsf_html/form/wsf_theme.e b/library/server/wsf_html/form/wsf_theme.e
deleted file mode 100644
index 387f3bc6..00000000
--- a/library/server/wsf_html/form/wsf_theme.e
+++ /dev/null
@@ -1,37 +0,0 @@
-note
- description: "Summary description for {WSF_THEME}."
- author: ""
- date: "$Date$"
- revision: "$Revision$"
-
-class
- WSF_THEME
-
-feature -- Access
-
- url_encoded (s: detachable READABLE_STRING_GENERAL): STRING_8
- local
- enc: URL_ENCODER
- do
- create enc
- if s /= Void then
- Result := enc.general_encoded_string (s)
- else
- create Result.make_empty
- end
- end
-
- html_encoded (s: detachable READABLE_STRING_GENERAL): STRING_8
- local
- enc: HTML_ENCODER
- do
- create enc
- if s /= Void then
- Result := enc.general_encoded_string (s)
- else
- create Result.make_empty
- end
- end
-
-
-end
diff --git a/library/server/wsf_html/widget/wsf_widget_pager.e b/library/server/wsf_html/widget/wsf_widget_pager.e
new file mode 100644
index 00000000..a04a0d13
--- /dev/null
+++ b/library/server/wsf_html/widget/wsf_widget_pager.e
@@ -0,0 +1,167 @@
+note
+ description: "Summary description for {WSF_WIDGET_PAGER}."
+ author: ""
+ date: "$Date$"
+ revision: "$Revision$"
+
+class
+ WSF_WIDGET_PAGER
+
+inherit
+ WSF_WIDGET
+
+create
+ make
+
+feature {NONE} -- Initialization
+
+ make (tpl: READABLE_STRING_8; a_lower, a_upper: NATURAL_64; a_step: NATURAL_64)
+ do
+ create template.make (tpl)
+ lower := a_lower
+ upper := a_upper
+ step := a_step
+ end
+
+feature -- Change
+
+ set_active_range (a_lower, a_upper: NATURAL_64)
+ do
+ if a_upper = 0 then
+ active_range := [{NATURAL_64} 1, {NATURAL_64} 0]
+ elseif a_lower > 0 and a_lower <= a_upper then
+ active_range := [a_lower, a_upper]
+ else
+ active_range := Void
+ end
+ ensure
+ valid_range: attached active_range as rg implies (rg.upper = 0 or else rg.lower <= rg.upper)
+ end
+
+feature -- Access
+
+ template: URI_TEMPLATE
+
+ lower: NATURAL_64
+
+ upper: NATURAL_64
+
+ step: NATURAL_64
+
+ active_range: detachable TUPLE [lower_index, upper_index: NATURAL_64]
+
+feature -- Conversion
+
+ to_html (a_theme: WSF_THEME): STRING_8
+ do
+ create Result.make (1024)
+ append_to_html (a_theme, Result)
+ end
+
+ append_to_html (a_theme: WSF_THEME; a_html: STRING_8)
+ local
+ l_step: INTEGER
+ nb: INTEGER
+ curr: INTEGER
+ n, i: INTEGER
+ tb: HASH_TABLE [detachable ANY, STRING_8]
+ do
+ a_html.append ("
')
+ nb := ((upper - lower) // step).to_integer_32 + 1
+ if nb > 1 then
+ if attached active_range as rg then
+ if rg.upper_index = 0 then
+ -- all
+ else
+ curr := ((rg.lower_index - lower) // step).to_integer_32
+ if step * curr.to_natural_64 < rg.lower_index then
+ curr := curr + 1
+ end
+ end
+ end
+
+ l_step := step.to_integer_32
+ create tb.make (2)
+ tb.force (1, "lower")
+ tb.force (step, "upper")
+ if curr > 1 then
+ if curr > 2 then
+ tb.force (1, "lower")
+ tb.force (l_step, "upper")
+
+ a_html.append_character (' ')
+ append_link_to_html (a_theme, "<<", template.expanded_string (tb), a_html)
+ a_html.append_character (' ')
+ end
+
+ tb.force ((curr - 1) * l_step + 1, "lower")
+ tb.force ((curr ) * l_step , "upper")
+
+ a_html.append_character (' ')
+ append_link_to_html (a_theme, "<", template.expanded_string (tb), a_html)
+ a_html.append_character (' ')
+ end
+
+ from
+ i := (curr - 1).max (1)
+ n := 5
+ until
+ n = 0 or i > nb
+ loop
+ a_html.append_character (' ')
+
+ tb.force ((i - 1) * l_step + 1, "lower")
+ tb.force ((i ) * l_step , "upper")
+
+ if i = curr then
+ a_html.append ("")
+ end
+ append_link_to_html (a_theme, i.out, template.expanded_string (tb), a_html)
+ if i = curr then
+ a_html.append ("")
+ end
+
+ a_html.append_character (' ')
+
+ i := i + 1
+ n := n - 1
+ end
+
+ if curr < nb then
+ a_html.append_character (' ')
+ tb.force ((curr ) * l_step + 1, "lower")
+ tb.force ((curr + 1) * l_step , "upper")
+ append_link_to_html (a_theme, ">", template.expanded_string (tb), a_html)
+ a_html.append_character (' ')
+
+ if curr + 1 < nb then
+ tb.force ((nb - 1) * l_step + 1, "lower")
+ tb.force ( upper , "upper")
+
+ a_html.append_character (' ')
+ append_link_to_html (a_theme, ">>", template.expanded_string (tb), a_html)
+ a_html.append_character (' ')
+ end
+ end
+ a_html.append_character (' ')
+ tb.force (1, "lower")
+ tb.force (upper , "upper")
+ append_link_to_html (a_theme, "all", template.expanded_string (tb), a_html)
+ a_html.append_character (' ')
+ end
+
+ a_html.append ("
")
+ debug
+ a_html.append ("curr=" + curr.out +" step=" + step.out + " nb=" + nb.out)
+ end
+ end
+
+feature -- Factory
+
+ append_link_to_html (a_theme: WSF_THEME; a_text: detachable READABLE_STRING_GENERAL; a_path: STRING; a_html: STRING_8)
+ do
+ a_theme.append_link_to_html (a_text, a_path, Void, a_html)
+ end
+
+end
diff --git a/library/server/wsf_html/form/wsf_with_css_class.e b/library/server/wsf_html/widget/wsf_with_css_class.e
similarity index 100%
rename from library/server/wsf_html/form/wsf_with_css_class.e
rename to library/server/wsf_html/widget/wsf_with_css_class.e
diff --git a/library/server/wsf_html/form/wsf_with_css_id.e b/library/server/wsf_html/widget/wsf_with_css_id.e
similarity index 100%
rename from library/server/wsf_html/form/wsf_with_css_id.e
rename to library/server/wsf_html/widget/wsf_with_css_id.e
diff --git a/library/server/wsf_html/form/wsf_with_css_style.e b/library/server/wsf_html/widget/wsf_with_css_style.e
similarity index 100%
rename from library/server/wsf_html/form/wsf_with_css_style.e
rename to library/server/wsf_html/widget/wsf_with_css_style.e
diff --git a/library/server/wsf_html/form/wsf_with_html_attribute.e b/library/server/wsf_html/widget/wsf_with_html_attribute.e
similarity index 100%
rename from library/server/wsf_html/form/wsf_with_html_attribute.e
rename to library/server/wsf_html/widget/wsf_with_html_attribute.e
diff --git a/library/server/wsf_html/wsf_html-safe.ecf b/library/server/wsf_html/wsf_html-safe.ecf
index 2d8d738e..f26bc29b 100644
--- a/library/server/wsf_html/wsf_html-safe.ecf
+++ b/library/server/wsf_html/wsf_html-safe.ecf
@@ -11,9 +11,11 @@
+
+
diff --git a/library/server/wsf_html/wsf_html.ecf b/library/server/wsf_html/wsf_html.ecf
index e7da980a..a38674bc 100644
--- a/library/server/wsf_html/wsf_html.ecf
+++ b/library/server/wsf_html/wsf_html.ecf
@@ -11,9 +11,11 @@
+
+