## Licensed to the Apache Software Foundation (ASF) under one
## or more contributor license agreements.  See the NOTICE file
## distributed with this work for additional information
## regarding copyright ownership.  The ASF licenses this file
## to you under the Apache License, Version 2.0 (the
## "License"); you may not use this file except in compliance
## with the License.  You may obtain a copy of the License at
##
##   http://www.apache.org/licenses/LICENSE-2.0
##
## Unless required by applicable law or agreed to in writing,
## software distributed under the License is distributed on an
## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
## KIND, either express or implied.  See the License for the
## specific language governing permissions and limitations
## under the License.
#title( 'DisplayTool' )
<p>
$text.demo.thisPage.insert("#doclink( 'DisplayTool' true )").
$text.get('display.intro')
</p>

#set( $toolname = 'display' )
#set( $toolclass = $display.class )
#set( $toollink = $doclink )
#set( $toolDemo = 
"${esc.h}set( ${esc.d}primes = [1, 2, 3, 5, 7, 11] )
${esc.d}display.list(${esc.d}primes)
${esc.d}display.truncate('This sentence should be truncated at 30 characters.')
${esc.d}display.truncate('This will be cut at 15.', 15)
${esc.d}display.alt(${esc.d}primes)
${esc.d}display.alt(${esc.d}null, '--')
${esc.h}set( ${esc.d}demoSize = ${esc.d}display.measure(${esc.d}toolDemo) )
This demo is ${esc.d}demoSize.height lines with a max length of ${esc.d}demoSize.width chars."
)

#parse( 'demo.vm' )
