Extracted the WIDGET and FORM classes out of "cms" component

and build the wsf_html library which also include the previous css lib.
This commit is contained in:
Jocelyn Fiat
2013-03-22 20:11:44 +01:00
parent de57e814c0
commit 52cc356f8e
65 changed files with 468 additions and 358 deletions

View File

@@ -0,0 +1,22 @@
note
description: "Summary description for {WSF_WIDGET}."
author: ""
date: "$Date$"
revision: "$Revision$"
deferred class
WSF_WIDGET
feature -- Conversion
append_to_html (a_theme: WSF_THEME; a_html: STRING_8)
deferred
end
to_html (a_theme: WSF_THEME): STRING_8
do
create Result.make_empty
append_to_html (a_theme, Result)
end
end

View File

@@ -0,0 +1,225 @@
note
description: "Summary description for {WSF_WIDGET_TABLE}."
author: ""
date: "$Date$"
revision: "$Revision$"
class
WSF_WIDGET_AGENT_TABLE [G]
inherit
WSF_WIDGET
WSF_WITH_CSS_ID
WSF_WITH_CSS_CLASS
WSF_WITH_CSS_STYLE
create
make
convert
to_computed_table: {WSF_WIDGET_TABLE}
feature {NONE} -- Initialization
make
do
create columns.make_empty
end
feature -- Access
column_count: INTEGER
do
Result := columns.count
end
columns: ARRAY [WSF_WIDGET_TABLE_COLUMN]
column (c: INTEGER): WSF_WIDGET_TABLE_COLUMN
do
if c > column_count then
set_column_count (c)
end
Result := columns[c]
end
has_title: BOOLEAN
do
Result := across columns as c some c.item.title /= Void end
end
head_data: detachable ITERABLE [G]
-- thead
foot_data: detachable ITERABLE [G]
-- tfoot
data: detachable ITERABLE [G]
-- tbody
compute_item_function: detachable FUNCTION [ANY, TUPLE [data: G], WSF_WIDGET_TABLE_ROW]
feature -- Change
set_head_data (d: like head_data)
do
head_data := d
end
set_foot_data (d: like foot_data)
do
foot_data := d
end
set_data (d: like data)
do
data := d
end
set_compute_item_function (fct: like compute_item_function)
do
compute_item_function := fct
end
set_column_count (nb: INTEGER)
do
if nb > columns.count then
-- columns.conservative_resize_with_default (create {WSF_WIDGET_TABLE_COLUMN}, 1, nb)
from
until
columns.count = nb
loop
columns.force (create {WSF_WIDGET_TABLE_COLUMN}.make (columns.upper + 1), columns.upper + 1)
end
else
columns.remove_tail (columns.count - nb)
end
end
set_column_title (c: INTEGER; t: READABLE_STRING_32)
do
if c > column_count then
set_column_count (c)
end
if attached column (c) as col then
col.set_title (t)
end
end
feature -- Conversion
to_computed_table: WSF_WIDGET_TABLE
local
col: WSF_WIDGET_TABLE_COLUMN
do
create Result.make
Result.set_column_count (column_count)
-- css classes
Result.add_css_classes (css_classes)
-- css id
Result.set_css_id (css_id)
-- css style
Result.add_css_style (css_style)
-- columns
across
columns as c
loop
col := Result.column (c.item.index)
col.set_title (c.item.title)
col.add_css_style (c.item.css_style)
col.add_css_classes (c.item.css_classes)
end
-- rows
if attached compute_item_function as fct then
if attached head_data as lst then
across lst as d loop
Result.add_head_row (fct.item ([d.item]))
end
end
if attached data as lst then
across lst as d loop
Result.add_row (fct.item ([d.item]))
end
end
if attached foot_data as lst then
across lst as d loop
Result.add_foot_row (fct.item ([d.item]))
end
end
end
end
feature -- Conversion: HTML
append_to_html (a_theme: WSF_THEME; a_html: STRING_8)
local
l_use_tbody: BOOLEAN
do
a_html.append ("<table")
append_css_id_to (a_html)
append_css_class_to (a_html, Void)
append_css_style_to (a_html)
a_html.append (">")
if has_title then
a_html.append ("<tr>")
across
columns as c
loop
c.item.append_table_header_to_html (a_theme, a_html)
end
a_html.append ("</tr>")
end
if attached head_data as l_head_data then
l_use_tbody := True
a_html.append ("<thead>")
append_data_to_html (l_head_data, a_theme, a_html)
a_html.append ("</thead>")
end
if attached foot_data as l_foot_data then
l_use_tbody := True
a_html.append ("<tfoot>")
append_data_to_html (l_foot_data, a_theme, a_html)
a_html.append ("</tfoot>")
end
if attached data as l_data then
if l_use_tbody then
a_html.append ("<tbody>")
end
append_data_to_html (l_data, a_theme, a_html)
if l_use_tbody then
a_html.append ("</tbody>")
end
end
a_html.append ("</table>")
end
append_data_to_html (lst: ITERABLE [G]; a_theme: WSF_THEME; a_html: STRING_8)
local
fct: like compute_item_function
do
fct := compute_item_function
across
lst as d
loop
if fct /= Void and then attached fct.item ([d.item]) as r then
r.append_to_html (a_theme, a_html)
else
a_html.append ("<tr>")
a_html.append ("<td>")
if attached d.item as g then
a_html.append (g.out)
end
a_html.append ("</td>")
a_html.append ("</tr>")
end
end
end
end

View File

@@ -0,0 +1,250 @@
note
description : "Objects that ..."
author : "$Author$"
date : "$Date$"
revision : "$Revision$"
deferred class
WSF_WIDGET_COMPOSITE
inherit
ITERABLE [WSF_WIDGET]
feature {NONE} -- Initialization
initialize_with_count (n: INTEGER)
do
create items.make (n)
end
feature -- Status
is_empty: BOOLEAN
do
Result := count = 0
end
has_item (i: WSF_WIDGET): BOOLEAN
do
if has_immediate_item (i) then
Result := True
else
across
items as c
loop
if attached {WSF_WIDGET_COMPOSITE} c.item as comp then
Result := comp.has_item (i)
end
end
end
end
has_immediate_item (i: WSF_WIDGET): BOOLEAN
do
Result := items.has (i)
end
feature -- Access: cursor
new_cursor: ITERATION_CURSOR [WSF_WIDGET]
-- Fresh cursor associated with current structure
do
Result := items.new_cursor
end
feature -- Access
count: INTEGER
do
Result := immediate_count
across
items as c
loop
if attached {WSF_WIDGET_COMPOSITE} c.item as comp then
Result := Result + comp.count
end
end
end
immediate_count: INTEGER
do
Result := items.count
end
items_by_type (a_type: TYPE [detachable ANY]): detachable LIST [WSF_WIDGET]
-- All WSF_WIDGET items conforming to a_type.
-- Warning: you should pass {detachable WSF_FORM_SUBMIT_INPUT} rather than just {WSF_FORM_SUBMIT_INPUT}
local
int: INTERNAL
tid: INTEGER
t: TYPE [detachable ANY]
do
tid := a_type.type_id
create int
tid := int.detachable_type (tid)
if tid > 0 then
t := int.type_of_type (tid)
if not a_type.conforms_to (t) then
t := a_type
end
else
t := a_type
end
Result := items_by_type_from (Current, t)
end
items_by_css_id (a_id: READABLE_STRING_GENERAL): detachable LIST [WSF_WIDGET]
do
Result := items_by_css_id_from (Current, a_id)
end
first_item_by_css_id (a_id: READABLE_STRING_GENERAL): detachable WSF_WIDGET
do
if attached items_by_css_id_from (Current, a_id) as lst then
if not lst.is_empty then
Result := lst.first
end
end
end
feature -- Change
insert_before (i: WSF_WIDGET; a_item: WSF_WIDGET)
-- Insert `i' before `a_item'
require
has_item (a_item)
local
done: BOOLEAN
do
if has_immediate_item (a_item) then
items.start
items.search (a_item)
if items.exhausted then
items.put_front (i)
else
items.put_left (i)
end
else
across
items as c
until
done
loop
if attached {WSF_WIDGET_COMPOSITE} c.item as comp and then comp.has_item (a_item) then
comp.insert_before (i, a_item)
done := True
end
end
end
end
insert_after (i: WSF_WIDGET; a_item: WSF_WIDGET)
-- Insert `i' after `a_item'
require
has_item (a_item)
local
done: BOOLEAN
do
if has_immediate_item (a_item) then
items.start
items.search (a_item)
if items.exhausted then
items.force (i)
else
items.put_right (i)
end
else
across
items as c
until
done
loop
if attached {WSF_WIDGET_COMPOSITE} c.item as comp and then comp.has_item (a_item) then
comp.insert_after (i, a_item)
done := True
end
end
end
end
extend (i: WSF_WIDGET)
do
items.force (i)
end
prepend (i: WSF_WIDGET)
do
items.put_front (i)
end
extend_text (t: READABLE_STRING_8)
do
extend (create {WSF_WIDGET_TEXT}.make_with_text (t))
end
feature {NONE} -- Implementation: Items
items_by_type_from (a_container: ITERABLE [WSF_WIDGET]; a_type: TYPE [detachable ANY]): detachable ARRAYED_LIST [WSF_WIDGET]
local
res: detachable ARRAYED_LIST [WSF_WIDGET]
do
across
a_container as i
loop
if i.item.generating_type.conforms_to (a_type) then
if res = Void then
create res.make (1)
end
res.force (i.item)
elseif attached {ITERABLE [WSF_WIDGET]} i.item as l_cont then
if attached items_by_type_from (l_cont, a_type) as lst then
if res = Void then
res := lst
else
res.append (lst)
end
end
end
end
Result := res
end
items_by_css_id_from (a_container: ITERABLE [WSF_WIDGET]; a_id: READABLE_STRING_GENERAL): detachable ARRAYED_LIST [WSF_WIDGET]
local
res: detachable ARRAYED_LIST [WSF_WIDGET]
do
across
a_container as i
loop
if
attached {WSF_WITH_CSS_ID} i.item as l_with_css_id and then
attached l_with_css_id.css_id as l_css_id and then
l_css_id.same_string_general (a_id)
then
if res = Void then
create res.make (1)
end
res.force (i.item)
elseif attached {ITERABLE [WSF_WIDGET]} i.item as l_cont then
if attached items_by_css_id_from (l_cont, a_id) as lst then
if res = Void then
res := lst
else
res.append (lst)
end
end
end
end
Result := res
end
feature {NONE} -- Implementation
items: ARRAYED_LIST [WSF_WIDGET]
-- name => item
invariant
items /= Void
end

View File

@@ -0,0 +1,281 @@
note
description: "Summary description for {WSF_WIDGET_FILLED_TABLE}."
date: "$Date$"
revision: "$Revision$"
class
WSF_WIDGET_TABLE
inherit
WSF_WIDGET
WSF_WITH_CSS_ID
WSF_WITH_CSS_CLASS
WSF_WITH_CSS_STYLE
ITERABLE [WSF_WIDGET_TABLE_ITEM]
create
make
feature {NONE} -- Initialization
make
do
create columns.make_empty
end
make_from_table (tb: WSF_WIDGET_AGENT_TABLE [detachable ANY])
local
fct: like {WSF_WIDGET_AGENT_TABLE [detachable ANY]}.compute_item_function
do
make
set_column_count (tb.column_count)
-- css classes
if attached tb.css_classes as lst then
across lst as c loop
add_css_class (c.item)
end
end
-- css id
set_css_id (tb.css_id)
-- css style
add_css_style (tb.css_style)
-- columns
across
tb.columns as c
loop
columns [c.item.index] := c.item.twin
end
-- rows
fct := tb.compute_item_function
if fct /= Void then
if attached tb.head_data as lst then
across lst as d loop
add_head_row (fct.item ([d.item]))
end
end
if attached tb.data as lst then
across lst as d loop
add_row (fct.item ([d.item]))
end
end
if attached tb.foot_data as lst then
across lst as d loop
add_foot_row (fct.item ([d.item]))
end
end
end
end
feature -- Access
new_cursor: WSF_WIDGET_TABLE_ITERATION_CURSOR
-- Fresh cursor associated with current structure
do
create Result.make (Current)
end
column_count: INTEGER
do
Result := columns.count
end
head_row_count: INTEGER
do
if attached head_rows as lst then
Result := lst.count
end
end
body_row_count: INTEGER
do
if attached rows as lst then
Result := lst.count
end
end
foot_row_count: INTEGER
do
if attached foot_rows as lst then
Result := lst.count
end
end
row_count: INTEGER
do
Result := head_row_count + body_row_count + foot_row_count
end
columns: ARRAY [WSF_WIDGET_TABLE_COLUMN]
column (c: INTEGER): WSF_WIDGET_TABLE_COLUMN
do
if c > column_count then
set_column_count (c)
end
Result := columns[c]
end
row (r: INTEGER): detachable WSF_WIDGET_TABLE_ROW
do
if r <= head_row_count then
if attached head_rows as lst then
Result := lst [r]
end
elseif r <= head_row_count + body_row_count then
if attached rows as lst then
Result := lst [r - head_row_count]
end
elseif r <= row_count then
if attached foot_rows as lst then
Result := lst [r - head_row_count - body_row_count]
end
end
end
has_title: BOOLEAN
do
Result := across columns as c some c.item.title /= Void end
end
head_rows: detachable ARRAYED_LIST [WSF_WIDGET_TABLE_ROW]
-- thead
foot_rows: detachable ARRAYED_LIST [WSF_WIDGET_TABLE_ROW]
-- tfoot
rows: detachable ARRAYED_LIST [WSF_WIDGET_TABLE_ROW]
-- tbody
feature -- Change
clear_rows
do
head_rows := Void
foot_rows := Void
rows := Void
end
add_head_row (r: WSF_WIDGET_TABLE_ROW)
local
lst: like head_rows
do
lst := head_rows
if lst = Void then
create {ARRAYED_LIST [WSF_WIDGET_TABLE_ROW]} lst.make (1)
head_rows := lst
end
lst.force (r)
end
add_foot_row (r: WSF_WIDGET_TABLE_ROW)
local
lst: like foot_rows
do
lst := foot_rows
if lst = Void then
create {ARRAYED_LIST [WSF_WIDGET_TABLE_ROW]} lst.make (1)
foot_rows := lst
end
lst.force (r)
end
add_row (r: WSF_WIDGET_TABLE_ROW)
local
lst: like rows
do
lst := rows
if lst = Void then
create {ARRAYED_LIST [WSF_WIDGET_TABLE_ROW]} lst.make (1)
rows := lst
end
lst.force (r)
end
set_column_count (nb: INTEGER)
do
if nb > columns.count then
from
until
columns.count = nb
loop
columns.force (create {WSF_WIDGET_TABLE_COLUMN}.make (columns.upper + 1), columns.upper + 1)
end
else
columns.remove_tail (columns.count - nb)
end
end
set_column_title (c: INTEGER; t: READABLE_STRING_32)
do
if c > column_count then
set_column_count (c)
end
if attached column (c) as col then
col.set_title (t)
end
end
feature -- Conversion
append_to_html (a_theme: WSF_THEME; a_html: STRING_8)
local
l_use_tbody: BOOLEAN
do
a_html.append ("<table")
append_css_id_to (a_html)
append_css_class_to (a_html, Void)
append_css_style_to (a_html)
a_html.append (">")
if has_title then
a_html.append ("<tr>")
across
columns as c
loop
c.item.append_table_header_to_html (a_theme, a_html)
end
a_html.append ("</tr>")
end
if attached head_rows as l_head_rows then
l_use_tbody := True
a_html.append ("<thead>")
append_rows_to_html (l_head_rows, a_theme, a_html)
a_html.append ("</thead>")
end
if attached foot_rows as l_foot_rows then
l_use_tbody := True
a_html.append ("<tfoot>")
append_rows_to_html (l_foot_rows, a_theme, a_html)
a_html.append ("</tfoot>")
end
if attached rows as l_rows then
if l_use_tbody then
a_html.append ("<tbody>")
end
append_rows_to_html (l_rows, a_theme, a_html)
if l_use_tbody then
a_html.append ("</tbody>")
end
end
a_html.append ("</table>")
end
append_rows_to_html (lst: ITERABLE [WSF_WIDGET_TABLE_ROW]; a_theme: WSF_THEME; a_html: STRING_8)
do
across
lst as r
loop
r.item.append_to_html (a_theme, a_html)
end
end
end

View File

@@ -0,0 +1,52 @@
note
description: "Summary description for {WSF_WIDGET_COLUMN}."
author: ""
date: "$Date$"
revision: "$Revision$"
class
WSF_WIDGET_TABLE_COLUMN
inherit
WSF_WITH_CSS_CLASS
WSF_WITH_CSS_STYLE
create
make
feature {NONE} -- Initialization
make (i: like index)
do
index := i
end
feature -- Access
index: INTEGER
title: detachable READABLE_STRING_32
feature -- Change
set_title (t: like title)
do
title := t
end
feature -- Conversion
append_table_header_to_html (a_theme: WSF_THEME; a_html: STRING_8)
do
a_html.append ("<th")
append_css_class_to (a_html, Void)
append_css_style_to (a_html)
a_html.append_character ('>')
if attached title as l_title then
a_html.append (a_theme.html_encoded (l_title))
end
a_html.append ("</th>")
end
end

View File

@@ -0,0 +1,78 @@
note
description: "Summary description for {WSF_WIDGET_TABLE_ITEM}."
author: ""
date: "$Date$"
revision: "$Revision$"
class
WSF_WIDGET_TABLE_ITEM
inherit
WSF_WIDGET
WSF_WITH_HTML_ATTRIBUTE
WSF_WITH_CSS_CLASS
WSF_WITH_CSS_STYLE
ITERABLE [WSF_WIDGET]
create
make_with_text,
make_with_text_and_css,
make_with_content
feature {NONE} -- Initialization
make_with_text (a_text: READABLE_STRING_8)
do
make_with_content (create {WSF_WIDGET_TEXT}.make_with_text (a_text))
end
make_with_text_and_css (a_text: READABLE_STRING_8; a_css_classes: detachable ITERABLE [READABLE_STRING_8])
do
make_with_text (a_text)
if a_css_classes /= Void then
across
a_css_classes as c
loop
add_css_class (c.item)
end
end
end
make_with_content (a_widget: WSF_WIDGET)
do
content := a_widget
end
feature -- Access
content: WSF_WIDGET
feature -- Access
new_cursor: ITERATION_CURSOR [WSF_WIDGET]
-- Fresh cursor associated with current structure
local
lst: ARRAYED_LIST [WSF_WIDGET]
do
create lst.make (1)
lst.extend (content)
Result := lst.new_cursor
end
feature -- Conversion
append_to_html (a_theme: WSF_THEME; a_html: STRING_8)
do
a_html.append ("<td")
append_css_class_to (a_html, Void)
append_css_style_to (a_html)
a_html.append_character ('>')
content.append_to_html (a_theme, a_html)
a_html.append ("</td>")
end
end

View File

@@ -0,0 +1,96 @@
note
description: "Summary description for {WSF_WIDGET_TABLE_ITERATION_CURSOR}."
author: ""
date: "$Date$"
revision: "$Revision$"
class
WSF_WIDGET_TABLE_ITERATION_CURSOR
inherit
ITERATION_CURSOR [WSF_WIDGET_TABLE_ITEM]
create
make
feature {NONE} -- Initialization
make (a_table: WSF_WIDGET_TABLE)
do
table := a_table
start
end
table: WSF_WIDGET_TABLE
row_index: INTEGER
column_index: INTEGER
feature -- Access
start
do
row_index := 1
column_index := 0
forth
end
item: WSF_WIDGET_TABLE_ITEM
-- Item at current cursor position.
do
if attached table.row (row_index) as r then
if attached r.item (column_index) as w then
Result := w
else
create Result.make_with_text ("")
end
else
create Result.make_with_text ("")
end
end
feature -- Status report
after: BOOLEAN
-- Are there no more items to iterate over?
do
if row_index > table.row_count then
Result := True
elseif row_index = table.row_count then
if attached table.row (row_index) as l_row then
if column_index > l_row.count then
Result := True
else
Result := False
end
else
Result := True
end
end
end
feature -- Cursor movement
forth
-- Move to next position.
do
if row_index <= table.row_count then
if attached table.row (row_index) as l_row then
if column_index < l_row.count then
column_index := column_index + 1
else
from
row_index := row_index + 1
column_index := 1
until
row_index > table.row_count or
attached table.row (row_index) as r and then r.count > 0
loop
row_index := row_index + 1
end
end
end
end
end
end

View File

@@ -0,0 +1,106 @@
note
description: "Summary description for {WSF_WIDGET_TABLE_ROW}."
author: ""
date: "$Date$"
revision: "$Revision$"
class
WSF_WIDGET_TABLE_ROW
inherit
WSF_WITH_CSS_CLASS
WSF_WITH_CSS_STYLE
ITERABLE [WSF_WIDGET_TABLE_ITEM]
create
make,
make_with_items
feature {NONE} -- Initialization
make (n: INTEGER)
do
create items.make (n)
end
make_with_items (lst: ITERABLE [WSF_WIDGET_TABLE_ITEM])
local
n: INTEGER
do
across lst as c loop
n := n + 1
end
make (n)
across
lst as c
loop
add_item (c.item)
end
end
items: ARRAYED_LIST [WSF_WIDGET_TABLE_ITEM]
feature -- Access
new_cursor: ITERATION_CURSOR [WSF_WIDGET_TABLE_ITEM]
do
Result := items.new_cursor
end
count: INTEGER
do
Result := items.count
end
item (c: INTEGER): WSF_WIDGET_TABLE_ITEM
do
Result := items [c]
end
feature -- Change
set_item (w: WSF_WIDGET_TABLE_ITEM; col: INTEGER)
do
if col > items.count then
items.grow (col)
from
until
items.count >= col - 1
loop
items.force (create {WSF_WIDGET_TABLE_ITEM}.make_with_text (""))
end
items.force (w)
else
items.put_i_th (w, col)
end
end
add_widget (w: WSF_WIDGET)
do
add_item (create {WSF_WIDGET_TABLE_ITEM}.make_with_content (w))
end
force, add_item (w: WSF_WIDGET_TABLE_ITEM)
do
items.force (w)
end
feature -- Conversion
append_to_html (a_theme: WSF_THEME; a_html: STRING_8)
do
a_html.append ("<tr")
append_css_class_to (a_html, Void)
append_css_style_to (a_html)
a_html.append_character ('>')
across
items as c
loop
c.item.append_to_html (a_theme, a_html)
end
a_html.append ("</tr>")
end
end

View File

@@ -0,0 +1,41 @@
note
description: "Summary description for {WSF_WIDGET_TEXT}."
author: ""
date: "$Date$"
revision: "$Revision$"
class
WSF_WIDGET_TEXT
inherit
WSF_WIDGET
create
make_with_text
feature {NONE} -- Initialization
make_with_text (a_text: READABLE_STRING_8)
do
text := a_text
end
feature -- Access
text: READABLE_STRING_8
feature -- Change
set_text (a_text: like text)
do
text := a_text
end
feature -- Conversion
append_to_html (a_theme: WSF_THEME; a_html: STRING_8)
do
a_html.append (text)
end
end