Index: openacs-4/packages/xowiki/tcl/includelet-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/includelet-procs.tcl,v
diff -u -r1.113 -r1.114
--- openacs-4/packages/xowiki/tcl/includelet-procs.tcl 15 May 2009 07:05:19 -0000 1.113
+++ openacs-4/packages/xowiki/tcl/includelet-procs.tcl 29 May 2009 13:37:48 -0000 1.114
@@ -101,6 +101,11 @@
string map [list \n \\n \" {\"} ' {\'}] $string
}
+ ::xowiki::Includelet proc html_encode {string} {
+ return [string map [list & "&" < "<" > ">" \" """ ' "'"] $string]
+ }
+
+
::xowiki::Includelet proc html_id {name} {
# Construct a valid HTML id or name.
# For details, see http://www.w3.org/TR/html4/types.html
@@ -623,7 +628,7 @@
}
categories instproc include_head_entries {} {
- ::xowiki::CatTree include_head_entries -style [my set style]
+ ::xowiki::Tree include_head_entries -renderer [my set style]
}
categories instproc category_tree_edit_button {-object_id:integer -locale {-allow_edit false} -tree_id:integer} {
@@ -697,10 +702,13 @@
return [my category_tree_missing -name $tree_name -edit_html $edit_html]
}
+ if {![my exists id]} {my set id [::xowiki::Includelet html_id [self]]}
+
foreach tree $trees {
foreach {tree_id my_tree_name ...} $tree {break}
- set edit_html [my category_tree_edit_button -object_id $package_id -allow_edit $allow_edit -tree_id $tree_id]
+ set edit_html [my category_tree_edit_button -object_id $package_id \
+ -allow_edit $allow_edit -tree_id $tree_id]
#append content "
$edit_html
\n"
if {!$no_tree_name} {
@@ -710,13 +718,14 @@
}
set categories [list]
set pos 0
- set cattree(0) [::xowiki::CatTree new -volatile -orderby pos -name $my_tree_name]
- set category_infos [::xowiki::Category get_category_infos -locale $locale -tree_id $tree_id]
+ set cattree(0) [::xowiki::Tree new -volatile -orderby pos \
+ -id [my id]-$my_tree_name -name $my_tree_name]
+ set category_infos [::xowiki::Category get_category_infos \
+ -locale $locale -tree_id $tree_id]
foreach category_info $category_infos {
foreach {cid category_label deprecated_p level} $category_info {break}
-
- set c [::xowiki::Category new -orderby pos -category_id $cid -package_id $package_id \
+ set c [::xowiki::TreeNode new -orderby pos \
-level $level -label $category_label -pos [incr pos]]
set cattree($level) $c
set plevel [expr {$level -1}]
@@ -773,7 +782,7 @@
if {$category_ids ne ""} {
foreach cid [split $category_ids ,] {
append sql " and exists (select * from category_object_map \
- where object_id = ci.item_id and category_id = $cid)"
+ where object_id = ci.item_id and category_id = $cid)"
}
}
append sql $locale_clause
@@ -799,8 +808,8 @@
set prefix ""
set suffix ""
foreach var {name title prefix suffix page_order} {$itemobj set $var [set $var]}
-
- $cattree(0) add_to_category \
+ $itemobj set href [::$package_id pretty_link $name]
+ $cattree(0) add_item \
-category $category($category_id) \
-itemobj $itemobj \
-orderby $orderby \
@@ -842,13 +851,14 @@
}
categories-recent instproc include_head_entries {} {
- ::xowiki::CatTree include_head_entries -style [my set style]
+ ::xowiki::Tree include_head_entries -renderer [my set style]
}
categories-recent instproc render {} {
my get_parameters
- set cattree [::xowiki::CatTree new -volatile -name "categories-recent"]
+ if {![my exists id]} {my set id [::xowiki::Includelet html_id [self]]}
+ set cattree [::xowiki::Tree new -volatile -id [my id]]
foreach {locale locale_clause} \
[::xowiki::Includelet locale_clause -revisions r -items ci $package_id $locale] break
@@ -877,14 +887,14 @@
set prefix "$formatted_date "
set suffix ""
foreach var {name title prefix suffix} {$itemobj set $var [set $var]}
+ $itemobj set href [::$package_id pretty_link $name]
if {![info exists categories($category_id)]} {
- set categories($category_id) [::xowiki::Category new \
- -package_id $package_id \
- -label [category::get_name $category_id $locale]\
+ set categories($category_id) [::xowiki::TreeNode new \
+ -label [category::get_name $category_id $locale] \
-level 1]
$cattree add $categories($category_id)
}
- $cattree add_to_category -category $categories($category_id) -itemobj $itemobj
+ $cattree add_item -category $categories($category_id) -itemobj $itemobj
}
return [$cattree render -style [my set style]]
}
@@ -1707,7 +1717,7 @@
# includelets based on order
#
Class create PageReorderSupport
- PageReorderSupport instproc page_reorder_check_allow {allow_reorder} {
+ PageReorderSupport instproc page_reorder_check_allow {{-with_head_entries true} allow_reorder} {
if {$allow_reorder ne ""} {
my instvar package_id
set granted [$package_id check_permissions \
@@ -1716,10 +1726,12 @@
$package_id change-page-order]
#my msg "granted=$granted"
if {$granted} {
- set ajaxhelper 0
- ::xowiki::Includelet require_YUI_JS -ajaxhelper $ajaxhelper "utilities/utilities.js"
- ::xowiki::Includelet require_YUI_JS -ajaxhelper $ajaxhelper "selector/selector-min.js"
- ::xo::Page requireJS "/resources/xowiki/yui-page-order-region.js"
+ if {$with_head_entries} {
+ set ajaxhelper 1
+ ::xowiki::Includelet require_YUI_JS -ajaxhelper $ajaxhelper "utilities/utilities.js"
+ ::xowiki::Includelet require_YUI_JS -ajaxhelper $ajaxhelper "selector/selector-min.js"
+ ::xo::Page requireJS "/resources/xowiki/yui-page-order-region.js"
+ }
} else {
# the user has not enough permissions, so disallow
set allow_reorder ""
@@ -1872,48 +1884,115 @@
return $displayed_page_order
}
- toc instproc yui_tree {pages open_page package_id expand_all remove_levels} {
- my instvar navigation page_name book_mode
+ toc instproc build_navigation {pages} {
+ #
+ # compute associative arrays open_node and navigation (position
+ # and current)
+ #
+ my get_parameters
+ my instvar navigation page_name
+ array set navigation {position 0 current ""}
- set js ""
- set node() root
+ # the top node is always open
+ my set open_node() true
set node_cnt 0
- #my log "--book read [llength [$pages children]] pages"
- #append js "$node().expand();\n"
-
foreach o [$pages children] {
- $o instvar page_order title name
+ $o instvar page_order name
+ incr node_cnt
+ set page_name($node_cnt) $name
+ if {![regexp {^(.*)[.]([^.]+)} $page_order _ parent]} {set parent ""}
+ #
+ # If we are on the provided $open_page, we remember our position
+ # for the progress bar.
+ set on_current_node [expr {$open_page eq $name} ? "true" : "false"]
+ if {$on_current_node} {
+ set navigation(position) $node_cnt
+ set navigation(current) $page_order
+ }
+ if {$expand_all} {
+ my set open_node($page_order) true
+ } elseif {$on_current_node} {
+ my set open_node($page_order) true
+ # make sure to open all nodes to the root
+ for {set p $parent} {$p ne ""} {} {
+ my set open_node($p) true
+ if {![regexp {^(.*)[.]([^.]+)} $p _ p]} {set p ""}
+ }
+ }
+ }
+ set navigation(count) $node_cnt
+ #my log OPEN=[lsort [my array names open_node]]
+ }
- set label "[my page_number $page_order $remove_levels] $title"
- set id tmpNode[incr node_cnt]
- set node($page_order) $id
- set jsobj [my js_name].objs\[$node_cnt\]
- set href [my href $package_id $book_mode $name]
- set expand [expr {[my exists open_node($page_order)]}]
+ toc instproc render_list {{-full false} pages} {
+ my get_parameters
+ my instvar navigation page_name
+ #
+ # Build a reduced toc tree based on pure HTML (no javascript or
+ # ajax involved). If an open_page is specified, produce an as
+ # small as possible tree and omit all non-visible nodes.
+ #
+ if {$open_page ne ""} {
+ # TODO: can we allow open_page and reorder?
+ set allow_reorder ""
+ } else {
+ set allow_reorder [my page_reorder_check_allow $allow_reorder]
+ }
+ my page_reorder_init_vars -allow_reorder $allow_reorder js last_level ID min_level
+
+ set css_class [expr {$min_level == 1 ? "page_order_region" : "page_order_region_no_target"}]
+#my log allow_reorder=$allow_reorder,min_level=$min_level,css=$css_class
+ set html "\n"
+ set prefix_js ""
+ set html [my page_reorder_open_ul -min_level $min_level -ID $ID -prefix_js $prefix_js -1]
+ set level 0
+ foreach o [$pages children] {
+ $o instvar page_order title name
if {![regexp {^(.*)[.]([^.]+)} $page_order _ parent]} {set parent ""}
- set parent_node [expr {[info exists node($parent)] ? $node($parent) : "root"}]
- set refvar [expr {[my set ajax] ? "ref" : "href"}]
- regsub -all {\"} $label {\"} label
- #my log "$jsobj = {label: \"$label\", id: \"$id\", $refvar: \"$href\", c: $node_cnt};"
- append js \
- "$jsobj = {label: \"$label\", id: \"$id\", $refvar: \"$href\", c: $node_cnt};" \
- "var $node($page_order) = new YAHOO.widget.TextNode($jsobj, $parent_node, $expand);\n" \
- ""
+ set page_number [my page_number $page_order $remove_levels]
+ set new_level [regsub -all {[.]} [$o set page_order] _ page_order_js]
+# my log "[$o set page_order] [my exists open_node($parent)] || [my exists open_node($page_order)]"
+ if {[my exists open_node($parent)] || [my exists open_node($page_order)]} {
+ if {$new_level > $level} {
+ for {set l $level} {$l < $new_level} {incr l} {
+ regexp {^(.*)_[^_]+$} $page_order_js _ prefix_js
+ append html [my page_reorder_open_ul -min_level $min_level -ID $ID -prefix_js $prefix_js $l]
+ }
+ set level $new_level
+ } elseif {$new_level < $level} {
+ for {set l $new_level} {$l < $level} {incr l} {append html "
\n"}
+ set level $new_level
+ }
+ set href [my href $package_id $book_mode $name]
+ set highlight [if {$open_page eq $name} {set _ "style = 'font-weight:bold;'"} {}]
+ set item_id [my page_reorder_item_id -ID $ID -prefix_js $prefix_js -page_order $page_order js]
+ append html \
+ "" \
+ "$page_number $title\n"
+ }
}
- return $js
+ # close all levels
+ for {set l 0} {$l <= $level} {incr l} {append html "\n"}
+ if {$js ne ""} {append html "\n"}
+
+ return $html
}
- toc instproc ajax_tree {js_tree_cmds} {
- return "
-
-
"
+"
}
- toc instproc non_ajax_tree {js_tree_cmds} {
- return "
-
-
"
+ toc instproc yui_non_ajax {} {
+ return "
+ var [my js_name];
+ YAHOO.util.Event.onDOMReady(function() {
+ [my js_name] = new YAHOO.widget.TreeView('[my id]');
+ [my js_name].subscribe('clickEvent',function(oArgs) {
+ //console.info(oArgs);
+ var m = /href=\"(\[^\"\]+)\"/.exec(oArgs.node.html);
+ //console.info(m\[1\]);
+ //window.location.href = m\[1\];
+ return false;
+ });
+ [my js_name].render();
+ });
+ "
}
+ toc instproc build_tree {{-full false} {-remove_levels 0} {-book_mode false} {-open_page ""} pages} {
+ my instvar package_id
+ set tree(-1) [::xowiki::Tree new -destroy_on_cleanup -orderby pos -id [my id]]
+ set pos 0
+ foreach o [$pages children] {
+ $o instvar page_order title name
+ if {![regexp {^(.*)[.]([^.]+)} $page_order _ parent]} {set parent ""}
+ set page_number [my page_number $page_order $remove_levels]
- toc instproc include_head_entries_yui_tree {ajax style} {
- set ajaxhelper 1
-
- ::xo::Page requireCSS "/resources/ajaxhelper/yui/treeview/assets/${style}tree.css"
- if {$style eq ""} {
- ::xowiki::Includelet require_YUI_CSS -ajaxhelper $ajaxhelper \
- treeview/assets/skins/sam/treeview.css
+ set level [regsub -all {[.]} [$o set page_order] _ page_order_js]
+ if {$full || [my exists open_node($parent)] || [my exists open_node($page_order)]} {
+ set href [my href $package_id $book_mode $name]
+ set c [::xowiki::TreeNode new -orderby pos -pos [incr pos] -level $level \
+ -object $o -owner [self] \
+ -label $title -prefix $page_number -href $href \
+ -highlight [expr {$open_page eq $name}] \
+ -expanded true -open_requests 1]
+ set tree($level) $c
+ $tree([expr {$level -1}]) add $c
+ }
}
- ::xowiki::Includelet require_YUI_JS -ajaxhelper $ajaxhelper "yahoo/yahoo-min.js"
- ::xowiki::Includelet require_YUI_JS -ajaxhelper $ajaxhelper "event/event-min.js"
-
- if {$ajax} {
- ::xowiki::Includelet require_YUI_JS -ajaxhelper $ajaxhelper "dom/dom-min.js" ;# ANIM
- ::xowiki::Includelet require_YUI_JS -ajaxhelper $ajaxhelper "connection/connection-min.js"
- ::xowiki::Includelet require_YUI_JS -ajaxhelper $ajaxhelper "animation/animation-min.js" ;# ANIM
- }
- ::xowiki::Includelet require_YUI_JS -ajaxhelper $ajaxhelper "treeview/treeview.js"
+ return $tree(-1)
}
-
- toc instproc render_yui_tree {pages style} {
+ toc instproc render_yui_list {{-full false} pages} {
+ my instvar js
my get_parameters
+ my instvar navigation page_name
+
#
# Render the tree with the yui widget (with or without ajax)
#
@@ -2087,57 +2165,23 @@
set ajax 0
}
my set ajax $ajax
- # do the hard work here....
- set js_tree_cmds [my yui_tree $pages $open_page $package_id $expand_all $remove_levels]
+
if {$ajax} {
- return [my ajax_tree $js_tree_cmds]
+ set js [my yui_ajax]
+ } else {
+ set js [my yui_non_ajax]
}
- return [my non_ajax_tree $js_tree_cmds]
- }
- toc instproc build_navigation {pages} {
- #
- # compute associative arrays open_node and navigation (position
- # and current)
- #
- my get_parameters
- my instvar navigation page_name
- array set navigation {position 0 current ""}
+ set tree [my build_tree -full $full -remove_levels $remove_levels \
+ -book_mode $book_mode -open_page $open_page $pages]
- # the top node is always open
- my set open_node() true
- set node_cnt 0
- foreach o [$pages children] {
- $o instvar page_order name
- incr node_cnt
- set page_name($node_cnt) $name
- if {![regexp {^(.*)[.]([^.]+)} $page_order _ parent]} {set parent ""}
- #
- # If we are on the provided $open_page, we remember our position
- # for the progress bar.
- set on_current_node [expr {$open_page eq $name} ? "true" : "false"]
- if {$on_current_node} {
- set navigation(position) $node_cnt
- set navigation(current) $page_order
- }
- if {$expand_all} {
- my set open_node($page_order) true
- } elseif {$on_current_node} {
- my set open_node($page_order) true
- # make sure to open all nodes to the top
- for {set p $parent} {$p ne ""} {} {
- my set open_node($p) true
- if {![regexp {^(.*)[.]([^.]+)} $p _ p]} {set p ""}
- }
- }
- }
- set navigation(count) $node_cnt
- #my log OPEN=[lsort [my array names open_node]]
+ set HTML [$tree render -style yuitree -js $js]
+ return $HTML
}
- toc instproc render_list {pages} {
+ toc instproc render_list {{-full false} pages} {
my get_parameters
- my instvar navigation page_name
+
#
# Build a reduced toc tree based on pure HTML (no javascript or
# ajax involved). If an open_page is specified, produce an as
@@ -2147,68 +2191,46 @@
# TODO: can we allow open_page and reorder?
set allow_reorder ""
} else {
- set allow_reorder [my page_reorder_check_allow $allow_reorder]
+ set allow_reorder [my page_reorder_check_allow -with_head_entries false $allow_reorder]
}
+ set tree [my build_tree -full $full -remove_levels $remove_levels \
+ -book_mode $book_mode -open_page $open_page $pages]
+
my page_reorder_init_vars -allow_reorder $allow_reorder js last_level ID min_level
+ set js "\nYAHOO.xo_page_order_region.DDApp.package_url = '[$package_id package_url]';"
+ set HTML [$tree render -style listdnd -js $js -context {min_level $min_level}]
+
+ return $HTML
+ }
- set css_class [expr {$min_level == 1 ? "page_order_region" : "page_order_region_no_target"}]
- set html "\n"
- my log 1
- set prefix_js ""
- set html [my page_reorder_open_ul -min_level $min_level -ID $ID -prefix_js $prefix_js -1]
- set level 0
- foreach o [$pages children] {
- $o instvar page_order title name
- if {![regexp {^(.*)[.]([^.]+)} $page_order _ parent]} {set parent ""}
- set page_number [my page_number $page_order $remove_levels]
- set new_level [regsub -all {[.]} [$o set page_order] _ page_order_js]
- if {[my exists open_node($parent)] || [my exists open_node($page_order)]} {
- if {$new_level > $level} {
- for {set l $level} {$l < $new_level} {incr l} {
- regexp {^(.*)_[^_]+$} $page_order_js _ prefix_js
- append html [my page_reorder_open_ul -min_level $min_level -ID $ID -prefix_js $prefix_js $l]
- }
- set level $new_level
- } elseif {$new_level < $level} {
- for {set l $new_level} {$l < $level} {incr l} {append html "
\n"}
- set level $new_level
- }
- set href [my href $package_id $book_mode $name]
- set highlight [if {$open_page eq $name} {set _ "style = 'font-weight:bold;'"} {}]
- set item_id [my page_reorder_item_id -ID $ID -prefix_js $prefix_js -page_order $page_order js]
- append html \
- "" \
- "$page_number $title\n"
- }
- }
- # close all levels
- for {set l 0} {$l <= $level} {incr l} {append html "\n"}
- if {$js ne ""} {append html "\n"}
-
- return $html
+ toc instproc include_head_entries {} {
+ my instvar style renderer
+ ::xowiki::Tree include_head_entries -renderer $renderer -style $style;# FIXME general
}
- toc instproc include_head_entries {} {
+ toc instproc initialize {} {
my get_parameters
- if {$style ne "list"} {
- my include_head_entries_yui_tree $ajax $style
+
+ set list_mode 0
+ switch -- $style {
+ "menu" {set s "menu/"; set renderer yuitree}
+ "folders" {set s "folders/"; set renderer yuitree}
+ "list" {set s ""; set list_mode 1; set renderer list}
+ "default" {set s ""; set renderer yuitree}
}
+ my set renderer $renderer
+ my set style $s
+ my set list_mode $list_mode
}
toc instproc render {} {
my get_parameters
- set list_mode 0
+
if {![my exists id]} {my set id [::xowiki::Includelet html_id [self]]}
if {[info exists category_id]} {my set category_id $category_id}
- switch -- $style {
- "menu" {set s "menu/"}
- "folders" {set s "folders/"}
- "list" {set s ""; set list_mode 1}
- "default" {set s ""}
- }
#
# Collect the pages
#
@@ -2220,10 +2242,11 @@
#
# Call a render on the created structure
#
- if {$list_mode} {
+ if {[my set list_mode]} {
+my log LIST
return [my render_list $pages]
} else {
- return [my render_yui_tree $pages $s]
+ return [my render_yui_list -full true $pages]
}
}
@@ -2349,8 +2372,7 @@
set base [$package_id pretty_link [$__including_page name]]
#set id ID$item_id
#$root setAttribute id $id
- set as_att_value [string map [list & "&" < "<" > ">" \" """ ' "'"] $inner_html]
-
+ set as_att_value [::xowiki::Includelet html_encode $inner_html]
set save_form [subst {
Create Form from Content