diff options
author | Qt Continuous Integration System <qt-info@nokia.com> | 2011-07-20 08:21:16 (GMT) |
---|---|---|
committer | Qt Continuous Integration System <qt-info@nokia.com> | 2011-07-20 08:21:16 (GMT) |
commit | 75a891109a9fc7006ee241616a85290334b17012 (patch) | |
tree | 681cce019c231932e15603b1bc6e3cb4f75db9d8 | |
parent | 1541c27f4eeebb73434d77f866c99c937cf6544d (diff) | |
parent | 075b0f744363842ed4179c644d933d461389544f (diff) | |
download | Qt-75a891109a9fc7006ee241616a85290334b17012.zip Qt-75a891109a9fc7006ee241616a85290334b17012.tar.gz Qt-75a891109a9fc7006ee241616a85290334b17012.tar.bz2 |
Merge branch 'master' of git://scm.dev.nokia.troll.no/qt/qt-water-team
* 'master' of git://scm.dev.nokia.troll.no/qt/qt-water-team: (34 commits)
Remove testing for Hide of mainwindow.
Fix accessibility test for QWS.
Fixes leaking X11 SyncCounter when widgets get open/destroyed
Fix the timeout calculation for futexes in QMutex.
Fix test for win and mac.
namespace fix
fix build
get rid of unwanted dependencies and unused header includes
sync qws_dataDir() with coreapp's internal qws_dataDir()
Add constants to QAccessible::Event enum.
Call QAccessible::updateAccessibility when setText is called on QLabel
Added Solaris build fix to the changes file.
Documentation fix.
Fix autotest for accessible tables.
make argument quoting code on windows less arcane
fix argument quoting on windows
Style cleanup - space after flow control keywords.
Add IAccessible2 table2 implementation.
Fix potential crash when clicking in a text edit
Compensate for different rounding rule in CG engine
...
50 files changed, 2342 insertions, 3762 deletions
diff --git a/dist/changes-4.8.0 b/dist/changes-4.8.0 index 0f259b9..247a25a 100644 --- a/dist/changes-4.8.0 +++ b/dist/changes-4.8.0 @@ -176,7 +176,8 @@ Qt for Windows CE **************************************************************************** * Compiler Specific Changes * **************************************************************************** - +- Sun Studio 12 + * Fixed build issues in the OpenGL module on Solaris with CC 5.9. [QTBUG-19641] **************************************************************************** * Tools * diff --git a/doc/src/deployment/deployment.qdoc b/doc/src/deployment/deployment.qdoc index a359787..a13e2b8 100644 --- a/doc/src/deployment/deployment.qdoc +++ b/doc/src/deployment/deployment.qdoc @@ -1555,15 +1555,4 @@ For more information about creating a \c .sis file and installing it to device see also \l {The Symbian platform - Introduction to Qt#Installing your own applications}{here}. - - \section1 Further Reading - - This document aims to cover the common case for developers who want to - deploy Qt applications on devices using the Smart Installer. It does not - aim to cover every possible way of installing applications, Qt and other - dependencies on a device. - - A wider selection of deployment methods is described in the - \l{Deploying a Qt Application article} on the Symbian Foundation - Developer Wiki. */ diff --git a/doc/src/external-resources.qdoc b/doc/src/external-resources.qdoc index 63e11c8..f528bf2 100644 --- a/doc/src/external-resources.qdoc +++ b/doc/src/external-resources.qdoc @@ -425,11 +425,6 @@ */ /*! - \externalpage http://developer.symbian.org/wiki/index.php/Deploying_a_Qt_Application - \title Deploying a Qt Application article -*/ - -/*! \externalpage http://www.ecma-international.org/publications/standards/Ecma-262.htm \title ECMAScript Language Specification */ diff --git a/examples/xml/htmlinfo/apache_org.html b/examples/xml/htmlinfo/apache_org.html deleted file mode 100644 index 9e5e4d3..0000000 --- a/examples/xml/htmlinfo/apache_org.html +++ /dev/null @@ -1,281 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<!-- - 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. ---> -<html xmlns="http://www.w3.org/1999/xhtml"> - <head> - <!-- - XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - This file is generated from XML source: DO NOT EDIT! - XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - --> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> - <link rel="stylesheet" href="./style/compressed.css" type="text/css" media="screen, projection"/> - <link rel="stylesheet" href="./style/style.css" type="text/css" media="screen, projection"/> - <!--[if IE]><link rel="stylesheet" href="./style/ie.css" type="text/css" media="screen, projection"/><![endif]--> -<link rel="alternate" title="announce@apache.org Archives" type="application/atom+xml" href="http://mail-archives.apache.org/mod_mbox/www-announce/?format=atom" /> - <meta name="author" content="The Apache Software Foundation" /><meta name="email" content="apache.AT.apache.DOT.org" /> - <title>Welcome! - The Apache Software Foundation</title> - </head> - <body> - <div class="navigation"> - <ul> - <li><a href="./foundation" title="About the Foundation">Foundation</a></li> - <li><a href="http://projects.apache.org" title="Apache Projects">Projects</a></li> - <li><a href="http://people.apache.org" title="Apache People">People</a></li> - <li><a href="./foundation/getinvolved.html" title="Get involved in Apache">Get Involved</a></li> - <li><a href="./foundation/sponsorship.html" title="Support the mission of Apache">Support Apache</a></li> - <li class="dlink"><a href="./dyn/closer.cgi" title="Download Apache projects">Download</a></li> - </ul> - </div> - <div class="container"> - <hr class="space col"/> - <div class="block"> - <div class="column span-24"> - <div id="header"> - <h1>The Apache Software Foundation<br /> - <span class="alt"><small>Meritocracy in Action.</small></span></h1><p class="blurb">The Apache Software Foundation provides support for the Apache community of open-source software projects. The <a href="http://projects.apache.org/">Apache projects</a> are characterized by a collaborative, consensus based development process, an open and pragmatic software license, and a desire to create high quality software that leads the way in its field.</p><p class="highlight">We consider ourselves not simply a group of projects sharing a server, but rather a <em>community of developers and users</em>.</p> - </div> - </div> - </div> - <hr/> - <div class="block"> - <div class="column span-15 first append-1"> - <h3> - Latest News - </h3> - </div> - <div class="column span-8 las search"> - <form action="http://www.google.com/search" method="get"> - <input value="*.apache.org" name="sitesearch" type="hidden"/> - <input size="10" name="q" id="query" type="text"/> - <input name="Search" value="Go" type="submit"/> - </form> - </div> - </div> - <div class="block content"> - <div class="column span-15 colborder"> - -<div class="section-content"> -<p><em>If you would like to keep up with news and announcements from the -foundation and all its projects, you can subscribe to the -<a href="foundation/mailinglists.html#foundation-announce">Apache -Announcements List</a></em>.</p> - -<h4 id="apachecon-eu"> - Free Video Streams from ApacheCon Europe 2008 -</h4> -<div class="section-content"> -<a href="http://www.eu.apachecon.com/"><img src="images/eu_2008_logo.jpg" alt="ApacheCon Europe 2008" title="ApacheCon Europe 2008" border="0" align="right" /></a> -<p> -ApacheCon Europe 2008 held in Amsterdam was a great success, and attracted higher -than ever attendance figures, with about 500 registered attendees. This -figure represents an increase of more than 40% over the previous year, -demonstrating the rapidly growing interest in Apache and Open Source software -amongst European businesses. - -If you have not been able to attend ApacheCon Europe, you can still watch -<a href="http://streaming.linux-magazin.de/en/archive_apachecon08eu.htm">videos of all keynotes and select talks online</a>. Keynote sessions -and the opening plenary are available <b>free of charge</b>:</p> -<ul> -<li><a href="http://streaming.linux-magazin.de/events/apacheconfree/archive/jjagielski/frames-java.htm" onclick="window.open(this.href, '_blank', 'width=1024, height=768'); return false;">State of the Feather</a> - by Jim Jagielski, Chairman of the Apache Software Foundation</li> -<li><a href="http://streaming.linux-magazin.de/events/apacheconfree/archive/cschmidt/frames-java.htm" onclick="window.open(this.href, '_blank', 'width=1024, height=768'); return false;">Using Audio Technology and Open Content to Reduce Global Illiteracy, Poverty and Disease</a> - by Cliff Schmidt, Executive Director of Literacy Bridge</li> -<li><a href="http://streaming.linux-magazin.de/events/apacheconfree/archive/rghosh/frames-java.htm" onclick="window.open(this.href, '_blank', 'width=1024, height=768'); return false;">Apache and Steam Engines: the Magic of Collaborative Innovation</a> - by Rishab Aiyer Ghosh, Open Source Initiative Board Member</li> -<li><a href="http://streaming.linux-magazin.de/events/apacheconfree/archive/rfielding/frames-java.htm" onclick="window.open(this.href, '_blank', 'width=1024, height=768'); return false;">Apache 3.0 (a Tall Tale)</a> - by Roy Fielding, Co-founder of The Apache Software Foundation, - and Vice President, Apache HTTP Server</li> -</ul> -<p>The talks of the following select ApacheCon Europe tracks are -available for just 49 Euro: -<a href="http://streaming.linux-magazin.de/en/archive_apachecon08eu.htm#wednesday">System Administration</a>, -<a href="http://streaming.linux-magazin.de/en/archive_apachecon08eu.htm#thursday">Web Security</a>, -<a href="http://streaming.linux-magazin.de/en/archive_apachecon08eu.htm#friday">Web Services and Web 2.0</a>. -</p> -<hr /> -</div> - -<h4 id="apachecon-us"> - ApacheCon US 2008 in New Orleans! -</h4> -<div class="section-content"> -<p> - ApacheCon US 2008 will be held 3 November through 7 November in - New Orleans, Louisiana. - The Call for Papers has already closed and the program and further - information will be made available soon on the ApacheCon US 2008 - Web site <a href="http://www.us.apachecon.com/us2008/"><strong>www.us.apachecon.com</strong></a>. - If you would like to receive information about ApacheCon US 2008, please - <a href="mailto:announce-subscribe@apachecon.com">subscribe to - the ApacheCon announcement mailing list</a>. - </p> -<hr /> -</div> - -<h4 id="sun_jck_letter"> - Notice regarding open letter to Sun Microsystems -</h4> -<div class="section-content"> -<p> - The Apache Software Foundation has written an <a href="jcp/sunopenletter.html">open letter</a> - to Sun Microsystems regarding our inabillity to acquire an acceptable license for the test kit - for Java SE needed by <a href="http://harmony.apache.org">Apache Harmony</a>. For futher information - please see the <a href="jcp/sunopenletterfaq.html">FAQ</a> and direct all questions to Apache's VP - for JCP issues, geirm at apache dot org, or our regular press inquiry address, press at apache dot org. - </p> -</div> -</div> - </div> - <div class="column span-8 last"> - <div class="block"> - <div class="nav column span-11"> - <div> - <div class="menuheader"><a -href="http://projects.apache.org/">Apache Projects</a></div> - <ul> - <li><a href="http://httpd.apache.org/" title="Apache Web Server (httpd)">HTTP Server</a></li> - <li><a href="http://activemq.apache.org/" title="Distributed Messaging System">ActiveMQ</a></li> - <li><a href="http://ant.apache.org/" title="Java-based build tool">Ant</a></li> - <li><a href="http://apr.apache.org/" title="Apache Portable Runtime libraries">APR</a></li> - <li><a href="http://archiva.apache.org/" title="Build Artifact Repository Manager">Archiva</a></li> - <li><a href="http://beehive.apache.org/" title="Metadata frameworks for enterprise applications">Beehive</a></li> - <li><a href="http://cayenne.apache.org/" title="User-friendly Java ORM with Tools">Cayenne</a></li> - <li><a href="http://cocoon.apache.org/" title="Web development framework: separation of concerns, component-based">Cocoon</a></li> - <li><a href="http://commons.apache.org/" title="Reusable Java components">Commons</a></li> - <li><a href="http://continuum.apache.org/" title="Continuous Integration and Build Server">Continuum</a></li> - <li><a href="http://cxf.apache.org/" title="Service Framework">CXF</a></li> - <li><a href="http://db.apache.org/" title="Database access">DB</a></li> - <li><a href="http://directory.apache.org/" title="Apache Directory Server">Directory</a></li> - <li><a href="http://excalibur.apache.org/" title="Embeddable software libraries related to component and service management access">Excalibur</a></li> - <li><a href="http://felix.apache.org/" title="OSGi Framework and components.">Felix</a></li> - <li><a href="http://forrest.apache.org/" title="Aggregated multi-channel documentation, separation of concerns">Forrest</a></li> - <li><a href="http://geronimo.apache.org/" title="Java2, Enterprise Edition (J2EE) container">Geronimo</a></li> - <li><a href="http://gump.apache.org/" title="Continuous integration of open source projects">Gump</a></li> - <li><a href="http://hadoop.apache.org/" title="Distributed computing platform">Hadoop</a></li> - <li><a href="http://harmony.apache.org/" title="Open source implementation of Java SE">Harmony</a></li> - <li><a href="http://hivemind.apache.org/" title="A services and configuration microkernel">HiveMind</a></li> - <li><a href="http://hc.apache.org/" title="Java toolset of low level HTTP components">HttpComponents</a></li> - <li><a href="http://ibatis.apache.org/" title="SQL Data Mapper for Java and .NET">iBATIS</a></li> - <li><a href="http://incubator.apache.org/" title="Shepherd for new projects">Incubator</a></li> - <li><a href="http://jackrabbit.apache.org/" title="Content Repository for Java">Jackrabbit</a></li> - <li><a href="http://jakarta.apache.org/" title="Server-side Java">Jakarta</a></li> - <li><a href="http://james.apache.org/" title="Java Apache Mail Enterprise Server">James</a></li> - <li><a href="http://labs.apache.org/" title="The Innovation Laboratories of the Apache Software Foundation">Labs</a></li> - <li><a href="http://lenya.apache.org/" title="Content Management System">Lenya</a></li> - <li><a href="http://logging.apache.org/" title="Cross-language logging services">Logging</a></li> - <li><a href="http://lucene.apache.org/" title="Search engine library">Lucene</a></li> - <li><a href="http://maven.apache.org/" title="Java project management and comprehension tools">Maven</a></li> - <li><a href="http://mina.apache.org/" title="Multipurpose Infrastructure for Network Application">Mina</a></li> - <li><a href="http://myfaces.apache.org/" title="JavaServer(tm) Faces implementation and components">MyFaces</a></li> - <li><a href="http://ode.apache.org/" title="Orchestration Director Engine: Business Process Management (BPM), Process Orchestration and Workflow through service compositioni.">ODE</a></li> - <li><a href="http://ofbiz.apache.org/" title="Open for Business: enterprise automation software">OFBiz</a></li> - <li><a href="http://openejb.apache.org/" title="OpenEJB: a modular, configurable, and extendable EJB Container System and Server">OpenEJB</a></li> - <li><a href="http://openjpa.apache.org/" title="OpenJPA: Object Relational Mapping for Java">OpenJPA</a></li> - <li><a href="http://perl.apache.org/" title="Dynamic websites using Perl">Perl</a></li> - <li><a href="http://poi.apache.org/" title="Java API for OLE 2 Compound Documents">POI</a></li> - <li><a href="http://portals.apache.org/" title="Portal technology">Portals</a></li> - <li><a href="http://roller.apache.org/" title="Java blog server">Roller</a></li> - <li><a href="http://santuario.apache.org/" title="XML Security in Java and C++">Santuario</a></li> - <li><a href="http://servicemix.apache.org/" title="Enterprise Service Bus">ServiceMix</a></li> - <li><a href="http://shale.apache.org/" title="Web application framework based on JavaServer(tm) Faces">Shale</a></li> - <li><a href="http://spamassassin.apache.org/" title="Mail filter to identify spam">SpamAssassin</a></li> - <li><a href="http://stdcxx.apache.org/" title="Apache C++ Standard Library">STDCXX</a></li> - <li><a href="http://struts.apache.org/" title="Model 2 framework for building Java web applications">Struts</a></li> - <li><a href="http://synapse.apache.org/" title="Enterprise Service Bus and Mediation Framework">Synapse</a></li> - <li><a href="http://tapestry.apache.org/" title="Component-based Java Web Application Framework">Tapestry</a></li> - <li><a href="http://tcl.apache.org/" title="Dynamic websites using TCL">TCL</a></li> - <li><a href="http://tiles.apache.org/" title="A templating framework for web application user interfaces">Tiles</a></li> - <li><a href="http://tomcat.apache.org/" title="A Java Servlet and JSP Container">Tomcat</a></li> - <li><a href="http://turbine.apache.org/" title="A Java Servlet Web Application Framework and associated component library"> - Turbine</a></li> - <li><a href="http://velocity.apache.org/" title="A Java Templating Engine">Velocity</a></li> - <li><a href="http://wicket.apache.org/" title="Component-based Java Web Application Framework.">Wicket</a></li> - <li><a href="http://ws.apache.org/">Web Services</a></li> - <li><a href="http://xalan.apache.org/" title="XSLT processors in Java and C++">Xalan</a></li> - <li><a href="http://xerces.apache.org/" title="XML parsers in Java, C++ and Perl">Xerces</a></li> - <li><a href="http://xml.apache.org/" title="XML solutions focused on the web">XML</a></li> - <li><a href="http://xmlbeans.apache.org/" title="XML-Java binding tool">XMLBeans</a></li> - <li><a href="http://xmlgraphics.apache.org/" title="Conversion from XML to graphical output">XML Graphics</a></li> - </ul> - </div> - </div> - <div class="nav column prepend-1 span-12 last"> - <h6><a -href="/foundation/">Foundation</a></h6> - <ul> - <li><a href="/foundation/faq.html">FAQ</a></li> - <li><a href="/licenses/">Licenses</a></li> - <li><a href="/foundation/news.html">News</a></li> - <li><a href="/foundation/records/">Public Records</a></li> - <li><a href="/foundation/sponsorship.html">Sponsorship</a></li> - <li><a href="/foundation/contributing.html">Donations</a></li> - <li><a href="/foundation/thanks.html">Thanks</a></li> - <li><a href="/foundation/contact.html">Contact</a></li> - </ul> - <h6>Foundation Projects</h6> - <ul> - <li><a href="/foundation/conferences.html" title="Meetings of developers and users">Conferences</a></li> - <li><a href="/dev/" title="ASF Infrastructure: Operations and howto documents for PMCs and contributors">Infrastructure</a></li> - <li><a href="/jcp/" title="Apache and the Java Community Process">JCP</a></li> - </ul> - <h6>How it works</h6> - <ul> - <li><a href="/foundation/how-it-works.html">Introduction</a></li> - <li><a href="/foundation/how-it-works.html#meritocracy">Meritocracy</a></li> - <li><a href="/foundation/how-it-works.html#structure">Structure</a></li> - <li><a href="/foundation/how-it-works.html#roles">Roles</a></li> - <li><a href="/foundation/how-it-works.html#management">Collaboration</a></li> - <li><a href="/foundation/how-it-works.html#infrastructure">Infrastructure</a></li> - <li><a href="/foundation/how-it-works.html#incubator">Incubator</a></li> - <li><a href="/foundation/how-it-works.html#other">Other entities</a></li> - <li><a href="/foundation/glossary.html">Glossary</a></li> - <li><a href="/foundation/voting.html">Voting</a></li> - </ul> - <h6><a -href="/foundation/getinvolved.html">Get Involved</a></h6> - <ul> - <li><a href="/foundation/mailinglists.html">Mailing Lists</a></li> - <li><a href="/dev/version-control.html">Version Control</a></li> - <li><a href="/dev/">Developer Info</a></li> - </ul> - <h6>Download</h6> - <ul> - <li><a href="/dyn/closer.cgi">from a mirror</a></li> - </ul> - <h6>Related Sites</h6> - <ul> - <li><a href="http://apachecon.com/" title="Official Apache Conference">ApacheCon</a></li> - <li><a href="http://apachebookstore.com/" title="Apache Books">Bookstore</a></li> - <li><a href="http://feathercast.org/" title="Apache Podcasts">Feathercast</a></li> - <li><a href="http://planetapache.org/" title="Apache Community Blogs">PlanetApache</a></li> - </ul> - </div> - </div> - </div> - <div class="column span-24 footer"> - <hr/> - <p>Copyright © 2008 The Apache Software Foundation, Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p> - </div> - </div> - </div> -</body> -</html> - diff --git a/examples/xml/htmlinfo/htmlinfo.html b/examples/xml/htmlinfo/htmlinfo.html new file mode 100644 index 0000000..33e296a --- /dev/null +++ b/examples/xml/htmlinfo/htmlinfo.html @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** GNU Free Documentation License +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms +** and conditions contained in a signed written agreement between you +** and Nokia. +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +--> +<html> + <head> + <title>HTML Info Example.</title> + </head> + <body> + + The XML HTML Info example provides a simple command line utility that + scans the current directory for HTML files and prints statistics about + them to standard out. + + \note Standard out is redirected on some platforms. On Symbian using Open + C \c stdout is by default directed to the console window, but this window + may not always be visible. To redirect to a file instead, locate the \c + c:\\system\\data\\config.ini file (on either the emulator or the device) + and change \c STDOUT to point to \c MEDIA4. This will redirect the console + to \c c:\\system\\data\\out.txt. + + The files are parsed using a QXmlStreamReader object. If the file does + not contain a well-formed XML document, a description of the error is + printed to the standard error console. + </body> +</html> diff --git a/examples/xml/htmlinfo/nokia_com.html b/examples/xml/htmlinfo/nokia_com.html deleted file mode 100644 index 46d4c95..0000000 --- a/examples/xml/htmlinfo/nokia_com.html +++ /dev/null @@ -1,215 +0,0 @@ - - -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" - "http://www.w3.org/TR/html4/loose.dtd"> - -<html> -<head> - - - <!--startindex--> - <title>Nokia - Nokia on the Web</title> - - - <meta name="description" content="Nokia is the world's leading mobile phone supplier and a leading supplier of mobile and fixed telecom networks including related customer services."/> - <meta name="keywords" content="Nokia,mobile phones,cellular,telecommunications,wireless networks,datacom,GSM,multimedia terminals,handsets,customer services,press releases,financial information,student exchange,open positions,employment opportunities,career opportunities"/> - <meta name="modified" content=""/> - <meta name="category" content="Landing Page Global Flash"/> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> - <meta name="siteid" content="101"/> - - <!--stopindex--> - <link href="/css/style_46.css" rel="stylesheet" type="text/css"> - - <link href="/NOKIA_COM_1/Home/Landing_page_2007/wayfinder.css" rel="stylesheet" type="text/css"/> - -<script type="text/javascript"> - var useHbx = true; -</script> - - -<!--WEBSIDESTORY CODE HBX1.0 (Universal)--> -<!--COPYRIGHT 1997-2005 WEBSIDESTORY,INC. ALL RIGHTS RESERVED. U.S.PATENT No. 6,393,479B1. MORE INFO:http://websidestory.com/privacy--> -<script language="javascript"> -var _hbEC=0,_hbE=new Array;function _hbEvent(a,b){b=_hbE[_hbEC++]=new Object();b._N=a;b._C=0;return b;} -var hbx=_hbEvent("pv");hbx.vpc="HBX0100u";hbx.gn="ehg-nokiafin.hitbox.com"; - -//BEGIN EDITABLE SECTION -//CONFIGURATION VARIABLES -hbx.acct="DM550514HPNZ";//ACCOUNT NUMBER(S) -hbx.pn="Home";//PAGE NAME(S) -hbx.mlc="/Home";//MULTI-LEVEL CONTENT CATEGORY -hbx.pndef="title";//DEFAULT PAGE NAME -hbx.ctdef="full";//DEFAULT CONTENT CATEGORY - -//OPTIONAL PAGE VARIABLES -//ACTION SETTINGS -hbx.fv="";//FORM VALIDATION MINIMUM ELEMENTS OR SUBMIT FUNCTION NAME -hbx.lt="none";//LINK TRACKING -hbx.dlf="n";//DOWNLOAD FILTER -hbx.dft="n";//DOWNLOAD FILE NAMING -hbx.elf="n";//EXIT LINK FILTER - -//SEGMENTS AND FUNNELS -hbx.seg="";//VISITOR SEGMENTATION -hbx.fnl="";//FUNNELS - -//CAMPAIGNS -hbx.cmp="";//CAMPAIGN ID -hbx.cmpn="";//CAMPAIGN ID IN QUERY -hbx.dcmp="";//DYNAMIC CAMPAIGN ID -hbx.dcmpn="";//DYNAMIC CAMPAIGN ID IN QUERY -hbx.dcmpe="";//DYNAMIC CAMPAIGN EXPIRATION -hbx.dcmpre="";//DYNAMIC CAMPAIGN RESPONSE EXPIRATION -hbx.hra="";//RESPONSE ATTRIBUTE -hbx.hqsr="";//RESPONSE ATTRIBUTE IN REFERRAL QUERY -hbx.hqsp="";//RESPONSE ATTRIBUTE IN QUERY -hbx.hlt="";//LEAD TRACKING -hbx.hla="";//LEAD ATTRIBUTE -hbx.gp="";//CAMPAIGN GOAL -hbx.gpn="";//CAMPAIGN GOAL IN QUERY -hbx.hcn="";//CONVERSION ATTRIBUTE -hbx.hcv="";//CONVERSION VALUE -hbx.cp="null";//LEGACY CAMPAIGN -hbx.cpd="";//CAMPAIGN DOMAIN - -//CUSTOM VARIABLES -hbx.ci="";//CUSTOMER ID -hbx.hc1="";//CUSTOM 1 -hbx.hc2="";//CUSTOM 2 -hbx.hc3="";//CUSTOM 3 -hbx.hc4="";//CUSTOM 4 -hbx.hrf="";//CUSTOM REFERRER -hbx.pec="";//ERROR CODES - - -var cookieName = 'MyNokia'; -var nameEQ = cookieName + "="; -var ca = document.cookie.split(';'); -for(var i=0;i < ca.length;i++) { - var c = ca[i]; - while (c.charAt(0)==' ') c = c.substring(1,c.length); - if (c.indexOf(nameEQ) == 0) { - hbx.ci = c.substring(nameEQ.length,c.length); - } -} - -//INSERT CUSTOM EVENTS -hbx.acct="DM550514HPNZ"; -hbx.mlc="/Home"; -hbx.pn="Home"; -hbx.lt="auto"; - - -//END EDITABLE SECTION - -//REQUIRED SECTION. CHANGE "YOURSERVER" TO VALID LOCATION ON YOUR WEB SERVER (HTTPS IF FROM SECURE SERVER) -</script><script language="javascript1.1" defer src="/Hitbox/hbx_5.js"></script> -<script language="javascript">if(navigator.appName!='Netscape'&&parseInt(navigator.appVersion)==4)document.write("<\!"+"--")</script><noscript> -<img src="http://ehg-nokiafin.hitbox.com/HG?hc=we88&cd=1&hv=6&ce=u&hb=DM550514HPNZ&n=Home&vcon=/Home&seg=&cmp=&gp=&fnl=&pec=&dcmp=&ra=&gn=&cv=&ld=&la=&c1=&c2=&c3=&c4=&vpc=090101rn" border="0" width="1" height="1"> -</noscript><!--//--> - -<!--END WEBSIDESTORY CODE--> - - - - - -</head> -<body lang='en' - style="margin: 0 0 0 0;" bgcolor="#FFFFFF" link="#0033cc" text="#000000" alink="#0033cc" vlink="#800080"> - <div class="pagecontainer"> - - -<!-- start page template [Generated JSP Servlet: class=jsp_servlet._templates._page.__template6layout] --> - - - - - - - - - - - <!--startindex--> - - - -<!-- Begin template '/templates/content/plain.jsp' --> - -<div id="wayfinderContainer"> - <div id="branding"> - <img src="/NOKIA_COM_1/Home/Landing_page_2007/noflash_img/nokia_connecting_people.png" alt="Nokia - Connecting people" /> - - </div> - - <div id="flashcontent"> - - <!-- main page noflash content --> - <div id="mainContentGlobal"> - <div id="mainHdr"><h1>Welcome to Nokia</h1></div> - <div id="selectContainer"> - <h2>Where would you like to go?</h2> - <div id="selectLinks"> - <ul class="mainpage"> - <li><a href="/A4176248">Africa</a></li> - <li><a href="/A4138125">Asia Pacific</a></li> - <li><a href="/A4138121">Europe</a></li> - <li><a href="/A4138127">Latin America</a></li> - <li><a href="/A4176245">Middle East</a></li> - <li><a href="/A4138126">North America</a></li> - </ul> - </div> - </div> - <!-- <a id="banner" href="http://www.nokia.com/seasonsgreetings/">Seasons Greetings</a> --> - </div> - <div id="navi"> - <ul> - <li><a href="http://www.nokiaforbusiness.com/">Nokia for Business</a></li> - <li><a href="http://www.nokia.com/aboutnokia">About Nokia</a></li> - <li><a href="http://www.nokia.com/developers">Developers</a></li> - <li><a href="http://www.nokia.com/press">Press</a></li> - <li class="lastitem"><a href="http://www.nokia.com/investors">Investors</a></li> - <!-- <li class="lastitem"><a href="http://www.nokia.com/environment">Environment</a></li> --> - </ul> - </div> - <!-- noflash content ends --> - - </div> - - <div id="footer"> - <ul> - <li><a href="http://www.nokia.com/siteterms">Site Terms</a></li> - <li class="lastitem"><a href="http://www.nokia.com/privacypolicy">Privacy Policy</a></li> - <span>Copyright © 2008 Nokia. All rights reserved</span> - </ul> - <br /><br /> - </div> -</div> - -<script type="text/javascript" src="/NOKIA_COM_1/javascript/flash_detection_main.js"></script> <!-- for redirection to mobile site --> -<script type="text/javascript" src="/EUROPE_NOKIA_COM_3/flash/swfobject.js"></script> -<script type="text/javascript" src="/NOKIA_COM_1/javascript/cookies.js"></script> -<script type="text/javascript" > - // <![CDATA[ - var so = new SWFObject("/NOKIA_COM_1/Home/Landing_page_2007/wayfinder_assets.swf", "wayfinder", "736", "560", "7"); - so.addParam("allowscriptaccess", "always"); - so.addParam("base", "/NOKIA_COM_1/Home/Landing_page_2007/"); - so.write("flashcontent"); - // ]]> -</script> - -<!-- End template '/templates/content/plain.jsp' --> - <!--stopindex--> - - - - - - </div> -</body> - - - </html> - diff --git a/examples/xml/htmlinfo/resources.qrc b/examples/xml/htmlinfo/resources.qrc index a8cf88d..86d8416 100644 --- a/examples/xml/htmlinfo/resources.qrc +++ b/examples/xml/htmlinfo/resources.qrc @@ -1,11 +1,7 @@ <RCC> <qresource prefix="/"> - <file>apache_org.html</file> - <file>nokia_com.html</file> <file>simpleexample.html</file> - <file>trolltech_com.html</file> - <file>w3c_org.html</file> - <file>youtube_com.html</file> + <file>htmlinfo.html</file> </qresource> </RCC> diff --git a/examples/xml/htmlinfo/simpleexample.html b/examples/xml/htmlinfo/simpleexample.html index 83a55cf..28aaa6b 100644 --- a/examples/xml/htmlinfo/simpleexample.html +++ b/examples/xml/htmlinfo/simpleexample.html @@ -1,7 +1,35 @@ <?xml version="1.0" encoding="UTF-8"?> +<!-- +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** GNU Free Documentation License +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms +** and conditions contained in a signed written agreement between you +** and Nokia. +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +--> <html> <head> - <title>Qt is cute! Frans is too!</title> + <title>Qt is cute!</title> </head> <body> <p>A paragraph.</p> diff --git a/examples/xml/htmlinfo/trolltech_com.html b/examples/xml/htmlinfo/trolltech_com.html deleted file mode 100644 index 180eb74..0000000 --- a/examples/xml/htmlinfo/trolltech_com.html +++ /dev/null @@ -1,955 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> - - - -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" - lang="en"> - - <head> - <meta http-equiv="Content-Type" - content="text/html;charset=utf-8" /> - - <title> - Code Less. Create More. Deploy Everywhere. - — - Trolltech - </title> - - - <!-- ADD ON UPDATE --> - - <meta name="author" content="Trolltech" /> - <meta name="description" - content="Trolltech creates application development platforms for desktop and mobile device innovation." /> - <meta name="keywords" content="" /> - -<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"><!-- --></script> -<script type="text/javascript"> - <!-- Urchin script - _uacct = "UA-4457116-1"; - urchinTracker(); - --> - </script> - - <base href="http://trolltech.com/homepage" /> - - - - <meta name="generator" content="Plone - http://plone.org" /> - - - <!-- Plone ECMAScripts --> - - - - - <script type="text/javascript" - src="http://trolltech.com/portal_javascripts/TTSkin/ploneScripts2804.js"> - </script> - - - - <script type="text/javascript" - src="http://trolltech.com/portal_javascripts/TTSkin/ploneScripts0445.js"> - </script> - - - - <script type="text/javascript" - src="http://trolltech.com/portal_javascripts/TTSkin/ploneScripts5940.js"> - </script> - - - - <script type="text/javascript" - src="http://trolltech.com/portal_javascripts/TTSkin/linkpopper.js"> - </script> - - - - <script type="text/javascript" - src="http://trolltech.com/portal_javascripts/TTSkin/ploneScripts7743.js"> - </script> - - - - - - - - - - - - - - - <style type="text/css"><!-- @import url(http://trolltech.com/portal_css/TTSkin/ploneStyles1145.css); --></style> - - - - - - - - - <style type="text/css" - media="screen"><!-- @import url(http://trolltech.com/portal_css/TTSkin/ploneStyles8707.css); --></style> - - - - - - - - - - - <!-- Internet Explorer CSS Fixes --> - <!--[if IE]> - <style type="text/css" media="all">@import url(http://trolltech.com/IEFixes.css);</style> - <![endif]--> - - <link rel="shortcut icon" type="image/x-icon" - href="http://trolltech.com/favicon.ico" /> - - <link rel="home" href="http://trolltech.com" - title="Front page" /> - <link rel="search" - href="http://trolltech.com/search_form" - title="Search this site" /> - <link rel="author" - href="http://trolltech.com/author/admin" - title="Author information" /> - <link rel="contents" href="http://trolltech.com/sitemap" - title="Site Map" /> - - - - - - - - - - <!-- Disable IE6 image toolbar --> - <meta http-equiv="imagetoolbar" content="no" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - </head> - - <body class="section-homepage" dir="ltr"> - <div id="visual-portal-wrapper"> - <div id="portal-top"> - - <div id="portal-header"> - <a class="hiddenStructure" accesskey="2" - href="http://trolltech.com/#documentContent">Skip to content.</a> - - <a class="hiddenStructure" accesskey="6" - href="http://trolltech.com/#portlet-navigation-tree">Skip to navigation</a> - - <div class="middlesex"> - <ul id="portal-siteactions"> - - <li id="siteaction-sitemap"><a - href="http://trolltech.com/sitemap" accesskey="3" - title="Site Map">Site Map</a></li> - <li id="siteaction-accessibility"><a - href="http://trolltech.com/accessibility-info" - accesskey="0" title="Accessibility">Accessibility</a></li> - <li id="siteaction-contact"><a - href="http://trolltech.com/contact" accesskey="9" - title="Contact">Contact</a></li> - -</ul> - - <div id="portal-searchbox"> - <form name="searchform" - action="http://trolltech.com/search" - style="white-space:nowrap" - onsubmit="return liveSearchSubmit()"> - - <label for="searchGadget" class="hiddenStructure">Search Site</label> - - <div class="LSBox"> - <input id="searchGadget" name="SearchableText" - type="text" size="15" title="Search Site" - accesskey="4" class="visibility:visible" /> - - <input class="searchButton" type="submit" - value="Search" /> - - <div class="LSResult" id="LSResult" style=""><div class="LSShadow" id="LSShadow"></div></div> - </div> - </form> - - <div id="portal-advanced-search" class="hiddenStructure"> - <a href="http://trolltech.com/search_form" - accesskey="5"> - Advanced Search… - </a> - </div> - -</div> - - <div id="country-flags"> - <a href="/lang/cn/"><img class="flag" - border="0" width="30" height="20" src="chineseflag.png" /></a> - <a href="/lang/japanese/"><img - class="flag" border="0" width="30" height="20" - src="japaneseflag.png" /></a> - </div> - <h1 id="portal-logo"> - <a href="http://trolltech.com" accesskey="1">Trolltech</a> -</h1> - - <div id="portal-skinswitcher"> - -</div> - </div> - - - <h5 class="hiddenStructure">Sections</h5> - <div id="portal-globalnav"> - <div class="middlesex"> - <ul> - <li id="portaltab-index_html" - class="selected indextab"><a - href="http://trolltech.com">Home</a></li> - - <li id="portaltab-products" - class="plain"><a - href="http://trolltech.com/products" title="">Products and Services</a></li> - - - <li id="portaltab-solutions" - class="plain"><a - href="http://trolltech.com/solutions" title="">Solutions</a></li> - - - <li id="portaltab-developer" - class="plain"><a - href="http://trolltech.com/developer" title="">Developer Resources</a></li> - - - <li id="portaltab-company" class="plain"><a - href="http://trolltech.com/company" title="">Company</a></li> - - - <li id="portaltab-downloads" - class="plain"><a - href="http://trolltech.com/downloads" title="">Downloads</a></li> - - - - - </ul> - </div> - </div> - - </div> - <div id="portal-personaltools-wrapper"> - -<h5 class="hiddenStructure">Personal tools</h5> - - -</div> - - <div class="middlesex"> - <div id="portal-breadcrumbs"> - - <span id="breadcrumbs-you-are-here">You -are here:</span> - <a href="http://trolltech.com">Home</a> - - -</div> - </div> - </div> - - <div class="visualClear"><!-- --></div> - - - <table id="portal-columns"> - <tbody> - <tr> - - - - - - <td id="portal-column-content"> - - - <div id="content" class=""> - - - - <div class="documentContent" id="region-content"> - - <a name="documentContent"></a> - - - - - - - - - - - - <!-- <table id="frontpagetable" cellpadding="0" cellspacing="0" tal:attributes="width pagew"> --> <!-- tal:on-error="string:replace with error template" Fetch image width here --> - <table id="frontpagetable" cellpadding="0" - cellspacing="0" width="712"> - <tr> - <td colspan="2"> - - <h2>Trolltech provides cross-platform software solutions for:</h2> - <table id="fpSolutions" class="solutions" cellpadding="0" cellspacing="6" width="100%"> - <tbody> - <tr> - <td> - <!-- GRANTHAM STYLE --> - <a class="roundedButton" - title="" - href="http://trolltech.com/solutions/managing-development"> - <span class="buttonTop"><span class="roundedButtonTL"><span class="roundedButtonTR"></span></span></span> - <span class="buttonLeft"> - <span class="buttonRight"><span - class="buttonArrow">Software Development Managers</span></span> - </span> - <span class="buttonBottom"><span class="roundedButtonBL"><span class="roundedButtonBR"></span></span></span> - </a> - <!-- OLD STYLE - <div class="roundedBlock" - tal:attributes="title python:solution.Description(); - class python:test(repeat['solution'].odd(), 'roundedBlock odd', 'roundedBlock')"> - <span class="portletTopLeft"></span> - <span class="portletTopRight"></span> - <div class="innerRoundedBlock"> - <a href="#" - tal:attributes="href python:solution.absolute_url()"> - <span class="arrow"></span> - <strong tal:content="python:solution.Title()"> - Title - </strong> - </a> - </div> - <span class="portletBottomLeft"></span> - <span class="portletBottomRight"></span> - </div> - --> - </td> - <td> - <!-- GRANTHAM STYLE --> - <a class="roundedButton" - title="" - href="http://trolltech.com/solutions/industrial-embedded-development"> - <span class="buttonTop"><span class="roundedButtonTL"><span class="roundedButtonTR"></span></span></span> - <span class="buttonLeft"> - <span class="buttonRight"><span - class="buttonArrow">Embedded Developers</span></span> - </span> - <span class="buttonBottom"><span class="roundedButtonBL"><span class="roundedButtonBR"></span></span></span> - </a> - <!-- OLD STYLE - <div class="roundedBlock" - tal:attributes="title python:solution.Description(); - class python:test(repeat['solution'].odd(), 'roundedBlock odd', 'roundedBlock')"> - <span class="portletTopLeft"></span> - <span class="portletTopRight"></span> - <div class="innerRoundedBlock"> - <a href="#" - tal:attributes="href python:solution.absolute_url()"> - <span class="arrow"></span> - <strong tal:content="python:solution.Title()"> - Title - </strong> - </a> - </div> - <span class="portletBottomLeft"></span> - <span class="portletBottomRight"></span> - </div> - --> - </td> - - </tr> - <tr> - <td> - <!-- GRANTHAM STYLE --> - <a class="roundedButton" - title="" - href="http://trolltech.com/solutions/ce-mobile-vendors"> - <span class="buttonTop"><span class="roundedButtonTL"><span class="roundedButtonTR"></span></span></span> - <span class="buttonLeft"> - <span class="buttonRight"><span - class="buttonArrow">Consumer Electronics Vendors</span></span> - </span> - <span class="buttonBottom"><span class="roundedButtonBL"><span class="roundedButtonBR"></span></span></span> - </a> - <!-- OLD STYLE - <div class="roundedBlock" - tal:attributes="title python:solution.Description(); - class python:test(repeat['solution'].odd(), 'roundedBlock odd', 'roundedBlock')"> - <span class="portletTopLeft"></span> - <span class="portletTopRight"></span> - <div class="innerRoundedBlock"> - <a href="#" - tal:attributes="href python:solution.absolute_url()"> - <span class="arrow"></span> - <strong tal:content="python:solution.Title()"> - Title - </strong> - </a> - </div> - <span class="portletBottomLeft"></span> - <span class="portletBottomRight"></span> - </div> - --> - </td> - <td> - <!-- GRANTHAM STYLE --> - <a class="roundedButton" - title="" - href="http://trolltech.com/solutions/mobile-application-development"> - <span class="buttonTop"><span class="roundedButtonTL"><span class="roundedButtonTR"></span></span></span> - <span class="buttonLeft"> - <span class="buttonRight"><span - class="buttonArrow">Mobile Application Developers</span></span> - </span> - <span class="buttonBottom"><span class="roundedButtonBL"><span class="roundedButtonBR"></span></span></span> - </a> - <!-- OLD STYLE - <div class="roundedBlock" - tal:attributes="title python:solution.Description(); - class python:test(repeat['solution'].odd(), 'roundedBlock odd', 'roundedBlock')"> - <span class="portletTopLeft"></span> - <span class="portletTopRight"></span> - <div class="innerRoundedBlock"> - <a href="#" - tal:attributes="href python:solution.absolute_url()"> - <span class="arrow"></span> - <strong tal:content="python:solution.Title()"> - Title - </strong> - </a> - </div> - <span class="portletBottomLeft"></span> - <span class="portletBottomRight"></span> - </div> - --> - </td> - - </tr> - <tr> - <td> - <!-- GRANTHAM STYLE --> - <a class="roundedButton" - title="" - href="http://trolltech.com/solutions/application-development"> - <span class="buttonTop"><span class="roundedButtonTL"><span class="roundedButtonTR"></span></span></span> - <span class="buttonLeft"> - <span class="buttonRight"><span - class="buttonArrow">Cross-Platform Developers</span></span> - </span> - <span class="buttonBottom"><span class="roundedButtonBL"><span class="roundedButtonBR"></span></span></span> - </a> - <!-- OLD STYLE - <div class="roundedBlock" - tal:attributes="title python:solution.Description(); - class python:test(repeat['solution'].odd(), 'roundedBlock odd', 'roundedBlock')"> - <span class="portletTopLeft"></span> - <span class="portletTopRight"></span> - <div class="innerRoundedBlock"> - <a href="#" - tal:attributes="href python:solution.absolute_url()"> - <span class="arrow"></span> - <strong tal:content="python:solution.Title()"> - Title - </strong> - </a> - </div> - <span class="portletBottomLeft"></span> - <span class="portletBottomRight"></span> - </div> - --> - </td> - <td> - <!-- GRANTHAM STYLE --> - <a class="roundedButton" - title="" - href="http://trolltech.com/solutions/solutions-opensource"> - <span class="buttonTop"><span class="roundedButtonTL"><span class="roundedButtonTR"></span></span></span> - <span class="buttonLeft"> - <span class="buttonRight"><span - class="buttonArrow">Open Source Developers</span></span> - </span> - <span class="buttonBottom"><span class="roundedButtonBL"><span class="roundedButtonBR"></span></span></span> - </a> - <!-- OLD STYLE - <div class="roundedBlock" - tal:attributes="title python:solution.Description(); - class python:test(repeat['solution'].odd(), 'roundedBlock odd', 'roundedBlock')"> - <span class="portletTopLeft"></span> - <span class="portletTopRight"></span> - <div class="innerRoundedBlock"> - <a href="#" - tal:attributes="href python:solution.absolute_url()"> - <span class="arrow"></span> - <strong tal:content="python:solution.Title()"> - Title - </strong> - </a> - </div> - <span class="portletBottomLeft"></span> - <span class="portletBottomRight"></span> - </div> - --> - </td> - - </tr> - </tbody> - </table> - - </td> - </tr> - - <!-- BANNER --> - - <tr class="minspacerow"> - <td colspan="2"> - - <div id="flashcontent"> - - - <!-- In case of no imagemap --> - <a - href="http://trolltech.com/products/qt/learnmore/whitepapers"> - <img border="0" - src="http://trolltech.com/include/features/frontpage/whitepaper-feature/mainsplash" - alt="Code Less. Create More. Deploy Everywhere." - height="100" width="700" /> - </a> - - - </div> - - - - </td> - </tr> - - <!-- Product Feature rows --> - <tr id="productfeatures" class="minspacerow"> - <td style="width:350px;"> - <div class="viewlet productviewlet"> -<p class="discreet"><a title="Downloads" href="downloads/index"><img class="image-right" src="images/frontpage/qt_download_90.png" alt="Download Qt Button: Grey BG" /></a></p> -<h2>Qt</h2> -<p>Qt is a cross-platform application framework. It includes:</p> -<ul><li>An <a title="C++ Class Library" href="products/qt/features/library/index">intuitive class library</a></li><li>Integrated <a title="Development Tools" href="products/qt/features/tools/index">development tools</a></li><li>Support for <a title="C++ and Java Support" href="products/qt/features/language-support/index">C++ and Java development</a></li><li><a title="Cross-Platform Development" href="products/qt/features/platforms/index">Desktop and embedded</a> development support</li></ul> -<p> </p> -<p><strong><a title="Qt Cross-Platform Application Framework" href="products/qt/index"><span class="button">Learn More</span></a></strong> <strong><a title="How to order" href="products/qt/orderform"><span class="button">Buy Now</span></a></strong></p> -<p> </p> -<p> </p> -<p> </p> -</div> - </td> - <td style="width:350px;"> - <div class="viewlet productviewlet"> -<p><a title="Qtopia" href="products/qtopia"><img class="image-right" src="images/frontpage/qtopia_learn_more_90.png" alt="Qtopia Learn More button 90px" /></a></p> -<h2>Qtopia</h2> -<p><a title="The Qtopia application platform for embedded Linux" href="products/qtopia/index">Qtopia</a> is an application platform and UI for Linux-based <a title="Qtopia Phone Edition" href="products/qtopia/qtopia-product-family/qtopia-phone-edition">mobile</a>, <a title="Qtopia Platform" href="products/qtopia/qtopia-product-family/qtopia-platform">consumer electronics</a> and <a title="Qtopia Platform" href="products/qtopia/qtopia-product-family/qtopia-platform">embedded devices</a>. Qtopia offers:</p> -<ul><li>Rich <a href="products/qt/features/tools/index">toolkit</a> and intuitive API</li><li>Fully customizable user interface</li><li>Highly efficient development framework</li></ul> -<p> </p> -<p><strong><a title="Customer Devices" href="company/customers/customer-devices"><span class="button">Customer Devices</span></a></strong> <strong><a title="Purchasing Qtopia" href="products/qtopia/orderinfo"><span class="button">Buy Now</span></a></strong></p> -</div> - </td> - </tr> - </table> - - - - - - - - - - - - - </div> - - </div> - - - </td> - - - - - <!-- News/events --> - <td id="frontpage-column-two"> - - <div class="viewlet"> - <h3>Quick Links</h3> - - - <!-- Smart folders --> - - <!-- Links --> - - <p class="smallerExtendedLink"> - <a href="http://trolltech.com/company/careers" - title="Quick Links">Careers at Trolltech</a> - </p> - - - <p class="smallerExtendedLink"> - <a href="http://trolltech.com/products/qt/learnmore/whitepapers" - title="Quick Links">Whitepapers</a> - </p> - - - <p class="smallerExtendedLink"> - <a href="http://trolltech.com/products/qt/learnmore/webinars-videos" - title="Quick Links">Webinars and Videos</a> - </p> - - </div> - - - <div class="viewlet"> - <h3>Nokia Acquisition</h3> - - <div class="viewletBody"> -<p class="smallerExtendedLink"><a title="Nokia Acquires Trolltech" href="../../../28012008/28012008">Learn more about Nokia's acquisition of Trolltech<br /></a></p> -</div> - <!-- Smart folders --> - - <!-- Links --> - - - - </div> - - - <div class="viewlet"> - <h3>News</h3> - - - <!-- Smart folders --> - - <p class="smallerFont"> - <span> - <a href="http://trolltech.com/company/newsroom/announcements/press.2008-06-03.1419977468">Trolltech Releases Qt Jambi 4.3.5</a> - <!-- Dates for press release --> - - - (Jun 03) - <!--(<tal:date tal:content="item_pressmonth"/> <tal:date tal:content="item_pressday"/>)--> - - - <!-- Dates for events --> - - <!-- Dates for training --> - - </span> - </p> - <p class="smallerFont"> - <span> - <a href="http://trolltech.com/company/newsroom/announcements/press.2008-05-28.9662742780">Trolltech releases Qt 4.3.5</a> - <!-- Dates for press release --> - - - (May 28) - <!--(<tal:date tal:content="item_pressmonth"/> <tal:date tal:content="item_pressday"/>)--> - - - <!-- Dates for events --> - - <!-- Dates for training --> - - </span> - </p> - <p class="smallerFont"> - <span> - <a href="http://trolltech.com/company/newsroom/announcements/press.2008-05-14.1108908046">Award From Qt Developers Recognizes Best Open Source Development Tools</a> - <!-- Dates for press release --> - - - (May 14) - <!--(<tal:date tal:content="item_pressmonth"/> <tal:date tal:content="item_pressday"/>)--> - - - <!-- Dates for events --> - - <!-- Dates for training --> - - </span> - </p> - <p class="smallerFont"> - <span> - <a href="http://trolltech.com/company/newsroom/announcements/press.2008-05-08.1819339587">Trolltech Delivered Revenues of NOK 55.6 Million</a> - <!-- Dates for press release --> - - - (May 08) - <!--(<tal:date tal:content="item_pressmonth"/> <tal:date tal:content="item_pressday"/>)--> - - - <!-- Dates for events --> - - <!-- Dates for training --> - - </span> - </p> - - <!-- Links --> - - - - </div> - - - <div class="viewlet"> - <h3>Events</h3> - - <div class="viewletBody"> -<p> </p> -</div> - <!-- Smart folders --> - - <p class="smallerFont"> - <span> - <a href="http://trolltech.com/company/newsroom/events/allevents/event.2008-05-15.0963129132">Qt Open Enrollment Training Class</a> - <!-- Dates for press release --> - - <!-- Dates for events --> - - - (Jun 09 - Jun 13) - - - <!-- Dates for training --> - - </span> - </p> - <p class="smallerFont"> - <span> - <a href="http://trolltech.com/company/newsroom/events/allevents/event.2008-02-22.1032431617">Israel Qt User Group</a> - <!-- Dates for press release --> - - <!-- Dates for events --> - - - (Jun 16) - - - <!-- Dates for training --> - - </span> - </p> - <p class="smallerFont"> - <span> - <a href="http://trolltech.com/company/newsroom/events/allevents/event.2008-05-19.5707721007">Webinar: Building Tomorrow’s Virtual Driver Control Center</a> - <!-- Dates for press release --> - - <!-- Dates for events --> - - - (Jun 24) - - - <!-- Dates for training --> - - </span> - </p> - - <!-- Links --> - - <p class="smallerExtendedLink"> - <a href="http://trolltech.com/company/newsroom/events" - title="Events">More events</a> - </p> - - - - </div> - - </td> - - - </tr> - </tbody> - </table> - - - <div class="visualClear"><!-- --></div> - - - <hr class="netscape4" /> - - - - <div id="portal-footer"> - - -<p id="bottom-navigation"> - Trolltech® - Code Less. Create More. Deploy Everywhere. - - <br /> - - <a href="http://trolltech.com/company/contact-us/locations" - title="Trolltech ASA"> - Trolltech ASA - </a> - <a href="http://trolltech.com/company/contact-us/locations" - title="Address: Sandakerveien 116, Oslo"> - Sandakerveien 116, Oslo - </a> - <a href="http://trolltech.com/company/contact-us/locations" - class="lastNavItem" title="Phone: +47 21 60 48 00"> - +47 21 60 48 00 - </a> - - <br /> - - <a href="http://trolltech.com/company/contact-us/locations" - title="International locations"> - International locations - </a> - <a href="/trolltech/privacypolicy" title="Privacy policy"> - Privacy Policy - </a> - <a href="/trolltech/copyright" title="Trolltech" class="lastNavItem"><span>2008</span> © Trolltech ASA</a> -</p> - - -</div> - - <div id="portal-colophon"> - - - <a href="http://plone.org" - class="colophonIcon colophonIconPlone" - title="This Plone site was built using Plone CMS, the Open Source Content Management System. Click for more information."> - Powered by Plone CMS, the Open Source Content Management System - </a> - - - - <p class="discreet"> - This site conforms to the following standards: - </p> - - <div class="colophonWrapper"> - <ul> - <li> - <a href="http://www.section508.gov" - class="colophonIcon colophonIcon508" - title="This Plone site conforms to the US Government Section 508 Accessibility Guidelines."> - Section 508 - </a> - </li> - <li> - <a href="http://www.w3.org/WAI/WCAG1AA-Conformance" - class="colophonIcon colophonIconWAI" - title="This Plone site conforms to the W3C-WAI Web Content Accessibility Guidelines."> - WCAG - </a> - </li> - <li> - <a href="http://validator.w3.org/check/referer" - class="colophonIcon colophonIconXHTML" - title="This Plone site is valid XHTML."> - Valid XHTML - </a> - </li> - <li> - <a href="http://jigsaw.w3.org/css-validator/check/referer&warning=no&profile=css3&usermedium=all" - class="colophonIcon colophonIconCSS" - title="This Plone site was built with valid CSS."> - Valid CSS - </a> - </li> - <li> - <a href="http://plone.org/browsersupport" - class="colophonIcon colophonIconAnyBrowser" - title="This Plone site is usable in any web browser."> - Usable in any browser - </a> - </li> - </ul> - </div> - - </div> - - </div> -<!-- ProspectXtractor tracker script --> -<script type="text/javascript"><!-- -function _pxPar() -{ -var p=""; -p+="&ref="+escape(top.document.referrer); -p+="&dt="+escape(document.title); -p+="&sr="+screen.width+"x"+screen.height; -p+="&sd="+screen.colorDepth; -p+="&fv="+_pxFV(); -return p; -} -function _pxFV() -{ -var f=0,n=navigator; -if (n.plugins && n.mimeTypes.length) { -var x=n.plugins["Shockwave Flash"]; -if(x && x.description) { -var y=x.description; -f=y.charAt(y.indexOf('.')-1); -} -} else { -r=false; -for(var i=15;i>=3&&r!=true;i-=1){ -execScript('on error resume next: r=IsObject(CreateObject("ShockwaveFlash.ShockwaveFlash.'+i+'"))','VBScript'); -f=i; -} -} -return f; -} -document.write('<img src="http://pxreg.onlineservicesas.com/pxreg/?id=50C9FD2F-61D5-4824-B726-50D6B1F89999'+_pxPar()+'" width="1" heigth="1" />'); -//--> -</script> -<noscript> -<div><img src="http://pxreg.onlineservicesas.com/pxreg/?id=50C9FD2F-61D5-4824-B726-50D6B1F89999" width="1" height="1" alt="" /></div> -</noscript> -<!-- END ProspectXtractor tracker script --> -</body> -</html> - diff --git a/examples/xml/htmlinfo/w3c_org.html b/examples/xml/htmlinfo/w3c_org.html deleted file mode 100644 index 0fcce48..0000000 --- a/examples/xml/htmlinfo/w3c_org.html +++ /dev/null @@ -1,507 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US"> -<head profile="http://www.w3.org/2000/08/w3c-synd/#"><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="generator" content="HTML Tidy for Mac OS X (vers 1st March 2004), see www.w3.org" /> - -<meta name="keywords" content="W3C, World Wide Web, Web, WWW, Consortium, computer, access, accessibility, semantic, worldwide, W3, HTML, XML, standard, language, technology, link, CSS, RDF, XSL, Berners-Lee, Berners, Lee, style sheet, cascading, schema, XHTML, mobile, SVG, PNG, PICS, DOM, SMIL, MathML, markup, Amaya, Jigsaw, free, open source, software" /> -<meta name="description" content="The World Wide Web Consortium (W3C) is an international consortium where Member organizations, a full-time staff, and the public work together to develop Web standards. W3C primarily pursues its mission through the creation of Web standards and guidelines designed to ensure long-term growth for the Web. Over 400 organizations are Members of the Consortium. W3C is jointly run by the MIT Computer Science and Artificial Intelligence Laboratory (MIT CSAIL) in the USA, the European Research Consortium for Informatics and Mathematics (ERCIM) headquartered in France, Keio University in Japan, and has additional Offices worldwide." /> - -<title>World Wide Web Consortium - Web Standards</title> -<link rel="meta" href="/Overview-about.rdf" /> -<link rel="stylesheet" type="text/css" href="/StyleSheets/home.css" /> -<link rel="bookmark" href="#technologies" title="Technologies |" /> -<link rel="bookmark" href="#news" title="News |" /> -<link rel="bookmark" href="#search" title="Search |" /> -<link rel="contents" href="#contents" title="Contents |" /> -<link rel="bookmark" href="#Offices" title="Offices |" /> -<link rel="bookmark" href="#systems" title="Systems |" /> -<link rel="bookmark" href="#donors" title="Supporters |" /> -<link rel="bookmark" href="#footnotes" title="Footnotes |" /> -<link rel="alternate" type="application/rss+xml" title="W3C Home Page News RSS Channel" href="http://www.w3.org/2000/08/w3c-synd/home.rss" /> - -<style type="text/css"> -/**/ - div.spot-image img { - margin-bottom: 20px; - } -/**/ -</style> -</head> - -<body> -<h1 id="logo"><img alt="The World Wide Web Consortium (W3C)" height="48" width="315" src="/Icons/w3c_main" /></h1> - -<h2 id="slogan">Leading the Web to Its Full Potential...</h2> - -<div> -<map name="introLinks" id="introLinks" title="Introductory Links"> -<div class="banner"> -<span class="invisible"><a class="bannerLink" title="Skip introductory links and the mission statement" href="#technologies">Skip to Technologies</a> |</span> <a class="bannerLink" title="W3C Activities" accesskey="A" href="/Consortium/activities">Activities</a> | <a class="bannerLink" title="Technical Reports and Recommendations" accesskey="T" href="/TR/">Technical Reports</a> | <a class="bannerLink" title="Alphabetical Site Index" accesskey="S" href="/Consortium/siteindex">Site Index</a> | <a class="bannerLink" title="Help for new visitors" accesskey="N" href="/Consortium/new-to-w3c">New -Visitors</a> | <a class="bannerLink" title="About W3C" accesskey="B" href="/Consortium/">About W3C</a> | <a class="bannerLink" title="Join W3C" accesskey="J" href="/Consortium/join">Join W3C</a> | -<a class="bannerLink" title="Contact W3C" accesskey="C" href="/Consortium/contact">Contact W3C</a> -</div> -</map> -</div> - -<p class="small">The World Wide Web Consortium (<acronym title="World Wide Web Consortium">W3C</acronym>) develops interoperable -technologies (specifications, guidelines, software, and tools) to lead -the Web to its full potential. W3C is a forum for information, -commerce, communication, and collective understanding. On this page, -you'll find <a href="#news">W3C news</a>, links to <a href="#technologies">W3C technologies</a> and ways to <a href="#contents">get involved</a>. New visitors can find help in -<cite><a href="/Consortium/new-to-w3c">Finding Your Way at -W3C</a></cite>. We encourage organizations to learn more <a href="/Consortium/">about W3C</a> and <a href="/Consortium/membership">about -W3C Membership</a>.</p> - -<div class="navBlock"> -<h2 class="spot-head">XML10</h2> - -<div class="spot"> -<div class="spot-image"> -<a href="/2008/xml10/"> -<img src="/2008/xml10/xml-10.png" width="106" height="48" alt="XML 10" /> -</a> -</div> -<p class="spot-block"> -To celebrate -<a href="/2008/xml10/">ten years of XML</a>, -W3C invites you to -<a href="/2008/xml10/card/greeting-form">send a greeting</a> -and tell us about an XML-related blog or article. -Many thanks to the FLWOR Foundation for their -generous sponsorship of XML10. -</p> -</div> - -<h2 class="spot-head">W3C Supporters</h2> -<div class="spot"> -<p class="spot-block">Help W3C by making a donation through the -<a href="/Consortium/sup">W3C Supporters Program</a>.</p> -</div> - - - -<h2 class="spot-head">Employment</h2> - -<div class="spot"> -<p class="spot-block">Current <a href="/Consortium/Recruitment/">job -opportunities</a> at W3C: <a href="http://www.ercim.org/jobs/wai_consultant.html">Web Accessibility and Ageing Consultant</a>. Current <a href="/Consortium/Recruitment/Fellows#openings">W3C Fellows Program -openings</a> are <a href="/2007/01/comm-fellow1">Business and -Technology Communications Specialist</a>, <a href="/2007/01/comm-fellow2">Web / Graphic Designer</a>, and <a href="/2007/01/SysteamFellowsPosition">Software Engineer</a>.</p> -</div> - -<h2 class="navhead"><a name="technologies" id="technologies">W3C A to -Z</a></h2> - -<ul> -<li class="invisible"><a class="navlink" title="Skip W3C A-Z" href="#news">Skip to News</a></li> - -<li><a href="/WAI/" class="navlink">Accessibility</a></li> - -<li><a href="/Amaya/" class="navlink">Amaya</a></li> - -<li><a href="/Mobile/CCPP/" class="navlink"><abbr title="Composite Capability/Preference Profiles">CC/PP</abbr></a></li> - -<li><a href="/2004/CDF/" class="navlink">Compound Document Formats -(CDF)</a></li> - -<li><a href="/Style/CSS/" class="navlink"><abbr title="Cascading Style Sheets">CSS</abbr></a></li> - -<li><a href="http://jigsaw.w3.org/css-validator/" class="navlink"><abbr title="Cascading Style Sheets">CSS</abbr> -Validator</a></li> - -<li><a href="/2002/ws/databinding/" class="navlink">Databinding</a></li> - -<li><a href="/DOM/" class="navlink"><acronym title="Document Object Model">DOM</acronym></a></li> - -<li><a href="/XML/EXI" class="navlink">Efficient XML -Interchange</a></li> - -<li><a href="/2007/eGov/" class="navlink">eGovernment</a></li> - -<li><a href="/2001/sw/grddl-wg/" class="navlink"><acronym title="Gleaning Resource Descriptions from Dialects of Languages">GRDDL</acronym></a></li> - -<li><a href="/2001/sw/hcls/" class="navlink">Health Care and Life -Sciences</a></li> - -<li><a href="/html/" class="navlink"><abbr title="HyperText Markup Language">HTML</abbr></a></li> - -<li><a href="/People/Raggett/tidy/" class="navlink"><abbr title="HyperText Markup Language">HTML</abbr> Tidy</a></li> - -<li><a href="http://validator.w3.org/" class="navlink"><abbr title="HyperText Markup Language">HTML</abbr> Validator</a></li> - -<li><a href="/Protocols/" class="navlink"><abbr title="Hypertext Transfer Protocol">HTTP</abbr></a></li> - -<li><a href="/2005/Incubator/" class="navlink">Incubator</a></li> - -<li><a href="/2002/mmi/ink" class="navlink">InkML</a></li> - -<li><a href="/International/" class="navlink">Internationalization</a></li> - -<li><a href="/Jigsaw/" class="navlink">Jigsaw</a></li> - -<li><a href="/Library/" class="navlink">Libwww</a></li> - -<li><a href="/Math/" class="navlink">MathML</a></li> - -<li><a href="/Mobile/" class="navlink">Mobile Web Initiative -(W3C-MWI)</a></li> - -<li><a href="/2002/mmi/" class="navlink">Multimodal -Interaction</a></li> - -<li><a href="/2004/OWL/" class="navlink"><acronym title="OWL Web Ontology Language">OWL</acronym></a></li> - -<li><a href="/2004/pp/" class="navlink">Patent Policy</a></li> - -<li><a href="/PICS/" class="navlink"><acronym title="Platform for Internet Content Selection">PICS</acronym></a></li> - -<li><a href="/Graphics/PNG/" class="navlink"><acronym title="Portable Network Graphics">PNG</acronym></a></li> - -<li><a href="/2007/powder/" class="navlink"><acronym title="Protocol for Web Description Resources">POWDER</acronym></a></li> - -<li><a href="/P3P/" class="navlink">Privacy and <abbr title="Platform for Privacy Preferences">P3P</abbr></a></li> - -<li><a href="/RDF/" class="navlink"><abbr title="Resource Description Framework">RDF</abbr></a></li> - -<li><a href="/2006/rwc/" class="navlink">Rich Web Clients</a></li> - -<li><a href="/2005/rules/" class="navlink">Rules</a></li> - -<li><a href="/Security/" class="navlink">Security</a></li> - -<li><a href="/2001/sw/" class="navlink">Semantic Web</a></li> - -<li><a href="/XML/SML" class="navlink">Service Modeling Language -(<abbr title="Service Modeling Language">SML</abbr>)</a></li> - -<li><a href="/AudioVideo/" class="navlink"><acronym title="Synchronized Multimedia Integration Language">SMIL</acronym></a></li> - -<li><a href="/2000/xp/Group/" class="navlink"><acronym title="Soap">SOAP</acronym>/<abbr title="XML Protocol">XMLP</abbr></a></li> - -<li><a href="/2002/ws/soapjms/" class="navlink"><acronym title="Soap">SOAP-JMS</acronym></a></li> - -<li><a href="/2001/sw/DataAccess/" class="navlink"><acronym title="Simple Protocol and RDF Query Language">SPARQL</acronym></a></li> - -<li><a href="/Style/" class="navlink">Style</a></li> - -<li><a href="/Graphics/SVG/" class="navlink"><abbr title="Scalable Vector Graphics">SVG</abbr></a></li> - -<li><a href="/2001/tag/" class="navlink"><abbr title="Technical Architecture Group">TAG</abbr></a></li> - -<li><a href="/AudioVideo/TT/" class="navlink">Timed Text</a></li> - -<li><a href="/Addressing/" class="navlink"><abbr title="Uniform Resource Identifiers">URI/URL</abbr></a></li> - -<li><a href="/QA/Tools/#validators" class="navlink">Validators</a></li> - -<li><a href="/Voice/" class="navlink">Voice</a></li> - -<li><a href="/2007/uwa/" class="navlink">Ubiquitous Web -Applications</a></li> - -<li><a href="/WAI/" class="navlink"><acronym title="Web Accessibility Initiative">WAI</acronym></a></li> - -<li><a href="/2006/webapi/" class="navlink">Web API</a></li> - -<li><a href="/2006/appformats/" class="navlink">Web Application -Formats</a></li> - -<li><a href="/2001/tag/" class="navlink">Web Architecture -(<acronym title="Technical Architecture Group">TAG</acronym>)</a></li> - -<li><a href="/Graphics/WebCGM/WG/" class="navlink"><abbr title="Web Computer Graphics Metafile">WebCGM</abbr></a></li> - -<li><a href="/2002/ws/" class="navlink">Web Services</a></li> - -<li><a href="/2002/ws/addr/" class="navlink"><abbr title="Web Services">WS</abbr>-Addressing</a></li> - -<li><a href="/2002/ws/chor/" class="navlink"><abbr title="Web Services Choreography Description Language">WS-CDL</abbr></a></li> - -<li><a href="/2002/ws/desc/" class="navlink"><acronym title="Web Services Description Language">WSDL</acronym></a></li> - -<li><a href="/2002/ws/policy/" class="navlink"><abbr title="Web Services">WS</abbr>-Policy</a></li> - -<li><a href="/MarkUp/Forms/" class="navlink"><acronym title="Next Generation Web Forms">XForms</acronym></a></li> - -<li><a href="/MarkUp/" class="navlink"><abbr title="Extensible HyperText Markup Language">XHTML</abbr></a></li> - -<li><a href="/MarkUp/" class="navlink"><abbr title="Extensible HyperText Markup Language">XHTML2</abbr></a></li> - -<li><a href="/XML/Linking" class="navlink"><acronym title="XML Link">XLink</acronym></a></li> - -<li><a href="/XML/" class="navlink"><abbr title="Extensible Markup Language">XML</abbr></a></li> - -<li><a href="/TR/xmlbase/" class="navlink"><abbr title="Extensible Markup Language">XML</abbr> Base</a></li> - -<li><a href="/2001/XKMS/" class="navlink"><abbr title="Extensible Markup Language">XML</abbr> Key Management</a></li> - -<li><a href="/XML/Processing/" class="navlink"><abbr title="Extensible Markup Language">XML</abbr> Processing</a></li> - -<li><a href="/XML/Query" class="navlink"><abbr title="Extensible Markup Language">XML</abbr> Query</a></li> - -<li><a href="/XML/Schema" class="navlink"><abbr title="Extensible Markup Language">XML</abbr> Schema</a></li> - -<li><a href="/2008/xmlsec/" class="navlink"><abbr title="Extensible Markup Language">XML</abbr> Signature -and Encryption</a></li> - -<li><a href="/Style/XSL/" class="navlink">XPath</a></li> - -<li><a href="/XML/Linking" class="navlink">XPointer</a></li> - -<li><a href="/Style/XSL/" class="navlink"><acronym title="Extensible Stylesheet Language">XSL</acronym> and <acronym title="XSL Transformations">XSLT</acronym></a></li> -</ul> - -<p><a href="/Consortium/siteindex" class="navlink">More -topics...</a></p> -</div> - -<div class="newsBlock"> -<h2 class="newsHeading"><a name="news" id="news">News</a></h2> - -<p class="invisible"><a title="Skip News" href="#search">Skip to -Search</a></p> - -<div id="item103" class="item"><h3 class="headline">New eGovernment Activity to Help Improve Government through Better Use of the Web</h3> -<p><a href="/2007/eGov/"><img class="newsImage" width="300" height="75" src="/2008/06/03-egov" alt="Crowd scene" /></a></p> -<p><span class="date">2008-06-03:</span> W3C launches today a <a href="/2007/eGov/">new forum</a> for governments, citizens, researchers, and other stakeholders to investigate how best to use Web technology for good governance and citizen participation. "Open Standards, and in particular Semantic Web Standards, can help lower the cost of government, make it easier for independent agencies to work together, and increase flexibility in the face of change," said Tim Berners-Lee, W3C Director. W3C invites participation in the new <a href="/2007/eGov/IG/">eGovernment Interest Group</a>, which is open to the public. The group will identify best practices and guidelines in this area, document where current technology does not adequately address stakeholder needs, and suggest improvements via the standards process. Read the <a href="/2007/eGov/IG/faq">W3C eGovernment FAQ</a> and <a href="/2008/06/egov-pressrelease">press release</a>, and learn more about the <a href="/2007/eGov/">W3C eGovernment Activity</a>.<span class="archive"> (<a title="New eGovernment Activity to Help Improve Government through Better Use of the Web" href="/News/2008#item103" rel="details">Permalink</a>) </span></p></div> - -<div id="item105" class="item"><h3><img alt="" width="17" height="11" src="/Icons/right" />Two Group Notes Published About Semantic Web and Life Sciences</h3><p><span class="date">2008-06-05:</span> The <a href="/2001/sw/hcls/">Semantic Web Health Care and Life Sciences Interest Group</a> has published two Group Notes: <a href="/TR/2008/NOTE-hcls-kb-20080604/">A Prototype Knowledge Base for the Life Sciences</a> and <a href="/TR/2008/NOTE-hcls-senselab-20080604/">Experiences with the conversion of SenseLab databases to RDF/OWL</a>. The former describes a prototype of a biomedical knowledge base that integrates 15 distinct data sources using currently available Semantic Web technologies including RDF and OWL. The Note outlines which resources were integrated, how the knowledge base was constructed using free and open source triple store technology, how it can be queried using SPARQL, and what resources and inferences are involved in answering complex queries. While the utility of the knowledge base is illustrated by identifying a set of genes involved in Alzheimer's Disease, the approach described here can be applied to any use case that integrates data from multiple domains. The second document describe the experience of converting SenseLab databases into OWL, an important step towards realizing the benefits of Semantic Web in integrative neuroscience research. Learn more about the <a href="/2001/sw/">Semantic Web Activity</a>.<span class="archive"> (<a title="Two Group Notes Published About Semantic Web and Life Sciences" href="/News/2008#item105" rel="details">Permalink</a>) </span></p></div> - -<div id="item104" class="item"><h3><img alt="" width="17" height="11" src="/Icons/right" />Offline Web Applications Published as W3C Note</h3><p><span class="date">2008-06-03:</span> The <a href="/html/wg/">HTML Working Group</a> has published the <a href="/TR/2008/NOTE-offline-webapps-20080530/">Offline Web Applications</a> Group Note. <a href="/TR/html5/">HTML 5</a> contains several features that address the challenge of building Web applications that work while offline. This document highlights these features (SQL, offline application caching APIs as well as online/offline events, status, and the localStorage API) from HTML 5 and provides brief tutorials on how these features might be used to create Web applications that work offline. Learn more about the <a href="/MarkUp/Activity">HTML Activity</a>.<span class="archive"> (<a title="Offline Web Applications Published as W3C Note" href="/News/2008#item104" rel="details">Permalink</a>) </span></p></div> - -<div id="item102" class="item"><h3><img alt="" width="17" height="11" src="/Icons/right" />W3C Advisory Committee Elects Advisory Board</h3><p><span class="date">2008-06-02:</span> The W3C Advisory Committee has filled six open seats on the <a href="/2002/ab/">W3C Advisory Board</a>. Created in 1998, the Advisory Board provides guidance to the Team on issues of strategy, management, legal matters, process, and conflict resolution. Beginning 1 July, the nine Advisory Board participants are Jean-François Abramatic (ILOG), Ann Bassetti (The Boeing Company), Jim Bell (HP), Don Deutsch (Oracle), Eduardo Gutentag (Sun Microsystems), Steve Holbrook (IBM), Ken Laskey (MITRE), Ora Lassila (Nokia), and Arun Ranganathan (Mozilla Foundation). Steve Zilles continues as interim Advisory Board Chair. Read more about the <a href="/2002/ab/">Advisory Board</a>.<span class="archive"> (<a title="W3C Advisory Committee Elects Advisory Board" href="/News/2008#item102" rel="details">Permalink</a>) </span></p></div> - -<div id="item101" class="item"><h3><img alt="" width="17" height="11" src="/Icons/right" />W3C Talks in June</h3><p><span class="date">2008-06-02:</span> Browse <a href="/Talks/">W3C presentations and events</a> also available as an <abbr title="RDF Site Summary"><a href="/2004/08/TalkFiles/Talks.rss">RSS channel</a></abbr>. <span class="archive"> (<a title="W3C Talks in June" href="/News/2008#item101" rel="details">Permalink</a>) </span></p><ul><li><span class="talkstart">2 June, Västerås, Sweden: </span><span class="talktitle" lang="sv" xml:lang="sv">Framtidssäkra eFörvaltningen<span class="hide noprint">.</span></span><span class="talkdesc">Olle Olsson participates in a panel at <a href="http://www.offentligarummet.se/" lang="sv" xml:lang="sv">Offentliga Rummet 2008</a>. </span></li><li><span class="talkstart">4 June, Sao Paulo, Brazil: </span><span class="talktitle">Towards eGovernment 2.0 through better use of the Web<span class="hide noprint">.</span></span><span class="talkdesc">José Manuel Alonso presents at <a href="http://www.w3c.br/2008/launch/">W3C Brazil Office Public Launch</a>. </span></li><li><span class="talkstart">4 June, Sao Paolo, Brazil: </span><span class="talktitle">W3C - Web Open Standards<span class="hide noprint">.</span></span><span class="talkdesc">Daniel Dardailler presents at <a href="http://www.w3c.br/2008/lancamento/">W3C Brazil Office Launch event </a>. </span></li><li><span class="talkstart">10 June, Buenos Aires, Argentina: </span><span class="talktitle">Web Accessibility: People with Disabilities and Elderly Citizens<span class="hide noprint">.</span></span><span class="talkdesc">Shadi Abou-Zahra presents at <a href="http://www.isoc.org.ar/accesibilidad.html" lang="es" xml:lang="es">Web Sin Barreras</a>. </span></li><li><span class="talkstart">11 June, Nashville, TN, USA: </span><span class="talktitle">Color for the Global Web<span class="hide noprint">.</span></span><span class="talkdesc">Molly E Holzschlag presents at <a href="http://www.voicesthatmatter.com/webdesign2008/index.aspx">Voices That Matter</a>. </span></li><li><span class="talkstart">12 June, Nashville, TN, USA: </span><span class="talktitle">Designing for Today's Browsers<span class="hide noprint">.</span></span><span class="talkdesc">Molly E Holzschlag presents at <a href="http://www.voicesthatmatter.com/webdesign2008/index.aspx">Voices That Matter</a>. </span></li><li><span class="talkstart">17 June, New York, NY, USA: </span><span class="talktitle">Web of Data<span class="hide noprint">.</span></span><span class="talkdesc">Tim Berners-Lee presents at <a href="http://www.linkeddataplanet.com/index.php">LinkedData Planet Conference: exploring the new web of linked data</a>. </span></li><li><span class="talkstart">19 June, Tokyo, Japan: </span><span class="talktitle">Update on W3C/WAI Guidelines including WCAG 2.0<span class="hide noprint">.</span></span><span class="talkdesc">Judy Brewer presents at <a>Open Seminar of Information Accessibility</a>. </span></li><li><span class="talkstart">19 June, Nancy, France: </span><span class="talktitle" lang="fr" xml:lang="fr">États des lieux du Web sémantique<span class="hide noprint">.</span></span><span class="talkdesc">Ivan Herman gives a keynote at <a href="http://ic2008.loria.fr/" lang="fr" xml:lang="fr">19èmes Journées Francophones d'Ingénierie des Connaissances (IC2008)</a>. </span></li><li><span class="talkstart">19 June, Baltimore, Maryland, USA: </span><span class="talktitle">How New Web Accessibility Standards Impact User Experience Design<span class="hide noprint">.</span></span><span class="talkdesc">Shawn Henry presents at <a href="http://www.usabilityprofessionals.org/conference/2008/">Usability Professionals' Association International Conference 2008</a>. </span></li><li><span class="talkstart">26 June, Frankfurt, Germany: </span><span class="talktitle">Mobile Internet - the Way Forward<span class="hide noprint">.</span></span><span class="talkdesc">Steve Bratt participates in a panel at <a href="http://www.amiando.com/ngmn-2008">2nd NGMN Industry Conference 2008</a>. </span></li><li class="noprint showuris">View <a href="http://www.w3.org/2004/08/W3CTalks?date=Recent+and+upcoming&countryListing=yes&submit=Submit">upcoming talks by country</a></li><li class="noprint showuris"><a href="/Talks/">More talks...</a></li></ul></div> - -<div id="item100" class="item"><h3><img alt="" width="17" height="11" src="/Icons/right" />W3C Launches Group to Help Bridge the Digital Divide</h3><p><a href="/2008/MW4D/"><img class="newsImage" alt="Phone bikes" src="/2008/05/voiturette-sb.png" /></a><span class="date">2008-05-27:</span> As part of the growing set of W3C initiatives related to social development, W3C invites participation in the new <a href="/2008/MW4D/">Mobile Web for Development (MW4D) interest Group</a>, chartered to explore the potential of mobile technology to help bridge the digital divide. "We need to solve important challenges, such as lack of standards in end-user devices, network constraints, service cost, issues of literacy, and an understanding of the real information needs of rural communities," said Ken Banks, kiwanja.net, who Chairs the group. "To do so requires an multidisciplinary approach, a step we take through the creation of this new group." Read more in the <a href="/2008/05/mw4dig-pressrelease">press release</a>. This launch is part of <a href="/Mobile">W3C's Mobile Web Initiative (MWI)</a>, which aims to identify and resolve challenges and issues of accessing the Web when on the move. This work takes place under the auspices of the <a href="http://cordis.europa.eu/fp7/ict/">European Union's 7th Research Framework Programme (FP7)</a>, part of the <a href="http://digitalworld.ercim.org/">Digital World Forum</a> project.<span class="archive"> (Photo credit: Stéphane Boyera. <a title="W3C Launches Group to Help Bridge the Digital Divide" href="/News/2008#item100" rel="details">Permalink</a>) </span></p></div> - -<div id="item99" class="item"><h3><img alt="" width="17" height="11" src="/Icons/right" />Last Call: XHTML Access Module</h3><p><span class="date">2008-05-26:</span> The <a href="/MarkUp/">XHTML 2 Working Group</a> has published the Last Call Working Draft of <a href="/TR/2008/WD-xhtml-access-20080526/">XHTML Access Module</a>. This document is intended to help make XHTML-family markup languages more effective at supporting the needs of the accessibility community. It does so by providing a generic mechanism for defining the relationship between document components and well-known accessibility taxonomies. Comments are welcome through 16 June. Learn more about the <a href="/MarkUp/Activity">HTML Activity</a>. <span class="archive"> (<a title="Last Call: XHTML Access Module" href="/News/2008#item99" rel="details">Permalink</a>) </span></p></div> - -<div id="item98" class="item"><h3><img alt="" width="17" height="11" src="/Icons/right" />W3C Invites Implementations of CSS Namespaces Module (Candidate Recommendation)</h3><p><span class="date">2008-05-23:</span> The <a href="/Style/CSS/members">Cascading Style Sheets (CSS) Working Group</a> has published the Candidate Recommendation of <a href="/TR/2008/CR-css3-namespace-20080523/">CSS Namespaces Module</a>. This CSS Namespaces module defines the syntax for using namespaces in CSS. It defines the @namespace rule for declaring the default namespace and binding namespaces to namespace prefixes, and it also defines a syntax that other specifications can adopt for using those prefixes in namespace-qualified names. Learn more about the <a href="/Style/">Style Activity</a>.<span class="archive"> (<a title="W3C Invites Implementations of CSS Namespaces Module (Candidate Recommendation)" href="/News/2008#item98" rel="details">Permalink</a>) </span></p></div> - -<div id="item97" class="item"><h3><img alt="" width="17" height="11" src="/Icons/right" />Progress Events 1.0</h3><p><span class="date">2008-05-22:</span> The <a href="/2006/webapi/">Web API Working Group</a> has published a Working Draft of <a href="/TR/2008/WD-progress-events-20080521/">Progress Events 1.0</a>.This document describes event types that can be used for monitoring the progress of an operation. It is primarily intended for contexts such as data transfer operations specified by <a href="/TR/XMLHttpRequest">XMLHTTPRequest</a>, or <a href="/TR/MediaAccessEvents/">Media Access Events</a>. Learn more about the <a href="/2006/rwc/">Rich Web Client Activity</a>.<span class="archive"> (<a title="Progress Events 1.0" href="/News/2008#item97" rel="details">Permalink</a>) </span></p></div> - -<div id="item96" class="item"><h3><img alt="" width="17" height="11" src="/Icons/right" />XML Security Working Group to Take Next Steps on XML Signature, Encryption</h3><p><span class="date">2008-05-21:</span> W3C is pleased to announce the creation of the <a href="/2008/xmlsec/">XML Security Working Group</a>, whose mission is to evaluate and act on <a href="/2007/xmlsec/ws/report">recommendations</a> from the <a href="/2007/xmlsec/ws/agenda.html">September 2007 Workshop on XML Signature and XML Encryption</a> regarding next steps for XML Security specifications. The group's <a href="/2008/02/xmlsec-charter.html#deliverables">deliverables</a> include new work on XML Signature Syntax and Processing and XML Encryption Syntax and Processing, as well as maintenance of related specifications. Frederick Hirsch (Nokia) will Chair the group, with Thomas Roessler (W3C) as Team Contact. Learn more about the <a href="/Security/">W3C Security Activity</a>. <span class="archive"> (<a title="XML Security Working Group to Take Next Steps on XML Signature, Encryption" href="/News/2008#item96" rel="details">Permalink</a>) </span></p></div> - -<div id="item94" class="item"><h3><img alt="" width="17" height="11" src="/Icons/right" />Last Call: Cascading Style Sheets (CSS) Snapshot 2007</h3><p><span class="date">2008-05-16:</span> The <a href="/Style/CSS/members">Cascading Style Sheets (CSS) Working Group</a> has published the Last Call Working Draft of <a href="/TR/2008/WD-css-beijing-20080516/">Cascading Style Sheets (CSS) Snapshot 2007</a>. This document collects together into one definition all the specifications that together form the current state of Cascading Style Sheets (CSS). The primary audience is CSS implementors, not CSS authors, as this definition includes modules by specification stability, not Web browser adoption rate. Comments are welcome through 09 June. Learn more about the <a href="/Style/">Style Activity</a>.<span class="archive"> (<a title="Last Call: Cascading Style Sheets (CSS) Snapshot 2007" href="/News/2008#item94" rel="details">Permalink</a>) </span></p></div> - -<div id="item93" class="item"><h3><img alt="" width="17" height="11" src="/Icons/right" />W3C Invites Implementations of XQuery and XPath Full Text 1.0 (Candidate Recommendation); Requirements and Use Cases Drafts Available</h3><p><span class="date">2008-05-16:</span> The W3C <a href="http://www.w3.org/XML/Query/">XML Query Working Group</a> and the W3C <a href="http://www.w3.org/Style/XSL/">XSL Working Group</a> jointly published today a Candidate Recommendation of <a href="/TR/2008/CR-xpath-full-text-10-20080516/">XQuery and XPath Full Text 1.0</a>. This document defines the syntax and formal semantics of XQuery and XPath Full Text 1.0 which is a language that extends XQuery 1.0 [XQuery 1.0: An XML Query Language] and XPath 2.0 [XML Path Language (XPath) 2.0] with full-text search capabilities. Implementors are encouraged to run the groups' <a href="http://dev.w3.org:/cvsweb/2007/xpath-full-text-10-test-suite/">test suite</a> and report their results. The Groups also published Working Drafts of <a href="/TR/2008/WD-xpath-full-text-10-requirements-20080516/">XQuery and XPath Full Text 1.0 Requirements</a> and <a href="/TR/2008/WD-xpath-full-text-10-use-cases-20080516/">Use Cases</a>. Learn more about the <a href="/XML/">XML Activity</a>.<span class="archive"> (<a title="W3C Invites Implementations of XQuery and XPath Full Text 1.0 (Candidate Recommendation); Requirements and Use Cases Drafts Available" href="/News/2008#item93" rel="details">Permalink</a>) </span></p></div> - -<div id="item95" class="item"><h3><img alt="" width="17" height="11" src="/Icons/right" />State Chart XML (SCXML) Working Draft Published</h3><p><span class="date">2008-05-16:</span> The <a href="/Voice/">Voice Browser Working Group</a> has published an updated Working Draft of <a href="/TR/2008/WD-scxml-20080516/">State Chart XML (SCXML): State Machine Notation for Control Abstraction</a>. <abbr title="State Chart eXtensible Markup Language">SCXML</abbr> is an execution environment based on <a href="http://www.uml.org/#UML1.5"><abbr title="Unified Modeling Language">UML</abbr></a> Harel State Tables and <a href="/TR/ccxml/"><abbr title="Call Control eXtensible Markup Language">CCXML</abbr></a>. The main differences from the previous draft are (1) the modularization of the language, (2) the introduction of profiles and (3) a revision of the algorithm for document interpretation; the document as a whole has changed significantly and the group welcomes review. Learn more about the <a href="/Voice/">Voice Browser Activity</a>.<span class="archive"> (<a title="State Chart XML (SCXML) Working Draft Published" href="/News/2008#item95" rel="details">Permalink</a>) </span></p></div> - -<div id="item92" class="item"><h3><img alt="" width="17" height="11" src="/Icons/right" />"Web Accessibility for Older Users: A Literature Review"; Comments Welcome on First Public Draft</h3><p><span class="date">2008-05-14:</span> The Web Accessibility Initiative (WAI) <a href="/WAI/EO/">Education and Outreach Working Group Working Group (EOWG)</a> has published <a href="/TR/2008/WD-wai-age-literature-20080514/">Web Accessibility for Older Users: A Literature Review</a> as a First Public Working Draft. The document includes reviews and analysis of guidelines and articles covering the requirements of people with Web accessibility needs related to ageing. This literature review will inform WAI efforts to promote accessibility solutions for older Web users and potentially to develop profiles or extensions to WAI guidelines. The literature review is a deliverable of the <a href="/WAI/WAI-AGE/">WAI-AGE Project</a> (Ageing Education and Harmonisation). See the <a href="http://lists.w3.org/Archives/Public/w3c-wai-ig/2008AprJun/0083.html">call for review and participation</a> for an introduction to the project and an invitation to contribute to the literature review and other WAI-AGE work; and about the <a href="/WAI/">Web Accessibility Initiative</a>.<span class="archive"> (<a title="Web Accessibility for Older Users: A Literature Review; Comments Welcome on First Public Draft" href="/News/2008#item92" rel="details">Permalink</a>) </span></p></div> - -<div id="item91" class="item"><h3><img alt="" width="17" height="11" src="/Icons/right" />Last Call: CURIE Syntax 1.0</h3><p><span class="date">2008-05-08:</span> The <a href="/MarkUp/">XHTML2 Working Group</a> has published the Last Call Working Draft of <a href="/TR/2008/WD-curie-20080506">CURIE Syntax 1.0</a>, which outlines a syntax for expressing URIs in a generic, abbreviated syntax ("Compact URI"). The specification targets language designers who need a mechanism to permit the use of extensible value collections. Any language designer considering the use of QNames in attribute values should consider instead using CURIEs, since CURIEs are designed for this purpose, while QNames are not. Comments are welcome through 10 June. Learn more about the <a href="/MarkUp/Activity">HTML Activity</a>.<span class="archive"> (<a title="Last Call: CURIE Syntax 1.0" href="/News/2008#item91" rel="details">Permalink</a>) </span></p></div> - - - -<h3 class="pastNews"><a href="/News/2008">Past News</a></h3> -</div> - -<div class="navBlock"> -<h2 class="navhead"><a name="search" id="search">Search</a></h2> - -<p class="invisible"><a class="navlink" title="Skip search" href="#contents">Skip to Contents</a></p> - -<form method="get" action="http://www.google.com/custom" enctype="application/x-www-form-urlencoded"> -<div> -<a class="navlink" href="http://www.google.com"><img src="/Icons/Logo_25wht.gif" width="75" height="32" alt="Google" /></a><br /> -<label for="inputField">Search W3C<br /> -<input type="text" size="15" id="inputField" name="q" accesskey="E" maxlength="255" /></label> <input type="submit" value="Go" id="goButton" name="sa" accesskey="G" /><br /> -<input type="hidden" name="cof" value="T:black;LW:72;ALC:#ff3300;L:http://www.w3.org/Icons/w3c_home;LC:#000099;LH:48;BGC:white;AH:left;VLC:#660066;GL:0;AWFID:0b9847e42caf283e;" /> - <input type="hidden" id="searchW3C" name="sitesearch" checked="checked" value="www.w3.org" /><input type="hidden" name="domains" value="www.w3.org" /> -</div> -</form> - -<p><a class="navlink" href="/Search/Mail/Public/">Search W3C Mailing -Lists</a></p> - -<h2 class="navhead"><a name="contents" id="contents">Testimonials</a></h2> - -<div class="hpmt"><div class="hpmt-name">Fraunhofer Gesellschaft</div><div class="hpmt-logo"><a rel="nofollow" href="http://www.fraunhofer.de/"><img alt="Fraunhofer Gesellschaft" src="http://www.w3.org/Consortium/Member/Testimonial/Logo/119" /></a></div><p class="hpmt-testimonial">The Fraunhofer-Gesellschaft undertakes applied contract research in all fields of engineering sciences. Fraunhofer works with W3C to contribute to the development of Web technologies which are the base of many of our research activities. Fraunhofer hosts the W3C Office in Germany and Austria. <a class="hpmt-more" href="http://www.w3.org/Consortium/Member/Testimonial/List">(Member testimonials)</a></p></div> - -<h2 class="navhead">Members</h2> - -<ul> -<li><a href="/Member/" class="navlink">Member Home Page</a></li> - -<li><a href="/Submission/" class="navlink">Member Submissions</a></li> - -<li><a href="/Consortium/Member/List" class="navlink">Current -Members</a></li> - -<li><a href="/Consortium/meetings" class="navlink">Meetings</a></li> - -<li><a href="/Consortium/Recruitment/Fellows" class="navlink">Fellows</a> (<a href="/Consortium/Recruitment/Fellows#openings">New Openings</a>)</li> -</ul> - -<h2 class="navhead">Get Involved</h2> - -<ul> -<li><a href="/Consortium/membership-benefits" class="navlink">W3C -Membership Benefits</a></li> - -<li><a href="/Consortium/membership#bizcase" class="navlink">Reasons to -Join W3C</a></li> - -<li><a href="/Mail/" class="navlink">Mailing Lists</a></li> - -<li><a href="http://lists.w3.org/Archives/Public/public-new-work/latest">Potential -New Work</a></li> - -<li><a href="/Consortium/Translation/" class="navlink">Translations</a></li> - -<li><a href="/2003/08/Workshops/" class="navlink">Workshops</a></li> - -<li><a href="/2001/11/StdLiaison" class="navlink">Liaisons</a></li> - -<li><a href="/Status" class="navlink">Open Source Software</a></li> - -<li><a href="/QA/" class="navlink">Q&A Blog</a></li> - -<li><a href="/Consortium/Recruitment/" class="navlink">Employment</a></li> - -<li><span class="navText">More ways to</span> <a href="/Consortium/org#public" class="navlink">participate</a></li> -</ul> - -<h2 class="navhead">Introduction</h2> - -<ul> -<li><a href="/Consortium/" class="navlink">About W3C</a></li> - -<li><a href="/Consortium/faq" class="navlink">Frequently Asked -Questions (FAQ)</a></li> - -<li><a href="/2003/glossary/" class="navlink">Glossary</a></li> - -<li><a href="/Consortium/Process/" class="navlink">Process -Document</a></li> - -<li><a href="/2002/03/tutorials" class="navlink">Tutorials</a></li> - -<li><a href="/2002/03/new-to-w3c" class="navlink">More...</a></li> -</ul> - -<h2 class="navhead">W3C Team</h2> - -<ul> -<li><a href="/People/" class="navlink">People</a></li> - -<li><a href="/TeamSubmission/" class="navlink">Team -Submissions</a></li> -</ul> - -<h2 class="navhead">Presentations</h2> - -<ul> -<li><a href="/Talks/" class="navlink">Public Presentations</a></li> -</ul> - -<h2 class="navhead">News Room</h2> - -<ul> -<li><a href="/News/" class="navlink">W3C News Archive</a> <span class="navText">(</span><a href="/2000/08/w3c-synd/home.rss" class="navlink">RSS</a><span class="navText">)</span></li> - -<li><a href="/News/Public/" class="navlink">Weekly Public Newsletter</a></li> - -<li><a href="/Press/" class="navlink">Press Releases</a></li> - -<li><a href="/Press/#rss" class="navlink">Multilingual Press Release -RSS</a></li> - -<li><a href="/Press/Articles" class="navlink">W3C in the Press</a></li> -</ul> - -<h2 class="navhead"><a name="Offices" id="Offices">World -Offices</a></h2> - -<p class="navPara">The <a href="/Consortium/Offices/" class="navlink">W3C Offices</a>, part of the <a href="/2007/IntlRel.html">W3C -International Relations team</a> translate many W3C home page news -items. W3C Offices are located in these parts of the world:</p> - -<ul> -<li><a href="http://www.w3c.org.au/" class="navlink" title="Australia">Australia</a></li> - -<li><a href="http://www.w3c.nl/index.shtml.nl" class="navlink" hreflang="nl" title="Benelux"><span xml:lang="nl" lang="nl">Benelux</span></a>/<a href="http://www.w3c.nl/index.shtml.fr" class="navlink" title="Benelux" hreflang="fr"><span xml:lang="fr" lang="fr">Bénélux</span></a></li> - -<li><a href="http://www.w3c.br/" class="navlink" title="Brazil" hreflang="pt-br"><span xml:lang="pt-br" lang="pt-br">Brasil</span> -(Brazil)</a></li> - -<li><a href="http://www.chinaw3c.org/" class="navlink" title="China" hreflang="zh-hans"><span xml:lang="zh-hans" lang="zh-hans">中国</span> -(China)</a></li> - -<li><a href="http://www.w3c.tut.fi/" class="navlink" title="Finland" hreflang="fi"><span xml:lang="fi" lang="fi">Suomi</span> -(Finland)</a></li> - -<li><a href="http://www.w3c.de/" class="navlink" title="German and Austria" hreflang="de"><span xml:lang="de" lang="de">Deutschland und Österreich</span> (Germany and Austria)</a></li> - -<li><a href="http://www.w3c.gr/" class="navlink" title="Greece" hreflang="el"><span xml:lang="el" lang="el">Ελλάδα</span> -(Greece)</a></li> - -<li><a href="http://www.w3c.hu/" class="navlink" title="Hungary" hreflang="hu"><span xml:lang="hu" lang="hu">Magyarország</span> -(Hungary)</a></li> - -<li><a href="http://www.w3cindia.in/" class="navlink" title="India" hreflang="en"><span xml:lang="hi" lang="hi">भारत</span> -(India)</a></li> - -<li><a href="http://www.w3c.org.il/" class="navlink" title="Israel" hreflang="he"><span xml:lang="he" lang="he">ישראל</span> -(Israel)</a></li> - -<li><a href="http://www.w3c.it/" class="navlink" title="Italy" hreflang="it"><span xml:lang="it" lang="it">Italia</span> -(Italy)</a></li> - -<li><a href="http://www.w3c.or.kr/" class="navlink" title="Korea" hreflang="ko"><span xml:lang="ko" lang="ko">한국</span> (Korea)</a></li> - -<li><a href="http://www.w3c.org.ma/" class="navlink" title="Morocco" hreflang="ar"><span xml:lang="ar" lang="ar">المغرب</span> -(Morocco)</a></li> - -<li><a href="http://www.w3c.org.za/" class="navlink" title="Southern Africa" hreflang="en">Southern Africa</a></li> - -<li><a href="http://www.w3c.es/" class="navlink" title="Spain" hreflang="es"><span xml:lang="es" lang="es">España</span> -(Spain)</a></li> - -<li><a href="http://www.w3c.se" class="navlink" title="Sweden" hreflang="sv"><span xml:lang="sv" lang="sv">Sverige</span> -(Sweden)</a></li> - -<li><a href="http://www.w3c.rl.ac.uk/" class="navlink" title="UK and Ireland" hreflang="en-uk">United Kingdom and Ireland</a></li> -</ul> - -<h2 class="navhead"><a name="systems" id="systems">Systems</a></h2> - -<ul> -<li><a href="/Help/Account/" class="navlink">Get Password</a></li> - -<li><a href="/2003/08/system-status" class="navlink">System -Status</a></li> -</ul> -</div> -<hr class="hide" /> - -<p class="small">W3C would like to thank the <a name="donors" id="donors" href="/Consortium/sup">Supporters</a> who have contributed -financially or through a donation of goods to W3C.</p> - -<p class="small"><a name="footnotes" id="footnotes">Read</a> <a href="/2002/11/homepage">about the layout</a> and <a href="http://lists.w3.org/Archives/Public/site-comments/">send comments</a> -about this page. <a href="/2000/08/w3c-synd/home.rss">Syndicate</a> -this page with <a href="http://purl.org/rss/1.0/">RSS 1.0</a>, an -<a href="/RDF/">RDF</a> vocabulary used for <a href="/2000/08/w3c-synd/#">site summaries</a>. </p> - -<address class="small"> -<a href="/Help/Webmaster">Webmaster</a> · Last modified: - $Date: 2008/06/05 17:06:19 $ - <span class="whiteout">|</span><br /> -<a href="http://validator.w3.org/check?uri=referer"><img src="/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a> <span class="whiteout">|</span> <a href="http://jigsaw.w3.org/css-validator/"><img src="/Icons/valid-css" alt="Valid CSS!" height="31" width="88" /></a> <span class="whiteout">|</span> <a href="/WAI/WCAG1AA-Conformance" title="Explanation of Level Double-A Conformance"><img class="conform" height="31" width="88" src="/WAI/wcag1AA" alt="Level Double-A conformance icon, W3C-WAI Web Content Accessibility Guidelines 1.0" /> -</a> <span class="whiteout">|</span> -</address> - -<p class="copyright"><a rel="Copyright" href="/Consortium/Legal/ipr-notice#Copyright">Copyright</a> © 1994-2007 -<a href="/"><acronym title="World Wide Web Consortium">W3C</acronym></a><sup>®</sup> (<a href="http://www.csail.mit.edu/"><acronym title="Massachusetts Institute of Technology">MIT</acronym></a>, <a href="http://www.ercim.org/"><acronym title="European Research Consortium for Informatics and Mathematics">ERCIM</acronym></a>, -<a href="http://www.keio.ac.jp/">Keio</a>), All Rights Reserved. W3C -<a href="/Consortium/Legal/ipr-notice#Legal_Disclaimer">liability</a>, -<a href="/Consortium/Legal/ipr-notice#W3C_Trademarks">trademark</a>, -<a rel="Copyright" href="/Consortium/Legal/copyright-documents">document use</a> and <a rel="Copyright" href="/Consortium/Legal/copyright-software">software -licensing</a> rules apply. Your interactions with this site are in -accordance with our <a href="/Consortium/Legal/privacy-statement#Public">public</a> and <a href="/Consortium/Legal/privacy-statement#Members">Member</a> privacy -statements.</p> -</body> -</html> diff --git a/examples/xml/htmlinfo/youtube_com.html b/examples/xml/htmlinfo/youtube_com.html deleted file mode 100644 index 1de65a3..0000000 --- a/examples/xml/htmlinfo/youtube_com.html +++ /dev/null @@ -1,1585 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd"> - - - <html lang="en"> - -<!-- machid: 519 --> -<head> - - <title>YouTube - Broadcast Yourself.</title> - - <link rel="stylesheet" href="http://s.ytimg.com/yt/css/base_all-vfl42327.css" type="text/css"> - - <link rel="search" type="application/opensearchdescription+xml" href="/opensearch?locale=en_US" title="YouTube Video Search"> - <link rel="icon" href="http://s.ytimg.com/yt/favicon-vfl1123.ico" type="image/x-icon"> - <link rel="shortcut icon" href="http://s.ytimg.com/yt/favicon-vfl1123.ico" type="image/x-icon"> - - - <meta name="description" content="Share your videos with friends and family"> - <meta name="keywords" content="video,sharing,camera phone,video phone,free"> - - <link rel="alternate" type="application/rss+xml" title="YouTube - [RSS]" href="/rssls"> - - <link rel="alternate" media="handheld" href="http://m.youtube.com/index?desktop_uri=%2F&"> - - <script type="text/javascript"> - window.google={kHL:"en"}; - </script> - - <script type="text/javascript" src="http://s.ytimg.com/yt/js/base_all_with_bidi-vfl42302.js"></script> - - <script type="text/javascript"> - - function _hbLink (a,b) { return false; } - function urchinTracker (a,b) { } - - - var gXSRF_token = ''; - var gXSRF_field_name = ''; - var gXSRF_ql_pair = ''; - - gXSRF_token = 'fZg-xPKpfj11aUrz_5__moOGiAp8MTIxMjg1OTQ4OA=='; - gXSRF_field_name = 'session_token'; - onLoadFunctionList.push(populate_session_token); - - gXSRF_ql_pair = 'session_token=kVjpl8qnfp7RPuqnTrIu6Q8BT5d8MA=='; - - - var gQuickListTooltipText = 'Add Video to QuickList'; - var gPartnerVideoText = 'Partner Video'; - var gGoogleSuggest = true; - var gPixelGif = 'http://s.ytimg.com/yt/img/pixel-vfl73.gif'; - - var gInQuickListText = 'in <a href="/watch_queue?all">QuickList</a>'; - var gIsResultsPage = false; - </script> - - - -<script type="text/javascript"> - -function swapVideoList(linkObj) -{ - var linkId = linkObj.id; - var queryData = ''; - var newDivId = ''; - var headlineObj = document.getElementById('hpVideoListHead'); - var moreLinkObj = document.getElementById('homepage-featured-more-top'); - var bottomMoreLinkObj = document.getElementById('homepage-featured-more-bottom'); - - if (linkId == 'hpMostViewedLink') { - queryData = 'videoListType=mostViewed'; - newDivId = 'hpMostViewed'; - headlineObj.innerHTML = "Most Viewed Videos"; - moreLinkObj.innerHTML = "<a href=\"/browse?s=mp\">See More Most Viewed Videos</a>"; - bottomMoreLinkObj.innerHTML = "<a href=\"/browse?s=mp\">See More Most Viewed Videos</a>"; - } - else if (linkId == 'hpMostDiscussedLink') { - queryData = 'videoListType=mostDiscussed'; - newDivId = 'hpMostDiscussed'; - headlineObj.innerHTML = "Most Discussed Videos"; - moreLinkObj.innerHTML = "<a href=\"/browse?s=md\">See More Most Discussed Videos</a>"; - bottomMoreLinkObj.innerHTML = "<a href=\"/browse?s=md\">See More Most Discussed Videos</a>"; - } - else if (linkId == 'hpTopFavoritesLink') { - queryData = 'videoListType=topFavorites'; - newDivId = 'hpTopFavorites'; - headlineObj.innerHTML = "Top Favorites"; - moreLinkObj.innerHTML = "<a href=\"/browse?s=mf\">See More Top Favorites</a>"; - bottomMoreLinkObj.innerHTML = "<a href=\"/browse?s=mf\">See More Top Favorites</a>"; - } - else if (linkId == 'hpFeaturedLink') { - newDivId = 'hpFeatured'; - headlineObj.innerHTML = "Featured Videos"; - moreLinkObj.innerHTML = "<a href=\"/browse?s=rf\">See More Featured Videos</a>"; - bottomMoreLinkObj.innerHTML = "<a href=\"/browse?s=rf\">See More Featured Videos</a>"; - } - self.containerDiv = 'homepage-video-list' - self.fillDiv = fillDiv - self.linkId = linkId - self.newDivId = newDivId - addClass(_gel(newDivId + 'Link'), 'hilite'); - if (newDivId != 'hpMostViewed') { - removeClass(_gel('hpMostViewedLink'), 'hilite'); - } - if (newDivId != 'hpMostDiscussed') { - removeClass(_gel('hpMostDiscussedLink'), 'hilite'); - } - if (newDivId != 'hpTopFavorites') { - removeClass(_gel('hpTopFavoritesLink'), 'hilite'); - } - if (newDivId != 'hpFeatured') { - removeClass(_gel('hpFeaturedLink'), 'hilite'); - } - if (document.getElementById(newDivId)) - { - document.getElementById(newDivId).style.display = 'block'; - if (newDivId != 'hpMostViewed' && document.getElementById('hpMostViewed')) document.getElementById('hpMostViewed').style.display = 'none'; - if (newDivId != 'hpMostDiscussed' && document.getElementById('hpMostDiscussed')) document.getElementById('hpMostDiscussed').style.display = 'none'; - if (newDivId != 'hpTopFavorites' && document.getElementById('hpTopFavorites')) document.getElementById('hpTopFavorites').style.display = 'none'; - if (newDivId != 'hpFeatured' && document.getElementById('hpFeatured')) document.getElementById('hpFeatured').style.display = 'none'; - } - else if (queryData != '') { - postUrlXMLResponse('/ajax_video_list',queryData,self.fillDiv); - } -} -function fillDiv(req) -{ - if (document.getElementById('hpMostViewed')) document.getElementById('hpMostViewed').style.display = 'none'; - if (document.getElementById('hpMostDiscussed')) document.getElementById('hpMostDiscussed').style.display = 'none'; - if (document.getElementById('hpTopFavorites')) document.getElementById('hpTopFavorites').style.display = 'none'; - if (document.getElementById('hpFeatured')) document.getElementById('hpFeatured').style.display = 'none'; - var newContent = getNodeValue(req.responseXML, "html_content"); - var newdiv = document.createElement('div'); - newdiv.setAttribute("id",self.newDivId); - newdiv.innerHTML = newContent; - var container = document.getElementById(self.containerDiv); - container.appendChild(newdiv); - addQLIcons(container); -} - -function hide_active_sharing() { - hideDiv("active_sharing_div"); -} -</script> - -</head> - - -<body onload="performOnLoadFunctions();" class="en_US is-english"> - -<div id="baseDiv" class="date-20080606"> - - <div id="masthead"> - <a href="/" class="logo"><img src="http://s.ytimg.com/yt/img/pixel-vfl73.gif" width="132" height="63" border="0" alt=""/></a> - <div class="user-info"> - - <div id="loginBoxZ"> - <div class="contentBox"> - <div> - <div id="loginBoxZ-signup"> - <a href="/signup">Sign Up</a> - | <a href="http://help.youtube.com/support/youtube/bin/topic.py?topic=10546&hl=en_US">Help</a> - </div> - <div id="loginBoxZ-login"> - Login - </div> - <div class="clear"></div> - </div> - - <form method="post" name="loginForm" id="loginFormZ" action="/signup"> - <input type="hidden" name="next" value="/" id="loginNextZ"/> - <input type="hidden" name="current_form" value="loginForm" /> - <input type="hidden" name="action_login" value="1"> - <div id="loginBoxZ-container"> - <div id="loginBoxZ-labels" class="floatL"> - <label for="loginUserZ" class="nowrap">Username:</label> - <label for="loginPassZ" class="nowrap">Password:</label> - </div> - <div class="floatL"> - <input id="loginUserZ" class="loginBoxZ-input" type="text" size="16" name="username" value=""><br/> - <input id="loginPassZ" class="loginBoxZ-input" type="password" size="16" name="password"><br/> - <input type="submit" class="smallText" value="Login"> - </div> - <div class="clearL"></div> - </div> - </form> - <div id="loginBoxZ-forgot"> - <a href="/forgot_username?next=/">Forgot Username</a> - | <wbr><nobr><a href="/forgot?next=/">Forgot Password</a></nobr> - </div> - <div id="loginBoxZ-gaia"> - <a href="https://www.google.com/accounts/ServiceLogin?service=youtube&hl=en_US&continue=http%3A//www.youtube.com/signup%3Fhl%3Den_US&passive=true">Login with your Google account</a> - <a href="#" onClick="window.open('/t/help_gaia','login_help','width=580,height=480,resizable=yes,scrollbars=yes,status=0').focus();" rel="nofollow"><img src="http://s.ytimg.com/yt/img/pixel-vfl73.gif" border="0" class="alignMid gaiaHelpBtn" alt=""></a> - </div> - </div> - </div> - - <div id="localePickerBox"> - <div id="flagDiv"> - <script type="text/javascript"> - var gLocales = [ - ['ru_RU','Россия'] , ['zh_TW','台灣'] , ['ja_JP','日本'] , ['zh_HK','香港'] , ['ko_KR','한국'] , ['en_AU','Australia'] , ['pt_BR','Brasil'] , ['en_CA','Canada'] , ['de_DE','Deutschland'] , ['es_ES','España'] , ['fr_FR','France'] , ['en_US','Global'] , ['en_IN','India'] , ['en_IE','Ireland'] , ['it_IT','Italia'] , ['es_MX','México'] , ['nl_NL','Nederland'] , ['en_NZ','New Zealand'] , ['pl_PL','Polska'] , ['en_GB','United Kingdom'] - ]; - </script> - <div id="flagDivInner"> - </div> - - <div class="alignR smallText"><a href="#" onclick="closeLocalePicker(); return false;">Close</a></div> - </div> - </div> - - - - - - - <div id="util-links" class="normal-utility-links"> - - <span class="util-item first"><b><a href="/signup" onclick="_hbLink('SignUp','UtilityLinks');">Sign Up</a></b></span> - <span class="util-item"><a href="/watch_queue?all">QuickList</a> (<span id="quicklist-utility">0</span>)</span> - <span class="util-item"><a href="http://help.youtube.com/support/youtube/bin/static.py?page=start.cs&hl=en_US">Help</a></span> - <span class="util-item"><a href="#" class="loginBoxZ eLink" onclick="return openLoginBox(event);">Log In</a></span> - <span class="util-item"><a href="#" class="localePickerLink eLink" onclick="loadFlagImgs();toggleDisplay('localePickerBox');return false;">Site:</a></span> - <span class="util-item first"> <a href="#" class="localePickerLink" onclick="loadFlagImgs();toggleDisplay('localePickerBox');return false;"><img src="http://s.ytimg.com/yt/img/pixel-vfl73.gif" class="currentFlag globalFlag" alt="Site:"></a></span> - </div> - - <form name="logoutForm" method="post" target="_top" action="/index"> - <input type="hidden" name="action_logout" value="1"> - </form> - - - </div> - <div class="nav"> - <div class="nav-item first selected" id="nav-item-home"> - <span class="leftcap"></span> - <a class="content" href="/">Home</a> - <span class="rightcap"></span> - </div> - <div class="nav-item" id="nav-item-videos"> - <div class="nav-tab"> - <span class="leftcap"></span> - <a class="content" href="/browse?s=mp">Videos</a> - <span class="rightcap"></span> - </div> - </div> - <div class="nav-item" id="nav-item-channels"> - <div class="nav-tab"> - <span class="leftcap"></span> - <a class="content" href="/members">Channels</a> - <span class="rightcap"></span> - </div> - </div> - <div class="nav-item" id="nav-item-community"> - <div class="nav-tab"> - <span class="leftcap"></span> - <a class="content" href="/community">Community</a> - <span class="rightcap"></span> - </div> - </div> - </div> - - <form autocomplete="off" action="/results" method="get" name="searchForm" onsubmit="return submitRegularSearchRequest()"> - - <div class="bar"> - <span class="leftcap"></span> - <div class="search-bar"> - <a href="/my_videos_upload" id="upload-button" class="action-button"> - <span class="action-button-leftcap"></span> - <span class="action-button-text">Upload</span> - <span class="action-button-rightcap"></span> - </a> - <div id="search-form"> - <input id="search-term" name="search_query" type="text" tabindex="1" onkeyup="goog.i18n.bidi.setDirAttribute(event,this)" value="" maxlength="128" /> - <select class="search-type" name="search_type"> - <option value="">Videos</option> - <option value="search_users" >Channels</option> - </select> - <input id="search-button" type="submit" value="Search" /> - </div> - <div class="search-settings-link"> - <a href="#" class="eLink" onClick="return toggleAdvSearch('', '', '', '', '', '')"> - advanced - </a></div> - </div> - <span class="rightcap"></span> - </div> - - </form> - - <div id="search-advanced-form" class="hid"> - <div class="search-setting-inner alignC">Loading...</div> - </div> - - <div class="clear"></div> - </div> - <div id="search-settings-clr" class="hid"></div> - - - - - - -<div id="homepage-main-content"> - <div> - <div id="active_sharing_div" name="active_sharing_div" style="display:block"></div> - <script type="text/javascript"> - // <![CDATA[ - var fo = new SWFObject("active_sharing.swf", "active_sharing", "550", "115", 7, "#FFFFFF"); - var showstr = "Videos being watched right now..."; - fo.addParam('wmode', 'opaque'); - fo.addVariable("t", showstr); - fo.write("active_sharing_div"); - // ]]> - </script> -</div> - - <div class="homepage-content-block" style="margin-left:18px; border:0px #CCC solid;"> - <div class="homepage-block-heading homepage-block-heading-gray">Promoted Videos</div> - <div> - <div class="homepage-sponsored-video marB0"> - <div class="videoIconWrapperOuter"> - <div class="videoIconWrapperInner"> - <div class="vstill"><a href="/cthru?key=YSqt3w6VDhuNgxUzVZsryt0JX30ll7tCIrBT--_pvAtRC3KmvsBYFaUNR1qT0d0BnBJYjHz_G7LIr21ufG7W6gJL7zPdHNbcmuIxaafL1yry8cdcqeEOTitWLXkpm2q2QnTAlp4chC1jus7JLVCnCdacl0xUeDk4Vk8e6q9htmGbDZPN9QMnHsrX2RZnvDMx-3Im14C3GKi4jI8ee-jnOQ==" name="&lid=DV+-+BasiaBulatInTheNight+-+beggars&lpos=hp-s0"><img src="http://i.ytimg.com/vi/CebHAvPHyyU/default.jpg" class="vimg120"></a></div> - </div> - </div> - - <div class="vtitle smallText"> - <a href="/cthru?key=YSqt3w6VDhuNgxUzVZsryt0JX30ll7tCIrBT--_pvAtRC3KmvsBYFaUNR1qT0d0BnBJYjHz_G7LIr21ufG7W6gJL7zPdHNbcmuIxaafL1yry8cdcqeEOTitWLXkpm2q2QnTAlp4chC1jus7JLVCnCdacl0xUeDk4Vk8e6q9htmGbDZPN9QMnHsrX2RZnvDMx-3Im14C3GKi4jI8ee-jnOQ==" name="&lid=DV+-+BasiaBulatInTheNight+-+beggars&lpos=hp-s0">Basia Bulat - In Th...</a> - </div> - <div class="vfacets" style="margin-bottom: 0px;"> - <a href="/user/beggars" class="dg">beggars</a> - </div> - </div> - <div class="homepage-sponsored-video marB0"> - <div class="videoIconWrapperOuter"> - <div class="videoIconWrapperInner"> - <div class="vstill"><a href="/cthru?key=FIUXMxdvOKhDw2_wpR7bE9L-XUsHMZBHRpS_s21B0Kq0RTWlGXSqQ8bjw6tBQOUczUtO8b6_mktukdd5ChseYAl10dE5JQrlpiOQE6HNMOAsszaA0M9qhzFnOkWPrkFGMDW5vvaAOkIwas6ksi4e_R8wkiIhlNYPDiqi2f4LpVzB2jpe0LobjIEF9czWjFx9ymrPg8wx2x6w00jF-BzRfQ==" name="&lid=DV+-+Perfection+-+corporalcadet&lpos=hp-s1"><img src="http://i.ytimg.com/vi/Np4bhsmr3iE/default.jpg" class="vimg120"></a></div> - </div> - </div> - - <div class="vtitle smallText"> - <a href="/cthru?key=FIUXMxdvOKhDw2_wpR7bE9L-XUsHMZBHRpS_s21B0Kq0RTWlGXSqQ8bjw6tBQOUczUtO8b6_mktukdd5ChseYAl10dE5JQrlpiOQE6HNMOAsszaA0M9qhzFnOkWPrkFGMDW5vvaAOkIwas6ksi4e_R8wkiIhlNYPDiqi2f4LpVzB2jpe0LobjIEF9czWjFx9ymrPg8wx2x6w00jF-BzRfQ==" name="&lid=DV+-+Perfection+-+corporalcadet&lpos=hp-s1">Perfection</a> - </div> - <div class="vfacets" style="margin-bottom: 0px;"> - <a href="/user/corporalcadet" class="dg">corporalcadet</a> - </div> - </div> - <div class="homepage-sponsored-video marB0"> - <div class="videoIconWrapperOuter"> - <div class="videoIconWrapperInner"> - <div class="vstill"><a href="/cthru?key=1W2J508g9g7Bjsvodsvq3GHZo25JkqX7Js5JSHnyP1yZYB96KDh2LTC2pCKjeHc7LEiTUU4uhuwsrTzZfns_IR2dsA7leCUYMtvgq3noBHy-G0jTHmgiQtFUVTDU3jT2EkS39J6Ur2qxtHwAmybMcU83hK1guqpPdryKOfcbHovo-Kbwglzbbl28LrK1iNdz5E6NZ5CZCVZrYxldbWyjEA==" name="&lid=DV+-+WhatmatterstoyoumeVFS+-+Jr0canest&lpos=hp-s2"><img src="http://i.ytimg.com/vi/KExoP97KUnY/default.jpg" class="vimg120"></a></div> - </div> - </div> - - <div class="vtitle smallText"> - <a href="/cthru?key=1W2J508g9g7Bjsvodsvq3GHZo25JkqX7Js5JSHnyP1yZYB96KDh2LTC2pCKjeHc7LEiTUU4uhuwsrTzZfns_IR2dsA7leCUYMtvgq3noBHy-G0jTHmgiQtFUVTDU3jT2EkS39J6Ur2qxtHwAmybMcU83hK1guqpPdryKOfcbHovo-Kbwglzbbl28LrK1iNdz5E6NZ5CZCVZrYxldbWyjEA==" name="&lid=DV+-+WhatmatterstoyoumeVFS+-+Jr0canest&lpos=hp-s2">What matters to you...</a> - </div> - <div class="vfacets" style="margin-bottom: 0px;"> - <a href="/user/Jr0canest" class="dg">Jr0canest</a> - </div> - </div> - <div class="homepage-sponsored-video marB0"> - <div class="videoIconWrapperOuter"> - <div class="videoIconWrapperInner"> - <div class="vstill"><a href="/cthru?key=idL1slcMKbuzX2MFZaS-nifq5PWrCKLUZMXEPqCthRVET6PQSkxlmKQVMNmQvlYpQlFISkRprfO113rH-ER0ytYh0zSMWI4XbaO74zcrIZiSpB3oISku9zIGUwS5WI03Y0ZiHbGAC9GIYziEcRcgzcEYuizlUwNvTWDgNSvrCJHcyPYokMUjLjcwqD2wEEAe7jfIfcJRNl3sW7ODuiN_MA==" name="&lid=DV+-+LIfeisaMasquerade+-+bananaruthy&lpos=hp-s3"><img src="http://i.ytimg.com/vi/l9gjk5hHiGM/default.jpg" class="vimg120"></a></div> - </div> - </div> - - <div class="vtitle smallText"> - <a href="/cthru?key=idL1slcMKbuzX2MFZaS-nifq5PWrCKLUZMXEPqCthRVET6PQSkxlmKQVMNmQvlYpQlFISkRprfO113rH-ER0ytYh0zSMWI4XbaO74zcrIZiSpB3oISku9zIGUwS5WI03Y0ZiHbGAC9GIYziEcRcgzcEYuizlUwNvTWDgNSvrCJHcyPYokMUjLjcwqD2wEEAe7jfIfcJRNl3sW7ODuiN_MA==" name="&lid=DV+-+LIfeisaMasquerade+-+bananaruthy&lpos=hp-s3">LIfe is a Masquerade.</a> - </div> - <div class="vfacets" style="margin-bottom: 0px;"> - <a href="/user/bananaruthy" class="dg">bananaruthy</a> - </div> - </div> - <div class="clearL" style="height: 1px;"></div> - </div> - </div> - - - <div id="homepage-featured-heading"> - <div id="homepage-featured-more-top"><a id="hpVideoListMoreLink" href="/browse?s=rf">See More Featured Videos</a></div> - <h1 id="hpVideoListHead">Featured Videos</h1> - </div> - - <div id="homepage-featured-tabs"> - <a href="#" id="hpTopFavoritesLink" name="&lid=hpTopFavoritesTab&lpos=hpTabs" onclick="swapVideoList(this); return false;">Top Favorites</a> - <a href="#" id="hpMostDiscussedLink" name="&lid=hpMostDiscussedTab&lpos=hpTabs" onclick="swapVideoList(this); return false;">Most Discussed</a> - <a href="#" id="hpMostViewedLink" name="&lid=hpMostViewedTab&lpos=hpTabs" onclick="swapVideoList(this); return false;">Most Viewed</a> - <a href="#" id="hpFeaturedLink" name="&lid=hpFeaturedTab&lpos=hpTabs" onclick="swapVideoList(this); return false;" class="first hilite">Featured</a> - <div class="clear"></div> - </div> - - - - <div id="homepage-video-list" class="browseListView"> - <div id="hpFeatured"> - - - - - <div class="vlentry" > - - <div class="vlcontainer"><div class="v120WideEntry"><div class="v120WrapperOuter"><div class="v120WrapperInner"><a href="/watch?v=uu-NTSZ27b0"><img src="http://i.ytimg.com/vi/uu-NTSZ27b0/default.jpg" class="vimg120" title="Caribbean PVC Marimba Children's Orchestra" qliconalt="uu-NTSZ27b0" alt="video"></a></div></div> </div> - - <div class="vldescbox"> - <div class="vltitle"> - <div class="vlshortTitle"> - <a href="/watch?v=uu-NTSZ27b0" title="Caribbean PVC Marimba Children's Orchestra" onclick="_hbLink('CaribbeanPVCMarimbaChildrensOrchestra','VidVert');">Caribbean PVC Marimba Children's...</a> - </div> - <div class="vllongTitle"> - <a href="/watch?v=uu-NTSZ27b0" title="Caribbean PVC Marimba Children's Orchestra" onclick="_hbLink('CaribbeanPVCMarimbaChildrensOrchestra','VidVert');">Caribbean PVC Marimba Children's Orchestra</a> - </div> - </div> - - <div class="vldesc"> - - - <span id="BeginvidDescuuNTSZ27b0"> - Michael Greiner who is a neighbor and good friend of mine asked me to upload several Marim - </span> - - <span id="RemainvidDescuuNTSZ27b0" style="display: none">Michael Greiner who is a neighbor and good friend of mine asked me to upload several Marimba videos for him (that's him on the left in the middle row). He currently teaches the music program at Aveson Charter School http://aveson.org/ and constructs musical instruments in classes with students' participation.<br/><br/>Michael Greiner created this set of plastic pipe marimbas. On this clip are three generations of prototypes designed to be low cost for use by childrens' programming. The top one bass version costs around $200 in materials. The mallets are home made using foam flip-flops mounted to sticks. Filmed at Norma Coombs primary school in Altadena CA in 2007.<br/><br/>*** Edited to Add ****<br/>Wow, it looks like this video's hit YouTube's front page. Thank you for all the wonderfully kind and supportive comments!</span> - <span id="MorevidDescuuNTSZ27b0" class="smallText">(<a href="#" class="eLink" onclick="showDiv('RemainvidDescuuNTSZ27b0'); hideDiv('MorevidDescuuNTSZ27b0'); hideDiv('BeginvidDescuuNTSZ27b0'); showDiv('LessvidDescuuNTSZ27b0'); return false;">more</a>)</span> - <span id="LessvidDescuuNTSZ27b0" style="display: none" class="smallText">(<a href="#" class="eLink" onclick="hideDiv('RemainvidDescuuNTSZ27b0'); hideDiv('LessvidDescuuNTSZ27b0'); showDiv('BeginvidDescuuNTSZ27b0'); showDiv('MorevidDescuuNTSZ27b0'); return false;">less</a>)</span> - - - - </div> - </div> - - <div class="vlclearaltl"></div> - - - </div> - - <div class="vlfacets"> - <div class="vladded"> - </div> - <div><span class="grayText vlfromlbl">From:</span><span class="vlfrom"><a href="/user/PlayHanghang">PlayHanghang</a></span></div> - <div class="clearL"></div> - <span class="grayText">Views:</span> 3,853<br/> - - <div class="video-thumb-duration-rating"> - - - <div> - - <img class="ratingVS ratingVS-5.0" alt="4.84814814815" src="http://s.ytimg.com/yt/img/pixel-vfl73.gif" /> - - - - </div> - - - - <div class="runtime">01:46</div> - </div> - - <div class="clear"></div> - <div class="vlcategory"> - <span class="smgrayText">More in</span> <a href="/results?search_query=None&search_category=24">Entertainment</a> - </div> - </div> - - <div class="vlclearaltl"></div> - - - - </div> <!-- end vEntry --> - - - - - - - <div class="vlentry" > - - <div class="vlcontainer"><div class="v120WideEntry"><div class="v120WrapperOuter"><div class="v120WrapperInner"><a href="/watch?v=CFJRn7akXeQ"><img src="http://i.ytimg.com/vi/CFJRn7akXeQ/default.jpg" class="vimg120" title=""Sharp Teeth" Excerpt #1" qliconalt="CFJRn7akXeQ" alt="video"></a></div></div> </div> - - <div class="vldescbox"> - <div class="vltitle"> - <div class="vlshortTitle"> - <a href="/watch?v=CFJRn7akXeQ" title=""Sharp Teeth" Excerpt #1" onclick="_hbLink('SharpTeethExcerpt1','VidVert');">"Sharp Teeth" Excerpt #1</a> - </div> - <div class="vllongTitle"> - <a href="/watch?v=CFJRn7akXeQ" title=""Sharp Teeth" Excerpt #1" onclick="_hbLink('SharpTeethExcerpt1','VidVert');">"Sharp Teeth" Excerpt #1</a> - </div> - </div> - - <div class="vldesc"> - - - <span id="BeginvidDescCFJRn7akXeQ"> - Check out the book "Sharp Teeth" on Amazon:<br/>http://www.amazon.com/Sharp-Teeth-Toby-Barlow - </span> - - <span id="RemainvidDescCFJRn7akXeQ" style="display: none">Check out the book "Sharp Teeth" on Amazon:<br/>http://www.amazon.com/Sharp-Teeth-Toby-Barlow/dp/0061430226/ ref=pd_bbs_sr_1?ie=UTF8&s=books&qid=1212767529&sr=8-1<br/><br/>Animation directed by Limbert Fabian. Produced by Matt Thunell. For more information go to sharpteeththebook.com</span> - <span id="MorevidDescCFJRn7akXeQ" class="smallText">(<a href="#" class="eLink" onclick="showDiv('RemainvidDescCFJRn7akXeQ'); hideDiv('MorevidDescCFJRn7akXeQ'); hideDiv('BeginvidDescCFJRn7akXeQ'); showDiv('LessvidDescCFJRn7akXeQ'); return false;">more</a>)</span> - <span id="LessvidDescCFJRn7akXeQ" style="display: none" class="smallText">(<a href="#" class="eLink" onclick="hideDiv('RemainvidDescCFJRn7akXeQ'); hideDiv('LessvidDescCFJRn7akXeQ'); showDiv('BeginvidDescCFJRn7akXeQ'); showDiv('MorevidDescCFJRn7akXeQ'); return false;">less</a>)</span> - - - - </div> - </div> - - <div class="vlclearaltl"></div> - - - </div> - - <div class="vlfacets"> - <div class="vladded"> - </div> - <div><span class="grayText vlfromlbl">From:</span><span class="vlfrom"><a href="/user/tobybarlowny">tobybarlowny</a></span></div> - <div class="clearL"></div> - <span class="grayText">Views:</span> 67,438<br/> - - <div class="video-thumb-duration-rating"> - - - <div> - - <img class="ratingVS ratingVS-4.5" alt="4.39928057554" src="http://s.ytimg.com/yt/img/pixel-vfl73.gif" /> - - - - </div> - - - - <div class="runtime">01:33</div> - </div> - - <div class="clear"></div> - <div class="vlcategory"> - <span class="smgrayText">More in</span> <a href="/results?search_query=None&search_category=1">Film & Animation</a> - </div> - </div> - - <div class="vlclearaltl"></div> - - - - </div> <!-- end vEntry --> - - - - - - - <div class="vlentry" > - - <div class="vlcontainer"><div class="v120WideEntry"><div class="v120WrapperOuter"><div class="v120WrapperInner"><a href="/watch?v=sNROaXA6OSI"><img src="http://i.ytimg.com/vi/sNROaXA6OSI/default.jpg" class="vimg120" title="Touring to Alaska on Vegetable Oil!" qliconalt="sNROaXA6OSI" alt="video"></a></div></div> </div> - - <div class="vldescbox"> - <div class="vltitle"> - <div class="vlshortTitle"> - <a href="/watch?v=sNROaXA6OSI" title="Touring to Alaska on Vegetable Oil!" onclick="_hbLink('TouringtoAlaskaonVegetableOil','VidVert');">Touring to Alaska on Vegetable Oil!</a> - </div> - <div class="vllongTitle"> - <a href="/watch?v=sNROaXA6OSI" title="Touring to Alaska on Vegetable Oil!" onclick="_hbLink('TouringtoAlaskaonVegetableOil','VidVert');">Touring to Alaska on Vegetable Oil!</a> - </div> - </div> - - <div class="vldesc"> - - - <span id="BeginvidDescsNROaXA6OSI"> - This video is for Mrs. Aderman's 1st Period Environmental Science Class.<br/><br/>We are Mose Gi - </span> - - <span id="RemainvidDescsNROaXA6OSI" style="display: none">This video is for Mrs. Aderman's 1st Period Environmental Science Class.<br/><br/>We are Mose Giganticus and The Emotron and this year we are touring to Alaska on Vegetable Oil.</span> - <span id="MorevidDescsNROaXA6OSI" class="smallText">(<a href="#" class="eLink" onclick="showDiv('RemainvidDescsNROaXA6OSI'); hideDiv('MorevidDescsNROaXA6OSI'); hideDiv('BeginvidDescsNROaXA6OSI'); showDiv('LessvidDescsNROaXA6OSI'); return false;">more</a>)</span> - <span id="LessvidDescsNROaXA6OSI" style="display: none" class="smallText">(<a href="#" class="eLink" onclick="hideDiv('RemainvidDescsNROaXA6OSI'); hideDiv('LessvidDescsNROaXA6OSI'); showDiv('BeginvidDescsNROaXA6OSI'); showDiv('MorevidDescsNROaXA6OSI'); return false;">less</a>)</span> - - - - </div> - </div> - - <div class="vlclearaltl"></div> - - - </div> - - <div class="vlfacets"> - <div class="vladded"> - </div> - <div><span class="grayText vlfromlbl">From:</span><span class="vlfrom"><a href="/user/kylemotron">kylemotron</a></span></div> - <div class="clearL"></div> - <span class="grayText">Views:</span> 122,748<br/> - - <div class="video-thumb-duration-rating"> - - - <div> - - <img class="ratingVS ratingVS-4.5" alt="4.44329896907" src="http://s.ytimg.com/yt/img/pixel-vfl73.gif" /> - - - - </div> - - - - <div class="runtime">04:02</div> - </div> - - <div class="clear"></div> - <div class="vlcategory"> - <span class="smgrayText">More in</span> <a href="/results?search_query=None&search_category=27">Education</a> - </div> - </div> - - <div class="vlclearaltl"></div> - - - - </div> <!-- end vEntry --> - - - - - - - <div class="vlentry" > - - <div class="vlcontainer"><div class="v120WideEntry"><div class="v120WrapperOuter"><div class="v120WrapperInner"><a href="/watch?v=6iC3b5JnSIE"><img src="http://i.ytimg.com/vi/6iC3b5JnSIE/default.jpg" class="vimg120" title="JCJC" qliconalt="6iC3b5JnSIE" alt="video"></a></div></div> </div> - - <div class="vldescbox"> - <div class="vltitle"> - <div class="vlshortTitle"> - <a href="/watch?v=6iC3b5JnSIE" title="JCJC" onclick="_hbLink('JCJC','VidVert');">JCJC</a> - </div> - <div class="vllongTitle"> - <a href="/watch?v=6iC3b5JnSIE" title="JCJC" onclick="_hbLink('JCJC','VidVert');">JCJC</a> - </div> - </div> - - <div class="vldesc"> - - - <span id="BeginvidDesc6iC3b5JnSIE"> - His name is Okotanpe. <br/>His mail addless is fuseloopa@hotmail.com <br/><br/>The name of this son - </span> - - <span id="RemainvidDesc6iC3b5JnSIE" style="display: none">His name is Okotanpe. <br/>His mail addless is fuseloopa@hotmail.com <br/><br/>The name of this song is 300ml(milk).<br/>An artist name is Rei harakami. <br/>Check it out!</span> - <span id="MorevidDesc6iC3b5JnSIE" class="smallText">(<a href="#" class="eLink" onclick="showDiv('RemainvidDesc6iC3b5JnSIE'); hideDiv('MorevidDesc6iC3b5JnSIE'); hideDiv('BeginvidDesc6iC3b5JnSIE'); showDiv('LessvidDesc6iC3b5JnSIE'); return false;">more</a>)</span> - <span id="LessvidDesc6iC3b5JnSIE" style="display: none" class="smallText">(<a href="#" class="eLink" onclick="hideDiv('RemainvidDesc6iC3b5JnSIE'); hideDiv('LessvidDesc6iC3b5JnSIE'); showDiv('BeginvidDesc6iC3b5JnSIE'); showDiv('MorevidDesc6iC3b5JnSIE'); return false;">less</a>)</span> - - - - </div> - </div> - - <div class="vlclearaltl"></div> - - - </div> - - <div class="vlfacets"> - <div class="vladded"> - </div> - <div><span class="grayText vlfromlbl">From:</span><span class="vlfrom"><a href="/user/YoneyaYu">YoneyaYu</a></span></div> - <div class="clearL"></div> - <span class="grayText">Views:</span> 532,447<br/> - - <div class="video-thumb-duration-rating"> - - - <div> - - <img class="ratingVS ratingVS-5.0" alt="4.83995523223" src="http://s.ytimg.com/yt/img/pixel-vfl73.gif" /> - - - - </div> - - - - <div class="runtime">05:26</div> - </div> - - <div class="clear"></div> - <div class="vlcategory"> - <span class="smgrayText">More in</span> <a href="/results?search_query=None&search_category=24">Entertainment</a> - </div> - </div> - - <div class="vlclearaltl"></div> - - - - </div> <!-- end vEntry --> - - - - - - - <div class="vlentry" > - - <div class="vlcontainer"><div class="v120WideEntry"><div class="v120WrapperOuter"><div class="v120WrapperInner"><a href="/watch?v=L9Wu1V1JAHw"><img src="http://i.ytimg.com/vi/L9Wu1V1JAHw/default.jpg" class="vimg120" title="Certainty In Freedom ~ A Song for Burma (Original Song)" qliconalt="L9Wu1V1JAHw" partner="true" alt="video"></a></div></div> </div> - - <div class="vldescbox"> - <div class="vltitle"> - <div class="vlshortTitle"> - <a href="/watch?v=L9Wu1V1JAHw" title="Certainty In Freedom ~ A Song for Burma (Original Song)" onclick="_hbLink('CertaintyInFreedomASongforBurmaOriginalSong','VidVert');">Certainty In Freedom ~ A Song fo...</a> - </div> - <div class="vllongTitle"> - <a href="/watch?v=L9Wu1V1JAHw" title="Certainty In Freedom ~ A Song for Burma (Original Song)" onclick="_hbLink('CertaintyInFreedomASongforBurmaOriginalSong','VidVert');">Certainty In Freedom ~ A Song for Burma (Original Song)</a> - </div> - </div> - - <div class="vldesc"> - - - <span id="BeginvidDescL9Wu1V1JAHw"> - I'm not a particularly political person, by which I mean I'd sooner just not get involved - </span> - - <span id="RemainvidDescL9Wu1V1JAHw" style="display: none">I'm not a particularly political person, by which I mean I'd sooner just not get involved in conflict, but I realise that, at times, things happen outside your control which will you to say something or do something.<br/><br/>I got a comment on my last song from 'gersing' asking me if I'd sing a song for the monks and people of Burma. At first I misunderstood the comment but then it clicked and I felt compelled to offer something.. anything. <br/><br/>I know this song is going to change nothing; and I'm cautious calling it a protest song as I don't understand the situation fully (and I wouldn't want to upset anyone), but this is a tune I wrote in response to being repressed (I'm whatever guise) and how beautiful 'freedom' really is. I don't think anyone will ever understand that term fully but by singing and writing and thinking and speaking we can come somewhere close I'm sure. <br/><br/>As a disclaimer, I'd say that, personally, the chords and melody are arbitrary; merely the carrier of the sentiment...<br/><br/>Changing the subject ever so slightly I just wanted to say a big thank you to everyone that's shown support; it's overwhelming. An apology to anyone I've not yet responded to.. I've never been very good at juggling my time but I will be in touch.<br/><br/>Thanks again...<br/><br/>_________________<br/>Certainty In Freedom<br/><br/>If I had the will to talk<br/>I wonder if you'd give a thought <br/>To what I had to say - help make it go away<br/><br/>Cos there's certainty in freedom<br/>And in that we must believe in<br/>Cos I saw on the news today<br/><br/>If I saw you in the street now<br/>Would I look the other way?<br/>I hope I'm strong enough to say - help make it go away<br/><br/>When all you see is hatred<br/>Spirits crushed and souls deflated<br/>Easy to leave it for another day<br/><br/>Peace is pushing for love<br/>Love is leading the way<br/>You should follow its path<br/>Darkness leads you astray<br/>Peace is pushing for love<br/>Love is leading the way<br/><br/>So this, my only voice to speak<br/>My message strong, my tone is weak<br/>I find it hard to say - help make it go away<br/><br/>And if I come across obtuse<br/>I urge you now to cut the noose<br/>Don't leave it for another day<br/><br/>Peace is pushing for love<br/>Love is leading the way<br/>You should follow its path<br/>Darkness leads you astray<br/>Peace is pushing for love<br/>Love is leading the way<br/><br/>If I had the will to talk<br/>I wonder if you'd give a thought <br/>To what I had to say - help make it go away<br/><br/>Cos there's certainty in freedom<br/>And in that we must believe in<br/>Cos I saw on the news today<br/><br/>Peace is pushing for love<br/>Love is leading the way<br/>You should follow its path<br/>Darkness leads you astray<br/>Peace is pushing for love<br/>Love is leading the way<br/><br/>_____________________<br/>Peace<br/><br/>Available on the 'Unequal Measures', available through http://www.krisrowley.com<br/>© Kris Rowley 2007</span> - <span id="MorevidDescL9Wu1V1JAHw" class="smallText">(<a href="#" class="eLink" onclick="showDiv('RemainvidDescL9Wu1V1JAHw'); hideDiv('MorevidDescL9Wu1V1JAHw'); hideDiv('BeginvidDescL9Wu1V1JAHw'); showDiv('LessvidDescL9Wu1V1JAHw'); return false;">more</a>)</span> - <span id="LessvidDescL9Wu1V1JAHw" style="display: none" class="smallText">(<a href="#" class="eLink" onclick="hideDiv('RemainvidDescL9Wu1V1JAHw'); hideDiv('LessvidDescL9Wu1V1JAHw'); showDiv('BeginvidDescL9Wu1V1JAHw'); showDiv('MorevidDescL9Wu1V1JAHw'); return false;">less</a>)</span> - - - - </div> - </div> - - <div class="vlclearaltl"></div> - - - </div> - - <div class="vlfacets"> - <div class="vladded"> - </div> - <div><span class="grayText vlfromlbl">From:</span><span class="vlfrom"><a href="/user/zzzzzzzzap">zzzzzzzzap</a></span></div> - <div class="clearL"></div> - <span class="grayText">Views:</span> 136,222<br/> - - <div class="video-thumb-duration-rating"> - - - <div> - - <img class="ratingVS ratingVS-4.5" alt="4.65044814341" src="http://s.ytimg.com/yt/img/pixel-vfl73.gif" /> - - - - </div> - - - - <div class="runtime">03:55</div> - </div> - - <div class="clear"></div> - <div class="vlcategory"> - <span class="smgrayText">More in</span> <a href="/results?search_query=None&search_category=10">Music</a> - </div> - </div> - - <div class="vlclearaltl"></div> - - - - </div> <!-- end vEntry --> - - - - - - - <div class="vlentry" > - - <div class="vlcontainer"><div class="v120WideEntry"><div class="v120WrapperOuter"><div class="v120WrapperInner"><a href="/watch?v=gQNY7Sti8FY"><img src="http://s4.ytimg.com/vi/gQNY7Sti8FY/default.jpg" class="vimg120" title="the world is at your fingertips" qliconalt="gQNY7Sti8FY" partner="true" alt="video"></a></div></div> </div> - - <div class="vldescbox"> - <div class="vltitle"> - <div class="vlshortTitle"> - <a href="/watch?v=gQNY7Sti8FY" title="the world is at your fingertips" onclick="_hbLink('theworldisatyourfingertips','VidVert');">the world is at your fingertips</a> - </div> - <div class="vllongTitle"> - <a href="/watch?v=gQNY7Sti8FY" title="the world is at your fingertips" onclick="_hbLink('theworldisatyourfingertips','VidVert');">the world is at your fingertips</a> - </div> - </div> - - <div class="vldesc"> - - - <span id="BeginvidDescgQNY7Sti8FY"> - for the taking. - </span> - - - - - </div> - </div> - - <div class="vlclearaltl"></div> - - - </div> - - <div class="vlfacets"> - <div class="vladded"> - </div> - <div><span class="grayText vlfromlbl">From:</span><span class="vlfrom"><a href="/user/SupaDupaFlyGirl">SupaDupaFlyGirl</a></span></div> - <div class="clearL"></div> - <span class="grayText">Views:</span> 509,825<br/> - - <div class="video-thumb-duration-rating"> - - - <div> - - <img class="ratingVS ratingVS-4.0" alt="3.91057134971" src="http://s.ytimg.com/yt/img/pixel-vfl73.gif" /> - - - - </div> - - - - <div class="runtime">05:15</div> - </div> - - <div class="clear"></div> - <div class="vlcategory"> - <span class="smgrayText">More in</span> <a href="/results?search_query=None&search_category=28">Science & Technology</a> - </div> - </div> - - <div class="vlclearaltl"></div> - - - - </div> <!-- end vEntry --> - - - - - - - <div class="vlentry" > - - <div class="vlcontainer"><div class="v120WideEntry"><div class="v120WrapperOuter"><div class="v120WrapperInner"><a href="/watch?v=rGUt7ropzNA"><img src="http://i.ytimg.com/vi/rGUt7ropzNA/default.jpg" class="vimg120" title="Aimee Mann Freeway Video Contest" qliconalt="rGUt7ropzNA" alt="video"></a></div></div> </div> - - <div class="vldescbox"> - <div class="vltitle"> - <div class="vlshortTitle"> - <a href="/watch?v=rGUt7ropzNA" title="Aimee Mann Freeway Video Contest" onclick="_hbLink('AimeeMannFreewayVideoContest','VidVert');">Aimee Mann Freeway Video Contest</a> - </div> - <div class="vllongTitle"> - <a href="/watch?v=rGUt7ropzNA" title="Aimee Mann Freeway Video Contest" onclick="_hbLink('AimeeMannFreewayVideoContest','VidVert');">Aimee Mann Freeway Video Contest</a> - </div> - </div> - - <div class="vldesc"> - - - <span id="BeginvidDescrGUt7ropzNA"> - Want a chance to sing with Aimee Mann live? Go to http://www.youtube.com/group/aimeemannco - </span> - - <span id="RemainvidDescrGUt7ropzNA" style="display: none">Want a chance to sing with Aimee Mann live? Go to http://www.youtube.com/group/aimeemanncontest and upload a video of yourself singing Aimee Mann's new song "Freeway."<br/><br/>Aimee Mann and SuperEgo Records will pick their favorite entry to be featured on YouTube and www.aimeemann.com. The winner will have an opportunity to sing live with Aimee at one of her upcoming shows. Ten runners-up will receive an autographed copy of Aimee's new CD, @#%&*! Smilers.<br/><br/>Entrants can get the lyrics, the instrumental version of "Freeway" and contest details at: http://www.aimeemann.com/freewaycontest/<br/>Submissions must be received by July 7th 2008</span> - <span id="MorevidDescrGUt7ropzNA" class="smallText">(<a href="#" class="eLink" onclick="showDiv('RemainvidDescrGUt7ropzNA'); hideDiv('MorevidDescrGUt7ropzNA'); hideDiv('BeginvidDescrGUt7ropzNA'); showDiv('LessvidDescrGUt7ropzNA'); return false;">more</a>)</span> - <span id="LessvidDescrGUt7ropzNA" style="display: none" class="smallText">(<a href="#" class="eLink" onclick="hideDiv('RemainvidDescrGUt7ropzNA'); hideDiv('LessvidDescrGUt7ropzNA'); showDiv('BeginvidDescrGUt7ropzNA'); showDiv('MorevidDescrGUt7ropzNA'); return false;">less</a>)</span> - - - - </div> - </div> - - <div class="vlclearaltl"></div> - - - </div> - - <div class="vlfacets"> - <div class="vladded"> - </div> - <div><span class="grayText vlfromlbl">From:</span><span class="vlfrom"><a href="/user/aimeemann">aimeemann</a></span></div> - <div class="clearL"></div> - <span class="grayText">Views:</span> 283,776<br/> - - <div class="video-thumb-duration-rating"> - - - <div> - - <img class="ratingVS ratingVS-4.0" alt="3.79036827195" src="http://s.ytimg.com/yt/img/pixel-vfl73.gif" /> - - - - </div> - - - - <div class="runtime">02:22</div> - </div> - - <div class="clear"></div> - <div class="vlcategory"> - <span class="smgrayText">More in</span> <a href="/results?search_query=None&search_category=10">Music</a> - </div> - </div> - - <div class="vlclearaltl"></div> - - - - </div> <!-- end vEntry --> - - - - - - - <div class="vlentry" > - - <div class="vlcontainer"><div class="v120WideEntry"><div class="v120WrapperOuter"><div class="v120WrapperInner"><a href="/watch?v=tbEei0I3kMQ"><img src="http://i.ytimg.com/vi/tbEei0I3kMQ/default.jpg" class="vimg120" title="Interactive card trick" qliconalt="tbEei0I3kMQ" alt="video"></a></div></div> </div> - - <div class="vldescbox"> - <div class="vltitle"> - <div class="vlshortTitle"> - <a href="/watch?v=tbEei0I3kMQ" title="Interactive card trick" onclick="_hbLink('Interactivecardtrick','VidVert');">Interactive card trick</a> - </div> - <div class="vllongTitle"> - <a href="/watch?v=tbEei0I3kMQ" title="Interactive card trick" onclick="_hbLink('Interactivecardtrick','VidVert');">Interactive card trick</a> - </div> - </div> - - <div class="vldesc"> - - - <span id="BeginvidDesctbEei0I3kMQ"> - This is the first interactive video on YouTube!<br/>Have fun and enjoy the show<br/>you can see - </span> - - <span id="RemainvidDesctbEei0I3kMQ" style="display: none">This is the first interactive video on YouTube!<br/>Have fun and enjoy the show<br/>you can see our magician site:<br/>orenshalom.co.il</span> - <span id="MorevidDesctbEei0I3kMQ" class="smallText">(<a href="#" class="eLink" onclick="showDiv('RemainvidDesctbEei0I3kMQ'); hideDiv('MorevidDesctbEei0I3kMQ'); hideDiv('BeginvidDesctbEei0I3kMQ'); showDiv('LessvidDesctbEei0I3kMQ'); return false;">more</a>)</span> - <span id="LessvidDesctbEei0I3kMQ" style="display: none" class="smallText">(<a href="#" class="eLink" onclick="hideDiv('RemainvidDesctbEei0I3kMQ'); hideDiv('LessvidDesctbEei0I3kMQ'); showDiv('BeginvidDesctbEei0I3kMQ'); showDiv('MorevidDesctbEei0I3kMQ'); return false;">less</a>)</span> - - - - </div> - </div> - - <div class="vlclearaltl"></div> - - - </div> - - <div class="vlfacets"> - <div class="vladded"> - </div> - <div><span class="grayText vlfromlbl">From:</span><span class="vlfrom"><a href="/user/werneroi">werneroi</a></span></div> - <div class="clearL"></div> - <span class="grayText">Views:</span> 3,155,063<br/> - - <div class="video-thumb-duration-rating"> - - - <div> - - <img class="ratingVS ratingVS-3.5" alt="3.41263230956" src="http://s.ytimg.com/yt/img/pixel-vfl73.gif" /> - - - - </div> - - - - <div class="runtime">01:10</div> - </div> - - <div class="clear"></div> - <div class="vlcategory"> - <span class="smgrayText">More in</span> <a href="/results?search_query=None&search_category=22">People & Blogs</a> - </div> - </div> - - <div class="vlclearaltl"></div> - - - - </div> <!-- end vEntry --> - - - - - - - <div class="vlentry" > - - <div class="vlcontainer"><div class="v120WideEntry"><div class="v120WrapperOuter"><div class="v120WrapperInner"><a href="/watch?v=irDEzQovftM"><img src="http://i.ytimg.com/vi/irDEzQovftM/default.jpg" class="vimg120" title="Biggest drawing in the world" qliconalt="irDEzQovftM" alt="video"></a></div></div> </div> - - <div class="vldescbox"> - <div class="vltitle"> - <div class="vlshortTitle"> - <a href="/watch?v=irDEzQovftM" title="Biggest drawing in the world" onclick="_hbLink('Biggestdrawingintheworld','VidVert');">Biggest drawing in the world</a> - </div> - <div class="vllongTitle"> - <a href="/watch?v=irDEzQovftM" title="Biggest drawing in the world" onclick="_hbLink('Biggestdrawingintheworld','VidVert');">Biggest drawing in the world</a> - </div> - </div> - - <div class="vldesc"> - - - <span id="BeginvidDescirDEzQovftM"> - making the biggest drawing in the world - </span> - - - - - </div> - </div> - - <div class="vlclearaltl"></div> - - - </div> - - <div class="vlfacets"> - <div class="vladded"> - </div> - <div><span class="grayText vlfromlbl">From:</span><span class="vlfrom"><a href="/user/erikbjgn">erikbjgn</a></span></div> - <div class="clearL"></div> - <span class="grayText">Views:</span> 971,773<br/> - - <div class="video-thumb-duration-rating"> - - - <div> - - <img class="ratingVS ratingVS-4.5" alt="4.54770783066" src="http://s.ytimg.com/yt/img/pixel-vfl73.gif" /> - - - - </div> - - - - <div class="runtime">04:04</div> - </div> - - <div class="clear"></div> - <div class="vlcategory"> - <span class="smgrayText">More in</span> <a href="/results?search_query=None&search_category=1">Film & Animation</a> - </div> - </div> - - <div class="vlclearaltl"></div> - - - - </div> <!-- end vEntry --> - - - - - - - <div class="vlentry" > - - <div class="vlcontainer"><div class="v120WideEntry"><div class="v120WrapperOuter"><div class="v120WrapperInner"><a href="/watch?v=iAKJKBCyPUY"><img src="http://i.ytimg.com/vi/iAKJKBCyPUY/default.jpg" class="vimg120" title="Checkmate" qliconalt="iAKJKBCyPUY" alt="video"></a></div></div> </div> - - <div class="vldescbox"> - <div class="vltitle"> - <div class="vlshortTitle"> - <a href="/watch?v=iAKJKBCyPUY" title="Checkmate" onclick="_hbLink('Checkmate','VidVert');">Checkmate</a> - </div> - <div class="vllongTitle"> - <a href="/watch?v=iAKJKBCyPUY" title="Checkmate" onclick="_hbLink('Checkmate','VidVert');">Checkmate</a> - </div> - </div> - - <div class="vldesc"> - - - <span id="BeginvidDesciAKJKBCyPUY"> - The Internets Celebrities Dallas Penn and Rafi Kam go in for an investigative report on Ch - </span> - - <span id="RemainvidDesciAKJKBCyPUY" style="display: none">The Internets Celebrities Dallas Penn and Rafi Kam go in for an investigative report on Check-Cashing. Themes explored include usury, economic instability, commercial banks and their profit line, and the cycle of poverty. <br/><br/>Oh yeah, it's a comedy.<br/><br/>The video is shot on location in Bushwick and Carroll Gardens in Brooklyn, New York. Also stars special guest Internets Celebrity Ben Popken of Consumerist.com.<br/><br/>Directed by Casimir Nozkowski<br/>Shot by Ian Savage, Josh Weisbrot<br/>Music by El Keter; instrumental from song "The Bottom Line" off Sankofa's album The Tortoise Hustle. Used with full permission.<br/><br/>http://www.internetscelebrities.com</span> - <span id="MorevidDesciAKJKBCyPUY" class="smallText">(<a href="#" class="eLink" onclick="showDiv('RemainvidDesciAKJKBCyPUY'); hideDiv('MorevidDesciAKJKBCyPUY'); hideDiv('BeginvidDesciAKJKBCyPUY'); showDiv('LessvidDesciAKJKBCyPUY'); return false;">more</a>)</span> - <span id="LessvidDesciAKJKBCyPUY" style="display: none" class="smallText">(<a href="#" class="eLink" onclick="hideDiv('RemainvidDesciAKJKBCyPUY'); hideDiv('LessvidDesciAKJKBCyPUY'); showDiv('BeginvidDesciAKJKBCyPUY'); showDiv('MorevidDesciAKJKBCyPUY'); return false;">less</a>)</span> - - - - </div> - </div> - - <div class="vlclearaltl"></div> - - - </div> - - <div class="vlfacets"> - <div class="vladded"> - </div> - <div><span class="grayText vlfromlbl">From:</span><span class="vlfrom"><a href="/user/InternetsCelebrities">InternetsCel...</a></span></div> - <div class="clearL"></div> - <span class="grayText">Views:</span> 412,830<br/> - - <div class="video-thumb-duration-rating"> - - - <div> - - <img class="ratingVS ratingVS-4.5" alt="4.52936962751" src="http://s.ytimg.com/yt/img/pixel-vfl73.gif" /> - - - - </div> - - - - <div class="runtime">09:45</div> - </div> - - <div class="clear"></div> - <div class="vlcategory"> - <span class="smgrayText">More in</span> <a href="/results?search_query=None&search_category=25">News & Politics</a> - </div> - </div> - - <div class="vlclearaltl"></div> - - - - </div> <!-- end vEntry --> - - - - - - - <div class="vlentry" > - - <div class="vlcontainer"><div class="v120WideEntry"><div class="v120WrapperOuter"><div class="v120WrapperInner"><a href="/watch?v=yLCl0xIg5-0"><img src="http://i.ytimg.com/vi/yLCl0xIg5-0/default.jpg" class="vimg120" title="Stories from the Front lines, Part 1" qliconalt="yLCl0xIg5-0" alt="video"></a></div></div> </div> - - <div class="vldescbox"> - <div class="vltitle"> - <div class="vlshortTitle"> - <a href="/watch?v=yLCl0xIg5-0" title="Stories from the Front lines, Part 1" onclick="_hbLink('StoriesfromtheFrontlinesPart1','VidVert');">Stories from the Front lines, Pa...</a> - </div> - <div class="vllongTitle"> - <a href="/watch?v=yLCl0xIg5-0" title="Stories from the Front lines, Part 1" onclick="_hbLink('StoriesfromtheFrontlinesPart1','VidVert');">Stories from the Front lines, Part 1</a> - </div> - </div> - - <div class="vldesc"> - - - <span id="BeginvidDescyLCl0xIg50"> - Stories from the men and women of the miltary, stationed in the Al Anbar Province. Right f - </span> - - <span id="RemainvidDescyLCl0xIg50" style="display: none">Stories from the men and women of the miltary, stationed in the Al Anbar Province. Right from the mouths of the troops themselves. Part 1 of 4</span> - <span id="MorevidDescyLCl0xIg50" class="smallText">(<a href="#" class="eLink" onclick="showDiv('RemainvidDescyLCl0xIg50'); hideDiv('MorevidDescyLCl0xIg50'); hideDiv('BeginvidDescyLCl0xIg50'); showDiv('LessvidDescyLCl0xIg50'); return false;">more</a>)</span> - <span id="LessvidDescyLCl0xIg50" style="display: none" class="smallText">(<a href="#" class="eLink" onclick="hideDiv('RemainvidDescyLCl0xIg50'); hideDiv('LessvidDescyLCl0xIg50'); showDiv('BeginvidDescyLCl0xIg50'); showDiv('MorevidDescyLCl0xIg50'); return false;">less</a>)</span> - - - - </div> - </div> - - <div class="vlclearaltl"></div> - - - </div> - - <div class="vlfacets"> - <div class="vladded"> - </div> - <div><span class="grayText vlfromlbl">From:</span><span class="vlfrom"><a href="/user/3rdID8487">3rdID8487</a></span></div> - <div class="clearL"></div> - <span class="grayText">Views:</span> 367,189<br/> - - <div class="video-thumb-duration-rating"> - - - <div> - - <img class="ratingVS ratingVS-4.0" alt="4.2188365651" src="http://s.ytimg.com/yt/img/pixel-vfl73.gif" /> - - - - </div> - - - - <div class="runtime">10:35</div> - </div> - - <div class="clear"></div> - <div class="vlcategory"> - <span class="smgrayText">More in</span> <a href="/results?search_query=None&search_category=25">News & Politics</a> - </div> - </div> - - <div class="vlclearaltl"></div> - - - - </div> <!-- end vEntry --> - - - - - - - <div class="vlentry" > - - <div class="vlcontainer"><div class="v120WideEntry"><div class="v120WrapperOuter"><div class="v120WrapperInner"><a href="/watch?v=rFItE14EeSU"><img src="http://i.ytimg.com/vi/rFItE14EeSU/default.jpg" class="vimg120" title="Amazing video of multiple tornadoes in Northwest Kansas" qliconalt="rFItE14EeSU" partner="true" alt="video"></a></div></div> </div> - - <div class="vldescbox"> - <div class="vltitle"> - <div class="vlshortTitle"> - <a href="/watch?v=rFItE14EeSU" title="Amazing video of multiple tornadoes in Northwest Kansas" onclick="_hbLink('AmazingvideoofmultipletornadoesinNorthwestKansas','VidVert');">Amazing video of multiple tornad...</a> - </div> - <div class="vllongTitle"> - <a href="/watch?v=rFItE14EeSU" title="Amazing video of multiple tornadoes in Northwest Kansas" onclick="_hbLink('AmazingvideoofmultipletornadoesinNorthwestKansas','VidVert');">Amazing video of multiple tornadoes in Northwest Kansas</a> - </div> - </div> - - <div class="vldesc"> - - - <span id="BeginvidDescrFItE14EeSU"> - Video from TornadoVideos.net Live Stream Unit 3 of several tornadoes from close range.. In - </span> - - <span id="RemainvidDescrFItE14EeSU" style="display: none">Video from TornadoVideos.net Live Stream Unit 3 of several tornadoes from close range.. Including one beautiful but strong rope and a large wedge tornado from within 1/2 mile. Check out TornadoVdeos.net for live streaming video, breaking weather news, and more extreme tornado footage.</span> - <span id="MorevidDescrFItE14EeSU" class="smallText">(<a href="#" class="eLink" onclick="showDiv('RemainvidDescrFItE14EeSU'); hideDiv('MorevidDescrFItE14EeSU'); hideDiv('BeginvidDescrFItE14EeSU'); showDiv('LessvidDescrFItE14EeSU'); return false;">more</a>)</span> - <span id="LessvidDescrFItE14EeSU" style="display: none" class="smallText">(<a href="#" class="eLink" onclick="hideDiv('RemainvidDescrFItE14EeSU'); hideDiv('LessvidDescrFItE14EeSU'); showDiv('BeginvidDescrFItE14EeSU'); showDiv('MorevidDescrFItE14EeSU'); return false;">less</a>)</span> - - - - </div> - </div> - - <div class="vlclearaltl"></div> - - - </div> - - <div class="vlfacets"> - <div class="vladded"> - </div> - <div><span class="grayText vlfromlbl">From:</span><span class="vlfrom"><a href="/user/TornadoVideosdotnet">TornadoVideo...</a></span></div> - <div class="clearL"></div> - <span class="grayText">Views:</span> 797,370<br/> - - <div class="video-thumb-duration-rating"> - - - <div> - - <img class="ratingVS ratingVS-4.5" alt="4.28912552436" src="http://s.ytimg.com/yt/img/pixel-vfl73.gif" /> - - - - </div> - - - - <div class="runtime">07:10</div> - </div> - - <div class="clear"></div> - <div class="vlcategory"> - <span class="smgrayText">More in</span> <a href="/results?search_query=None&search_category=25">News & Politics</a> - </div> - </div> - - <div class="vlclearaltl"></div> - - - - </div> <!-- end vEntry --> - - - </div> - </div> <!-- end Video List --> - <div id="homepage-featured-more-bottom"> - <div class="floatR"><a href="/browse?s=rf">See More Featured Videos</a></div> - <div class="clear"></div> - </div> -</div> - - -<div id="homepage-side-content" style="white-space: normal;"> - <div> - - - - - <!-- Begin ad tag --> - - <input type="hidden" id="pvaHl" value="en"/> - <input type="hidden" id="pvaTag" value="http://n4061ad.doubleclick.net/adj/com.ythome/_default;sz=399x299;kl=N;kga=-1;kgg=-1;tile=1;dcopt=ist;"/> - <input type="hidden" id="burl" value="http://www.youtube.com/pva/"/> - <input type="hidden" id="canv" value="False"/> - <div id="myAd_banner" style="visibility:hidden;height:35px;"></div> - <div id="myAd_pva"> - - - - - <script type="text/javascript"> - ord=Math.random()*10000000000000000 + 3; - if (false) { - ord = 1234567890; - } - document.write('<script language="JavaScript" src="http://n4061ad.doubleclick.net/adj/com.ythome/_default;sz=399x299;kl=N;kga=-1;kgg=-1;tile=1;dcopt=ist;ord=' + ord + '?" type="text/javascript"><\/script>'); - </script> - <noscript><a - href="http://n4061ad.doubleclick.net/jump/_default;sz=399x299;ord=123456789?" target="_blank"><img - src="http://n4061ad.doubleclick.net/ad/_default;sz=399x299;ord=123456789?" width="399" height="299" border="0" alt=""></a> - </noscript> - - </div> - - - <!-- End ad tag --> - - </div> - - <div class="homepage-content-block"> - <div class="contentBox"> - <div> - <div class="floatR"><span class="smallText"><b><a href="/signup">Sign Up</a> | <a href="http://help.youtube.com/support/youtube/bin/topic.py?topic=10546&hl=en_US">Help</a></b></div> - <div class="floatL"> - <span class="headerTitle homepage-block-heading-gray"> Login </span> - </div> - <div class="clear"></div> - </div> - - <form method="post" name="loginForm" id="loginForm" action="signup"> - <input type="hidden" name="action_login" value="1"> - <table width="270"> - <tr> - <td align="right"><label for="homeUsername"><span class="smallText"><b>Username:</b></span></label></td> - <td align="left"><input id="homeUsername" tabindex="101" class="smallText" type="text" size="16" name="username" value=""></td> - </tr> - <tr> - <td align="right"><label for="homePassword"><span class="smallText"><b>Password:</b></span></label></td> - <td align="left"><input id="homePassword" tabindex="102" class="smallText" type="password" size="16" name="password"> - </tr> - <tr> - <td></td> - <td align="left"> - <span><input type="submit" class="smallText" value="Login"></span> - </td> - </tr> - </table> - </form> - <div class="padT10 smallText"> - <p align="center" class="marT0 marB0"><a href="/forgot_username?next=/">Forgot Username</a> | <a href="/forgot?next=/">Forgot Password</a></p> - </div> - <div class="homepage-border-dotted"></div> - <div class="alignC"><span class="smallText"><b><a href=" -https://www.google.com/accounts/ServiceLogin?service=youtube&hl=en_US&continue=http%3A//www.youtube.com/signup%3Fhl%3Den_US&passive=true">Login with your Google account</a> <a href="#" onClick="window.open('/t/help_gaia','login_help','width=580,height=480,resizable=yes,scrollbars=yes,status=0').focus();" rel="nofollow"><img src="http://s.ytimg.com/yt/img/pixel-vfl73.gif" border="0" class="alignMid gaiaHelpBtn" alt=""></a></b></span></div> - </div> - </div> <!-- end homepage-content-block --> - - - <div class="homepage-content-block padT10"> - - - - - <!-- Begin ad tag --> - - - - <script type="text/javascript"> - ord=Math.random()*10000000000000000 + 6; - if (false) { - ord = 1234567890; - } - document.write('<script language="JavaScript" src="http://n4061ad.doubleclick.net/adj/com.ythome/promo1;sz=300x50;kl=N;kga=-1;kgg=-1;tile=2;ord=' + ord + '?" type="text/javascript"><\/script>'); - </script> - <noscript><a - href="http://n4061ad.doubleclick.net/jump/promo1;sz=300x50;ord=123456789?" target="_blank"><img - src="http://n4061ad.doubleclick.net/ad/promo1;sz=300x50;ord=123456789?" width="300" height="50" border="0" alt=""></a> - </noscript> - - - <!-- End ad tag --> - - </div> - - <div class="homepage-content-block padT10"> - - - - - <!-- Begin ad tag --> - - - - <script type="text/javascript"> - ord=Math.random()*10000000000000000 + 6; - if (false) { - ord = 1234567890; - } - document.write('<script language="JavaScript" src="http://n4061ad.doubleclick.net/adj/com.ythome/promo3;sz=300x50;kl=N;kga=-1;kgg=-1;tile=4;ord=' + ord + '?" type="text/javascript"><\/script>'); - </script> - <noscript><a - href="http://n4061ad.doubleclick.net/jump/promo3;sz=300x50;ord=123456789?" target="_blank"><img - src="http://n4061ad.doubleclick.net/ad/promo3;sz=300x50;ord=123456789?" width="300" height="50" border="0" alt=""></a> - </noscript> - - - <!-- End ad tag --> - - </div> - - <div class="homepage-side-block padT10"> - <div class="homepage-yellow-block"> - <div class="homepage-block-heading" style="color:#CC6600">What's New</div> - - <div class="homepage-whatsnew-entry"> - <div class="homepage-whatsnew-image"><a href="/t/annotations_about"><img src="http://s.ytimg.com/yt/img/whats_new/annotation-vfl42087.gif" border="0" width="30" height="37"/></a></div> - <div class="homepage-whatsnew-desc"> - <b><a href="/t/annotations_about">Video Annotations</a></b><br/>Add interactive commentary and links to your videos - </div> - </div><div class="clear"></div> - - <div class="homepage-whatsnew-entry"> - <div class="homepage-whatsnew-image"><a href="/address_book"><img src="http://s.ytimg.com/yt/img/whats_new/addybook-vfl39351.gif" border="0" width="30" height="37"/></a></div> - <div class="homepage-whatsnew-desc"> - <b><a href="/address_book">New Address Book</a></b><br/>Organizing your YouTube friends and contacts just got a lot simpler - </div> - </div><div class="clear"></div> - - <div class="homepage-whatsnew-entry"> - <div class="homepage-whatsnew-image"><a href="/inbox"><img src="http://s.ytimg.com/yt/img/whats_new/inbox-vfl39351.gif" border="0" width="30" height="37"/></a></div> - <div class="homepage-whatsnew-desc"> - <b><a href="/inbox">Updated Inbox</a></b><br/>Manage your messages and invites with ease - </div> - </div><div class="clear"></div> - - - <div class="homepage-whatsnew-entry"> - <div class="homepage-whatsnew-image"><a href="/mobile"><img src="http://s.ytimg.com/yt/img/whats_new/pic_home_mobile_30x37-vfl37458.gif" border="0" width="30" height="37"/></a></div> - <div class="homepage-whatsnew-desc"> - <b><a href="/mobile">YouTube Mobile</a></b><br/> Watch and upload YouTube videos on your mobile device. - </div> - </div><div class="clear"></div> - - <div class="bottomBorderDotted"></div> - <b><a href="/blog" style="color:#CC6600">Hear Ye, Hear Ye: Calling all Reporters</a></b><br> - Today we announce the launch of a new type of YouTube account: the Reporter. Reporter channels are just like the other YouTube channel types, but are specifically intended for citizens and profess... - <div class="alignR padT5"> - <a href="/blog" style="color:#CC6600">Read more in our Blog</a> - </div> - <div style="font-size: 1px; height: 1px;"><br/></div> - </div><img class="homepage-yellow-block-bot" src="http://s.ytimg.com/yt/img/pixel-vfl73.gif" /> -</div> - - - <div class="homepage-side-block"> - - - - - <!-- Begin ad tag --> - - - - <script type="text/javascript"> - ord=Math.random()*10000000000000000 + 6; - if (false) { - ord = 1234567890; - } - document.write('<script language="JavaScript" src="http://n4061ad.doubleclick.net/adj/com.ythome/promo2;sz=300x50;kl=N;kga=-1;kgg=-1;tile=3;ord=' + ord + '?" type="text/javascript"><\/script>'); - </script> - <noscript><a - href="http://n4061ad.doubleclick.net/jump/promo2;sz=300x50;ord=123456789?" target="_blank"><img - src="http://n4061ad.doubleclick.net/ad/promo2;sz=300x50;ord=123456789?" width="300" height="50" border="0" alt=""></a> - </noscript> - - - <!-- End ad tag --> - - </div> - - -</div> <!-- end homepage-side-content --> - -<div class="clear"></div> - - - - <div class="clear"></div> - <div id="footer"> - <div class="search"> - <div class="promo"> - <a href="/youchoose" onclick="_hbLink('FooterPromo','Footer');"><img id="debates_footer_img" src="http://s.ytimg.com/yt/img/pixel-vfl73.gif" alt="footer-promo" /></a> - <a href="/youchoose" onclick="_hbLink('FooterPromo','Footer');">Face The Candidates</a> - </div> - <form autocomplete="off" name="footer-search-form" method="get" action="/results" style="width: 73.5%;"> - <a href="http://www.google.com/webmasters/igoogle/youtube.html"><img id="igoogle_footer_img" src="http://s.ytimg.com/yt/img/pixel-vfl73.gif" alt=""/> <em id="igoogle_footer_text">Add to iGoogle</em></a> - <input type="text" name="search_query" maxlength="128" class="query" onkeyup="goog.i18n.bidi.setDirAttribute(event,this)" value="" id="footer-search-term"> - <select class="search-type" name="search_type"> - <option value="">Videos</option> - <option value="search_users" >Channels</option> - </select> - <input type="submit" name="search" value="Search" class="submit-button"> - </form> - </div> - <div class="links"> - <table cellpadding="0" cellspacing="0"> - <tr> - <th colspan="2">Your Account</th> - <th class="separator" colspan="2">Help & Info</th> - <th class="separator" colspan="2">YouTube</th> - </tr> - <tr> - <td><a href="/my_videos">Videos</a></td> - <td><a href="/inbox">Inbox</a></td> - <td class="separator"><a href="http://help.youtube.com/support/youtube/bin/static.py?page=start.cs&hl=en_US">Help Resources</a></td> - <td><a href="/t/safety">Safety Tips</a></td> - <td class="separator"><a href="/t/about">Company Info</a></td> - <td><a href="/press_room">Press</a></td> - </tr> - <tr> - <td><a href="/my_favorites">Favorites</a></td> - <td><a href="/subscription_center">Subscriptions</a></td> - <td class="separator"><a href="/t/video_toolbox">Video Toolbox</a></td> - <td><a href="/t/dmca_policy">Copyright Notices</a></td> - <td class="separator"><a href="/testtube">TestTube</a></td> - <td><a href="/t/contact_us">Contact</a></td> - </tr> - <tr> - <td><a href="/my_playlists">Playlists</a></td> - <td><a href="/my_account">more...</a></td> - <td class="separator"><a href="/dev">Developer APIs</a></td> - <td><a href="/t/community_guidelines">Community Guidelines</a></td> - <td class="separator"><a href="/t/terms">Terms of Use</a></td> - <td> - <a href="/blog">Blog</a> - </td> - </tr> - <tr> - <td colspan="2"> </td> - <td class="separator"><a href="/advertise">Advertising</a></td> - <td><a href="/youtubeonyoursite">YouTube On Your Site</a></td> - <td class="separator"><a href="/t/privacy">Privacy Policy</a></td> - <td> - <a href="http://www.google.com/jobs/youtube">Jobs</a><br/> - </td> - </tr> - - - - </table> - </div> - </div> - <div id="copyright"> - © 2008 YouTube, LLC - </div> - - -</div> <!-- end baseDiv --> - -</body> -<script type="text/javascript"> - window.setTimeout('window.google.ac.install(document.searchForm,document.searchForm.search_query,"yt",true,"close",true,"Suggestions")',100); -</script> - - - -</html>
\ No newline at end of file diff --git a/src/corelib/io/qprocess_win.cpp b/src/corelib/io/qprocess_win.cpp index 1761c0e..510f723 100644 --- a/src/corelib/io/qprocess_win.cpp +++ b/src/corelib/io/qprocess_win.cpp @@ -46,6 +46,7 @@ #include <qdatetime.h> #include <qdir.h> #include <qfileinfo.h> +#include <qregexp.h> #include <qtimer.h> #include <qthread.h> #include <qmutex.h> @@ -256,24 +257,19 @@ static QString qt_create_commandline(const QString &program, const QStringList & for (int i=0; i<arguments.size(); ++i) { QString tmp = arguments.at(i); - // in the case of \" already being in the string the \ must also be escaped - tmp.replace( QLatin1String("\\\""), QLatin1String("\\\\\"") ); - // escape a single " because the arguments will be parsed - tmp.replace( QLatin1Char('\"'), QLatin1String("\\\"") ); + // Quotes are escaped and their preceding backslashes are doubled. + tmp.replace(QRegExp(QLatin1String("(\\\\*)\"")), QLatin1String("\\1\\1\\\"")); if (tmp.isEmpty() || tmp.contains(QLatin1Char(' ')) || tmp.contains(QLatin1Char('\t'))) { // The argument must not end with a \ since this would be interpreted // as escaping the quote -- rather put the \ behind the quote: e.g. // rather use "foo"\ than "foo\" - QString endQuote(QLatin1Char('\"')); int i = tmp.length(); - while (i>0 && tmp.at(i-1) == QLatin1Char('\\')) { + while (i > 0 && tmp.at(i - 1) == QLatin1Char('\\')) --i; - endQuote += QLatin1Char('\\'); - } - args += QLatin1String(" \"") + tmp.left(i) + endQuote; - } else { - args += QLatin1Char(' ') + tmp; + tmp.insert(i, QLatin1Char('"')); + tmp.prepend(QLatin1Char('"')); } + args += QLatin1Char(' ') + tmp; } return args; } diff --git a/src/corelib/thread/qmutex_unix.cpp b/src/corelib/thread/qmutex_unix.cpp index 12bc795..e692e19 100644 --- a/src/corelib/thread/qmutex_unix.cpp +++ b/src/corelib/thread/qmutex_unix.cpp @@ -60,6 +60,7 @@ # include <linux/futex.h> # include <sys/syscall.h> # include <unistd.h> +# include <QtCore/qelapsedtimer.h> #endif QT_BEGIN_NAMESPACE @@ -138,16 +139,31 @@ static inline int _q_futex(volatile int *addr, int op, int val, const struct tim bool QMutexPrivate::wait(int timeout) { + struct timespec ts, *pts = 0; + QElapsedTimer timer; + if (timeout >= 0) { + ts.tv_nsec = ((timeout % 1000) * 1000) * 1000; + ts.tv_sec = (timeout / 1000); + pts = &ts; + timer.start(); + } while (contenders.fetchAndStoreAcquire(2) > 0) { - struct timespec ts, *pts = 0; - if (timeout >= 0) { - ts.tv_nsec = ((timeout % 1000) * 1000) * 1000; - ts.tv_sec = (timeout / 1000); - pts = &ts; - } int r = _q_futex(&contenders._q_value, FUTEX_WAIT, 2, pts, 0, 0); if (r != 0 && errno == ETIMEDOUT) return false; + + if (pts) { + // recalculate the timeout + qint64 xtimeout = timeout * 1000 * 1000; + xtimeout -= timer.nsecsElapsed(); + if (xtimeout < 0) { + // timer expired after we returned + return false; + } + + ts.tv_sec = timeout / Q_INT64_C(1000) / 1000 / 1000; + ts.tv_nsec = timeout % (Q_INT64_C(1000) * 1000 * 1000); + } } return true; } diff --git a/src/corelib/tools/qelapsedtimer_win.cpp b/src/corelib/tools/qelapsedtimer_win.cpp index cd076a6..d79dc5d 100644 --- a/src/corelib/tools/qelapsedtimer_win.cpp +++ b/src/corelib/tools/qelapsedtimer_win.cpp @@ -42,14 +42,14 @@ #include "qelapsedtimer.h" #include <windows.h> -// Result of QueryPerformanceFrequency, 0 indicates that the high resolution timer is unavailable -static quint64 counterFrequency = 0; - typedef ULONGLONG (WINAPI *PtrGetTickCount64)(void); static PtrGetTickCount64 ptrGetTickCount64 = 0; QT_BEGIN_NAMESPACE +// Result of QueryPerformanceFrequency, 0 indicates that the high resolution timer is unavailable +static quint64 counterFrequency = 0; + static void resolveLibs() { static bool done = false; diff --git a/src/declarative/graphicsitems/qdeclarativetextinput.cpp b/src/declarative/graphicsitems/qdeclarativetextinput.cpp index 7014571..3fd4fcd 100644 --- a/src/declarative/graphicsitems/qdeclarativetextinput.cpp +++ b/src/declarative/graphicsitems/qdeclarativetextinput.cpp @@ -560,13 +560,11 @@ QRect QDeclarativeTextInput::cursorRectangle() const \qmlproperty int TextInput::selectionStart The cursor position before the first character in the current selection. - Setting this and selectionEnd allows you to specify a selection in the - text edit. - Note that if selectionStart == selectionEnd then there is no current - selection. + This property is read-only. To change the selection, use select(start,end), + selectAll(), or selectWord(). - \sa selectionEnd, cursorPosition, selectedText, select() + \sa selectionEnd, cursorPosition, selectedText */ int QDeclarativeTextInput::selectionStart() const { @@ -578,13 +576,11 @@ int QDeclarativeTextInput::selectionStart() const \qmlproperty int TextInput::selectionEnd The cursor position after the last character in the current selection. - Setting this and selectionStart allows you to specify a selection in the - text edit. - Note that if selectionStart == selectionEnd then there is no current - selection. + This property is read-only. To change the selection, use select(start,end), + selectAll(), or selectWord(). - \sa selectionStart, cursorPosition, selectedText, select() + \sa selectionStart, cursorPosition, selectedText */ int QDeclarativeTextInput::selectionEnd() const { diff --git a/src/gui/accessible/qaccessible.cpp b/src/gui/accessible/qaccessible.cpp index 337bb99..10e5785 100644 --- a/src/gui/accessible/qaccessible.cpp +++ b/src/gui/accessible/qaccessible.cpp @@ -1048,6 +1048,11 @@ const QAccessibleInterface *other, int otherChild) const */ /*! + \fn QAccessibleTable2Interface *QAccessibleInterface::table2Interface() + \internal +*/ + +/*! \fn QAccessibleActionInterface *QAccessibleInterface::actionInterface() \internal */ diff --git a/src/gui/accessible/qaccessible.h b/src/gui/accessible/qaccessible.h index fc03e1c..24a6744 100644 --- a/src/gui/accessible/qaccessible.h +++ b/src/gui/accessible/qaccessible.h @@ -84,40 +84,40 @@ public: MenuCommand = 0x0018, // Values from IAccessible2 - ActionChanged = 0x0101, - ActiveDescendantChanged, - AttributeChanged, - DocumentContentChanged, - DocumentLoadComplete, - DocumentLoadStopped, - DocumentReload, - HyperlinkEndIndexChanged, - HyperlinkNumberOfAnchorsChanged, - HyperlinkSelectedLinkChanged, - HypertextLinkActivated, - HypertextLinkSelected, - HyperlinkStartIndexChanged, - HypertextChanged, - HypertextNLinksChanged, - ObjectAttributeChanged, - PageChanged, - SectionChanged, - TableCaptionChanged, - TableColumnDescriptionChanged, - TableColumnHeaderChanged, - TableModelChanged, - TableRowDescriptionChanged, - TableRowHeaderChanged, - TableSummaryChanged, - TextAttributeChanged, - TextCaretMoved, - // TextChanged, deprecated, use TextUpdated - TextColumnChanged = TextCaretMoved + 2, - TextInserted, - TextRemoved, - TextUpdated, - TextSelectionChanged, - VisibleDataChanged, + ActionChanged = 0x0101, + ActiveDescendantChanged = 0x0102, + AttributeChanged = 0x0103, + DocumentContentChanged = 0x0104, + DocumentLoadComplete = 0x0105, + DocumentLoadStopped = 0x0106, + DocumentReload = 0x0107, + HyperlinkEndIndexChanged = 0x0108, + HyperlinkNumberOfAnchorsChanged = 0x0109, + HyperlinkSelectedLinkChanged = 0x010A, + HypertextLinkActivated = 0x010B, + HypertextLinkSelected = 0x010C, + HyperlinkStartIndexChanged = 0x010D, + HypertextChanged = 0x010E, + HypertextNLinksChanged = 0x010F, + ObjectAttributeChanged = 0x0110, + PageChanged = 0x0111, + SectionChanged = 0x0112, + TableCaptionChanged = 0x0113, + TableColumnDescriptionChanged = 0x0114, + TableColumnHeaderChanged = 0x0115, + TableModelChanged = 0x0116, + TableRowDescriptionChanged = 0x0117, + TableRowHeaderChanged = 0x0118, + TableSummaryChanged = 0x0119, + TextAttributeChanged = 0x011A, + TextCaretMoved = 0x011B, + // TextChanged = 0x011C, is deprecated in IA2, use TextUpdated + TextColumnChanged = 0x011D, + TextInserted = 0x011E, + TextRemoved = 0x011F, + TextUpdated = 0x0120, + TextSelectionChanged = 0x0121, + VisibleDataChanged = 0x0122, ObjectCreated = 0x8000, ObjectDestroyed = 0x8001, @@ -151,6 +151,7 @@ public: ReadOnly = 0x00000040, HotTracked = 0x00000080, DefaultButton = 0x00000100, + // #### Qt5 Expandable Expanded = 0x00000200, Collapsed = 0x00000400, Busy = 0x00000800, @@ -178,6 +179,8 @@ public: HasPopup = 0x40000000, Modal = 0x80000000, + // #### Qt5 ManagesDescendants + // #### Qt5 remove HasInvokeExtension HasInvokeExtension = 0x10000000 // internal }; Q_DECLARE_FLAGS(State, StateFlag) @@ -348,7 +351,8 @@ namespace QAccessible2 ValueInterface, TableInterface, ActionInterface, - ImageInterface + ImageInterface, + Table2Interface }; } @@ -359,6 +363,7 @@ class QAccessibleValueInterface; class QAccessibleTableInterface; class QAccessibleActionInterface; class QAccessibleImageInterface; +class QAccessibleTable2Interface; class Q_GUI_EXPORT QAccessibleInterface : public QAccessible { @@ -422,6 +427,9 @@ public: inline QAccessibleImageInterface *imageInterface() { return reinterpret_cast<QAccessibleImageInterface *>(cast_helper(QAccessible2::ImageInterface)); } + inline QAccessibleTable2Interface *table2Interface() + { return reinterpret_cast<QAccessibleTable2Interface *>(cast_helper(QAccessible2::Table2Interface)); } + private: QAccessible2Interface *cast_helper(QAccessible2::InterfaceType); }; diff --git a/src/gui/accessible/qaccessible2.h b/src/gui/accessible/qaccessible2.h index 5cb0323..106b69e 100644 --- a/src/gui/accessible/qaccessible2.h +++ b/src/gui/accessible/qaccessible2.h @@ -52,6 +52,8 @@ QT_MODULE(Gui) #ifndef QT_NO_ACCESSIBILITY +class QModelIndex; + namespace QAccessible2 { enum CoordinateType @@ -68,6 +70,24 @@ namespace QAccessible2 LineBoundary, NoBoundary }; + + enum TableModelChangeType { + TableModelChangeInsert, + TableModelChangeDelete, + TableModelChangeUpdate + }; + + struct TableModelChange { + int firstColumn; + int firstRow; + int lastColumn; + int lastRow; + TableModelChangeType type; + + TableModelChange() + : firstColumn(0), firstRow(0), lastColumn(0), lastRow(0), type(TableModelChangeUpdate) + {} + }; } class Q_GUI_EXPORT QAccessible2Interface @@ -83,6 +103,7 @@ inline QAccessible2Interface *qAccessibleEditableTextCastHelper() { return 0; } inline QAccessible2Interface *qAccessibleTableCastHelper() { return 0; } inline QAccessible2Interface *qAccessibleActionCastHelper() { return 0; } inline QAccessible2Interface *qAccessibleImageCastHelper() { return 0; } +inline QAccessible2Interface *qAccessibleTable2CastHelper() { return 0; } #define Q_ACCESSIBLE_OBJECT \ public: \ @@ -101,6 +122,8 @@ inline QAccessible2Interface *qAccessibleImageCastHelper() { return 0; } return qAccessibleActionCastHelper(); \ case QAccessible2::ImageInterface: \ return qAccessibleImageCastHelper(); \ + case QAccessible2::Table2Interface: \ + return qAccessibleTable2CastHelper(); \ } \ return 0; \ } \ @@ -214,6 +237,95 @@ public: int *columnSpan, bool *isSelected) = 0; }; +class Q_GUI_EXPORT QAccessibleTable2CellInterface: public QAccessibleInterface +{ +public: + // Returns the number of columns occupied by this cell accessible. + virtual int columnExtent() const = 0; + + // Returns the column headers as an array of cell accessibles. + virtual QList<QAccessibleInterface*> columnHeaderCells() const = 0; + + // Translates this cell accessible into the corresponding column index. + virtual int columnIndex() const = 0; + // Returns the number of rows occupied by this cell accessible. + virtual int rowExtent() const = 0; + // Returns the row headers as an array of cell accessibles. + virtual QList<QAccessibleInterface*> rowHeaderCells() const = 0; + // Translates this cell accessible into the corresponding row index. + virtual int rowIndex() const = 0; + // Returns a boolean value indicating whether this cell is selected. + virtual bool isSelected() const = 0; + + // Gets the row and column indexes and extents of this cell accessible and whether or not it is selected. + virtual void rowColumnExtents(int *row, int *column, int *rowExtents, int *columnExtents, bool *selected) const = 0; + // Returns a reference to the accessbile of the containing table. + virtual QAccessibleTable2Interface* table() const = 0; + + // #### Qt5 this should not be here but part of the state + virtual bool isExpandable() const = 0; +}; + +class Q_GUI_EXPORT QAccessibleTable2Interface: public QAccessible2Interface +{ +public: + inline QAccessible2Interface *qAccessibleTable2CastHelper() { return this; } + + // Returns the cell at the specified row and column in the table. + virtual QAccessibleTable2CellInterface *cellAt (int row, int column) const = 0; + // Returns the caption for the table. + virtual QAccessibleInterface *caption() const = 0; + // Returns the description text of the specified column in the table. + virtual QString columnDescription(int column) const = 0; + // Returns the total number of columns in table. + virtual int columnCount() const = 0; + // Returns the total number of rows in table. + virtual int rowCount() const = 0; + // Returns the total number of selected cells. + virtual int selectedCellCount() const = 0; + // Returns the total number of selected columns. + virtual int selectedColumnCount() const = 0; + // Returns the total number of selected rows. + virtual int selectedRowCount() const = 0; + // Returns the description text of the specified row in the table. + virtual QString rowDescription(int row) const = 0; + // Returns a list of accessibles currently selected. + virtual QList<QAccessibleTable2CellInterface*> selectedCells() const = 0; + // Returns a list of column indexes currently selected (0 based). + virtual QList<int> selectedColumns() const = 0; + // Returns a list of row indexes currently selected (0 based). + virtual QList<int> selectedRows() const = 0; + // Returns the summary description of the table. + virtual QAccessibleInterface *summary() const = 0; + // Returns a boolean value indicating whether the specified column is completely selected. + virtual bool isColumnSelected(int column) const = 0; + // Returns a boolean value indicating whether the specified row is completely selected. + virtual bool isRowSelected(int row) const = 0; + // Selects a row and unselects all previously selected rows. + virtual bool selectRow(int row) = 0; + // Selects a column and unselects all previously selected columns. + virtual bool selectColumn(int column) = 0; + // Unselects one row, leaving other selected rows selected (if any). + virtual bool unselectRow(int row) = 0; + // Unselects one column, leaving other selected columns selected (if any). + virtual bool unselectColumn(int column) = 0; + // Returns the type and extents describing how a table changed. + virtual QAccessible2::TableModelChange modelChange() const = 0; + +protected: + // These functions are called when the model changes. + virtual void modelReset() = 0; + virtual void rowsInserted(const QModelIndex &parent, int first, int last) = 0; + virtual void rowsRemoved(const QModelIndex &parent, int first, int last) = 0; + virtual void columnsInserted(const QModelIndex &parent, int first, int last) = 0; + virtual void columnsRemoved(const QModelIndex &parent, int first, int last) = 0; + virtual void rowsMoved( const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row) = 0; + virtual void columnsMoved( const QModelIndex &parent, int start, int end, const QModelIndex &destination, int column) = 0; + +friend class QAbstractItemView; +friend class QAbstractItemViewPrivate; +}; + class Q_GUI_EXPORT QAccessibleActionInterface : public QAccessible2Interface { public: diff --git a/src/gui/accessible/qaccessible_unix.cpp b/src/gui/accessible/qaccessible_unix.cpp index a6b7ec3..19fbe78 100644 --- a/src/gui/accessible/qaccessible_unix.cpp +++ b/src/gui/accessible/qaccessible_unix.cpp @@ -103,6 +103,17 @@ void QAccessible::updateAccessibility(QObject *o, int who, Event reason) if (!iface) return; + // updates for List/Table/Tree should send child + if (who) { + QAccessibleInterface *child; + iface->navigate(QAccessible::Child, who, &child); + if (child) { + delete iface; + iface = child; + who = 0; + } + } + for (int i = 0; i < bridges()->count(); ++i) bridges()->at(i)->notifyAccessibilityUpdate(reason, iface, who); delete iface; diff --git a/src/gui/itemviews/qabstractitemview.cpp b/src/gui/itemviews/qabstractitemview.cpp index f53705b..ded4d63 100644 --- a/src/gui/itemviews/qabstractitemview.cpp +++ b/src/gui/itemviews/qabstractitemview.cpp @@ -60,6 +60,7 @@ #include <private/qabstractitemmodel_p.h> #ifndef QT_NO_ACCESSIBILITY #include <qaccessible.h> +#include <qaccessible2.h> #endif #include <private/qsoftkeymanager_p.h> @@ -645,6 +646,8 @@ void QAbstractItemView::setModel(QAbstractItemModel *model) this, SLOT(rowsAboutToBeRemoved(QModelIndex,int,int))); disconnect(d->model, SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SLOT(_q_rowsRemoved(QModelIndex,int,int))); + disconnect(d->model, SIGNAL(rowsInserted(QModelIndex,int,int)), + this, SLOT(_q_rowsInserted(QModelIndex,int,int))); disconnect(d->model, SIGNAL(columnsAboutToBeRemoved(QModelIndex,int,int)), this, SLOT(_q_columnsAboutToBeRemoved(QModelIndex,int,int))); disconnect(d->model, SIGNAL(columnsRemoved(QModelIndex,int,int)), @@ -675,6 +678,8 @@ void QAbstractItemView::setModel(QAbstractItemModel *model) this, SLOT(_q_headerDataChanged())); connect(d->model, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(rowsInserted(QModelIndex,int,int))); + connect(d->model, SIGNAL(rowsInserted(QModelIndex,int,int)), + this, SLOT(_q_rowsInserted(QModelIndex,int,int))); connect(d->model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)), this, SLOT(rowsAboutToBeRemoved(QModelIndex,int,int))); connect(d->model, SIGNAL(rowsRemoved(QModelIndex,int,int)), @@ -1058,6 +1063,14 @@ void QAbstractItemView::reset() setRootIndex(QModelIndex()); if (d->selectionModel) d->selectionModel->reset(); +#ifndef QT_NO_ACCESSIBILITY +#ifdef Q_WS_X11 + if (QAccessible::isActive()) { + QAccessible::queryAccessibleInterface(this)->table2Interface()->modelReset(); + QAccessible::updateAccessibility(this, 0, QAccessible::TableModelChanged); + } +#endif +#endif } /*! @@ -2805,7 +2818,7 @@ void QAbstractItemView::editorDestroyed(QObject *editor) */ void QAbstractItemView::setHorizontalStepsPerItem(int steps) { - Q_UNUSED(steps); + Q_UNUSED(steps) // do nothing } @@ -2834,7 +2847,7 @@ int QAbstractItemView::horizontalStepsPerItem() const */ void QAbstractItemView::setVerticalStepsPerItem(int steps) { - Q_UNUSED(steps); + Q_UNUSED(steps) // do nothing } @@ -3267,12 +3280,24 @@ void QAbstractItemView::rowsAboutToBeRemoved(const QModelIndex &parent, int star rows are those under the given \a parent from \a start to \a end inclusive. */ -void QAbstractItemViewPrivate::_q_rowsRemoved(const QModelIndex &, int, int) +void QAbstractItemViewPrivate::_q_rowsRemoved(const QModelIndex &index, int start, int end) { + Q_UNUSED(index) + Q_UNUSED(start) + Q_UNUSED(end) + Q_Q(QAbstractItemView); if (q->isVisible()) q->updateEditorGeometries(); q->setState(QAbstractItemView::NoState); +#ifndef QT_NO_ACCESSIBILITY +#ifdef Q_WS_X11 + if (QAccessible::isActive()) { + QAccessible::queryAccessibleInterface(q)->table2Interface()->rowsRemoved(index, start, end); + QAccessible::updateAccessibility(q, 0, QAccessible::TableModelChanged); + } +#endif +#endif } /*! @@ -3335,27 +3360,72 @@ void QAbstractItemViewPrivate::_q_columnsAboutToBeRemoved(const QModelIndex &par rows are those under the given \a parent from \a start to \a end inclusive. */ -void QAbstractItemViewPrivate::_q_columnsRemoved(const QModelIndex &, int, int) +void QAbstractItemViewPrivate::_q_columnsRemoved(const QModelIndex &index, int start, int end) { + Q_UNUSED(index) + Q_UNUSED(start) + Q_UNUSED(end) + Q_Q(QAbstractItemView); if (q->isVisible()) q->updateEditorGeometries(); q->setState(QAbstractItemView::NoState); +#ifndef QT_NO_ACCESSIBILITY +#ifdef Q_WS_X11 + if (QAccessible::isActive()) { + QAccessible::queryAccessibleInterface(q)->table2Interface()->columnsRemoved(index, start, end); + QAccessible::updateAccessibility(q, 0, QAccessible::TableModelChanged); + } +#endif +#endif } + /*! \internal This slot is called when rows have been inserted. */ -void QAbstractItemViewPrivate::_q_columnsInserted(const QModelIndex &, int, int) +void QAbstractItemViewPrivate::_q_rowsInserted(const QModelIndex &index, int start, int end) { + Q_UNUSED(index) + Q_UNUSED(start) + Q_UNUSED(end) + Q_Q(QAbstractItemView); - if (q->isVisible()) - q->updateEditorGeometries(); +#ifndef QT_NO_ACCESSIBILITY +#ifdef Q_WS_X11 + if (QAccessible::isActive()) { + QAccessible::queryAccessibleInterface(q)->table2Interface()->rowsInserted(index, start, end); + QAccessible::updateAccessibility(q, 0, QAccessible::TableModelChanged); + } +#endif +#endif } +/*! + \internal + This slot is called when columns have been inserted. +*/ +void QAbstractItemViewPrivate::_q_columnsInserted(const QModelIndex &index, int start, int end) +{ + Q_UNUSED(index) + Q_UNUSED(start) + Q_UNUSED(end) + + Q_Q(QAbstractItemView); + if (q->isVisible()) + q->updateEditorGeometries(); +#ifndef QT_NO_ACCESSIBILITY +#ifdef Q_WS_X11 + if (QAccessible::isActive()) { + QAccessible::queryAccessibleInterface(q)->table2Interface()->columnsInserted(index, start, end); + QAccessible::updateAccessibility(q, 0, QAccessible::TableModelChanged); + } +#endif +#endif +} /*! \internal @@ -3373,7 +3443,16 @@ void QAbstractItemViewPrivate::_q_modelDestroyed() */ void QAbstractItemViewPrivate::_q_layoutChanged() { + Q_Q(QAbstractItemView); doDelayedItemsLayout(); +#ifndef QT_NO_ACCESSIBILITY +#ifdef Q_WS_X11 + if (QAccessible::isActive()) { + QAccessible::queryAccessibleInterface(q)->table2Interface()->modelReset(); + QAccessible::updateAccessibility(q, 0, QAccessible::TableModelChanged); + } +#endif +#endif } /*! @@ -3698,7 +3777,7 @@ QItemSelectionModel::SelectionFlags QAbstractItemView::selectionCommand(const QM QItemSelectionModel::SelectionFlags QAbstractItemViewPrivate::multiSelectionCommand( const QModelIndex &index, const QEvent *event) const { - Q_UNUSED(index); + Q_UNUSED(index) if (event) { switch (event->type()) { diff --git a/src/gui/itemviews/qabstractitemview.h b/src/gui/itemviews/qabstractitemview.h index cb7b78d..1d0c36e 100644 --- a/src/gui/itemviews/qabstractitemview.h +++ b/src/gui/itemviews/qabstractitemview.h @@ -355,6 +355,7 @@ private: Q_PRIVATE_SLOT(d_func(), void _q_columnsAboutToBeRemoved(const QModelIndex&, int, int)) Q_PRIVATE_SLOT(d_func(), void _q_columnsRemoved(const QModelIndex&, int, int)) Q_PRIVATE_SLOT(d_func(), void _q_columnsInserted(const QModelIndex&, int, int)) + Q_PRIVATE_SLOT(d_func(), void _q_rowsInserted(const QModelIndex&, int, int)) Q_PRIVATE_SLOT(d_func(), void _q_rowsRemoved(const QModelIndex&, int, int)) Q_PRIVATE_SLOT(d_func(), void _q_modelDestroyed()) Q_PRIVATE_SLOT(d_func(), void _q_layoutChanged()) diff --git a/src/gui/itemviews/qabstractitemview_p.h b/src/gui/itemviews/qabstractitemview_p.h index 3ba7227..04babde 100644 --- a/src/gui/itemviews/qabstractitemview_p.h +++ b/src/gui/itemviews/qabstractitemview_p.h @@ -108,6 +108,7 @@ public: void init(); virtual void _q_rowsRemoved(const QModelIndex &parent, int start, int end); + virtual void _q_rowsInserted(const QModelIndex &parent, int start, int end); virtual void _q_columnsAboutToBeRemoved(const QModelIndex &parent, int start, int end); virtual void _q_columnsRemoved(const QModelIndex &parent, int start, int end); virtual void _q_columnsInserted(const QModelIndex &parent, int start, int end); diff --git a/src/gui/itemviews/qlistview.cpp b/src/gui/itemviews/qlistview.cpp index a234fde..a0955d2 100644 --- a/src/gui/itemviews/qlistview.cpp +++ b/src/gui/itemviews/qlistview.cpp @@ -3168,7 +3168,11 @@ void QListView::currentChanged(const QModelIndex ¤t, const QModelIndex &pr if (QAccessible::isActive()) { if (current.isValid()) { int entry = visualIndex(current) + 1; +#ifdef Q_WS_X11 + QAccessible::updateAccessibility(this, entry, QAccessible::Focus); +#else QAccessible::updateAccessibility(viewport(), entry, QAccessible::Focus); +#endif } } #endif @@ -3187,12 +3191,20 @@ void QListView::selectionChanged(const QItemSelection &selected, QModelIndex sel = selected.indexes().value(0); if (sel.isValid()) { int entry = visualIndex(sel) + 1; +#ifdef Q_WS_X11 + QAccessible::updateAccessibility(this, entry, QAccessible::Selection); +#else QAccessible::updateAccessibility(viewport(), entry, QAccessible::Selection); +#endif } QModelIndex desel = deselected.indexes().value(0); if (desel.isValid()) { int entry = visualIndex(desel) + 1; +#ifdef Q_WS_X11 + QAccessible::updateAccessibility(this, entry, QAccessible::SelectionRemove); +#else QAccessible::updateAccessibility(viewport(), entry, QAccessible::SelectionRemove); +#endif } } #endif diff --git a/src/gui/itemviews/qtableview.cpp b/src/gui/itemviews/qtableview.cpp index 617409f..6f532eb 100644 --- a/src/gui/itemviews/qtableview.cpp +++ b/src/gui/itemviews/qtableview.cpp @@ -3164,10 +3164,16 @@ void QTableView::currentChanged(const QModelIndex ¤t, const QModelIndex &p #ifndef QT_NO_ACCESSIBILITY if (QAccessible::isActive()) { if (current.isValid()) { +#ifdef Q_WS_X11 + Q_D(QTableView); + int entry = d->accessibleTable2Index(current); + QAccessible::updateAccessibility(this, entry, QAccessible::Focus); +#else int entry = visualIndex(current) + 1; if (horizontalHeader()) ++entry; QAccessible::updateAccessibility(viewport(), entry, QAccessible::Focus); +#endif } } #endif @@ -3180,22 +3186,33 @@ void QTableView::currentChanged(const QModelIndex ¤t, const QModelIndex &p void QTableView::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) { + Q_D(QTableView); #ifndef QT_NO_ACCESSIBILITY if (QAccessible::isActive()) { // ### does not work properly for selection ranges. QModelIndex sel = selected.indexes().value(0); if (sel.isValid()) { +#ifdef Q_WS_X11 + int entry = d->accessibleTable2Index(sel); + QAccessible::updateAccessibility(this, entry, QAccessible::Selection); +#else int entry = visualIndex(sel); if (horizontalHeader()) ++entry; QAccessible::updateAccessibility(viewport(), entry, QAccessible::Selection); +#endif } QModelIndex desel = deselected.indexes().value(0); if (desel.isValid()) { +#ifdef Q_WS_X11 + int entry = d->accessibleTable2Index(sel); + QAccessible::updateAccessibility(this, entry, QAccessible::SelectionRemove); +#else int entry = visualIndex(sel); if (horizontalHeader()) ++entry; QAccessible::updateAccessibility(viewport(), entry, QAccessible::SelectionRemove); +#endif } } #endif diff --git a/src/gui/itemviews/qtableview_p.h b/src/gui/itemviews/qtableview_p.h index f973acf..dce0ed0 100644 --- a/src/gui/itemviews/qtableview_p.h +++ b/src/gui/itemviews/qtableview_p.h @@ -167,6 +167,11 @@ public: return horizontalHeader->logicalIndex(visualCol); } + inline int accessibleTable2Index(const QModelIndex &index) const { + return (index.row() + (horizontalHeader ? 1 : 0)) * (index.model()->columnCount() + (verticalHeader ? 1 : 0)) + + index.column() + (verticalHeader ? 1 : 0) + 1; + } + int sectionSpanEndLogical(const QHeaderView *header, int logical, int span) const; int sectionSpanSize(const QHeaderView *header, int logical, int span) const; bool spanContainsSection(const QHeaderView *header, int logical, int spanLogical, int span) const; diff --git a/src/gui/itemviews/qtreeview.cpp b/src/gui/itemviews/qtreeview.cpp index 6a992db..9228ac8 100644 --- a/src/gui/itemviews/qtreeview.cpp +++ b/src/gui/itemviews/qtreeview.cpp @@ -54,6 +54,7 @@ #include <qdebug.h> #ifndef QT_NO_ACCESSIBILITY #include <qaccessible.h> +#include <qaccessible2.h> #endif #include <private/qtreeview_p.h> @@ -2883,20 +2884,36 @@ void QTreeViewPrivate::expand(int item, bool emitSignal) void QTreeViewPrivate::insertViewItems(int pos, int count, const QTreeViewItem &viewItem) { + Q_Q(QTreeView); viewItems.insert(pos, count, viewItem); QTreeViewItem *items = viewItems.data(); for (int i = pos + count; i < viewItems.count(); i++) if (items[i].parentItem >= pos) items[i].parentItem += count; +#ifndef QT_NO_ACCESSIBILITY +#ifdef Q_WS_X11 + if (QAccessible::isActive()) { + QAccessible::updateAccessibility(q, 0, QAccessible::TableModelChanged); + } +#endif +#endif } void QTreeViewPrivate::removeViewItems(int pos, int count) { + Q_Q(QTreeView); viewItems.remove(pos, count); QTreeViewItem *items = viewItems.data(); for (int i = pos; i < viewItems.count(); i++) if (items[i].parentItem >= pos) items[i].parentItem -= count; +#ifndef QT_NO_ACCESSIBILITY +#ifdef Q_WS_X11 + if (QAccessible::isActive()) { + QAccessible::updateAccessibility(q, 0, QAccessible::TableModelChanged); + } +#endif +#endif } #if 0 @@ -3687,14 +3704,6 @@ void QTreeViewPrivate::_q_sortIndicatorChanged(int column, Qt::SortOrder order) */ void QTreeView::currentChanged(const QModelIndex ¤t, const QModelIndex &previous) { -#ifndef QT_NO_ACCESSIBILITY - if (QAccessible::isActive()) { - int entry = visualIndex(current) + 1; - if (header()) - ++entry; - QAccessible::updateAccessibility(viewport(), entry, QAccessible::Focus); - } -#endif QAbstractItemView::currentChanged(current, previous); if (allColumnsShowFocus()) { @@ -3711,6 +3720,19 @@ void QTreeView::currentChanged(const QModelIndex ¤t, const QModelIndex &pr viewport()->update(currentRect); } } +#ifndef QT_NO_ACCESSIBILITY + if (QAccessible::isActive() && current.isValid()) { +#ifdef Q_WS_X11 + int entry = (visualIndex(current) + (header()?1:0))*current.model()->columnCount()+current.column() + 1; + QAccessible::updateAccessibility(this, entry, QAccessible::Focus); +#else + int entry = visualIndex(current) + 1; + if (header()) + ++entry; + QAccessible::updateAccessibility(viewport(), entry, QAccessible::Focus); +#endif + } +#endif } /*! @@ -3719,26 +3741,38 @@ void QTreeView::currentChanged(const QModelIndex ¤t, const QModelIndex &pr void QTreeView::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) { + QAbstractItemView::selectionChanged(selected, deselected); #ifndef QT_NO_ACCESSIBILITY if (QAccessible::isActive()) { // ### does not work properly for selection ranges. QModelIndex sel = selected.indexes().value(0); if (sel.isValid()) { +#ifdef Q_WS_X11 + int entry = (visualIndex(sel) + (header()?1:0))*sel.model()->columnCount()+sel.column() + 1; + Q_ASSERT(entry > 0); + QAccessible::updateAccessibility(this, entry, QAccessible::Selection); +#else int entry = visualIndex(sel) + 1; if (header()) ++entry; QAccessible::updateAccessibility(viewport(), entry, QAccessible::Selection); +#endif } QModelIndex desel = deselected.indexes().value(0); if (desel.isValid()) { +#ifdef Q_WS_X11 + int entry = (visualIndex(desel) + (header()?1:0))*desel.model()->columnCount()+desel.column() + 1; + Q_ASSERT(entry > 0); + QAccessible::updateAccessibility(this, entry, QAccessible::SelectionRemove); +#else int entry = visualIndex(desel) + 1; if (header()) ++entry; QAccessible::updateAccessibility(viewport(), entry, QAccessible::SelectionRemove); +#endif } } #endif - QAbstractItemView::selectionChanged(selected, deselected); } int QTreeView::visualIndex(const QModelIndex &index) const diff --git a/src/gui/itemviews/qtreeview.h b/src/gui/itemviews/qtreeview.h index 26c7315..b77da4e 100644 --- a/src/gui/itemviews/qtreeview.h +++ b/src/gui/itemviews/qtreeview.h @@ -219,6 +219,9 @@ protected: private: friend class QAccessibleItemView; + friend class QAccessibleTable2; + friend class QAccessibleTree; + friend class QAccessibleTable2Cell; int visualIndex(const QModelIndex &index) const; Q_DECLARE_PRIVATE(QTreeView) diff --git a/src/gui/itemviews/qtreeview_p.h b/src/gui/itemviews/qtreeview_p.h index b6d8458..a9dc452 100644 --- a/src/gui/itemviews/qtreeview_p.h +++ b/src/gui/itemviews/qtreeview_p.h @@ -78,7 +78,7 @@ struct QTreeViewItem Q_DECLARE_TYPEINFO(QTreeViewItem, Q_MOVABLE_TYPE); -class QTreeViewPrivate : public QAbstractItemViewPrivate +class Q_GUI_EXPORT QTreeViewPrivate : public QAbstractItemViewPrivate { Q_DECLARE_PUBLIC(QTreeView) public: @@ -223,6 +223,10 @@ public: inline void invalidateHeightCache(int item) const { viewItems[item].height = 0; } + inline int accessibleTable2Index(const QModelIndex &index) const { + return (viewIndex(index) + (header ? 1 : 0)) * model->columnCount()+index.column() + 1; + } + // used for spanning rows QVector<QPersistentModelIndex> spanningIndexes; diff --git a/src/gui/kernel/qwidget_x11.cpp b/src/gui/kernel/qwidget_x11.cpp index eaa9405..f99cc2c 100644 --- a/src/gui/kernel/qwidget_x11.cpp +++ b/src/gui/kernel/qwidget_x11.cpp @@ -2879,6 +2879,12 @@ void QWidgetPrivate::deleteTLSysExtra() { // don't destroy input context here. it will be destroyed in // QWidget::destroy() destroyInputContext(); +#ifndef QT_NO_XSYNC + if (extra && extra->topextra && extra->topextra->syncUpdateCounter) { + XSyncDestroyCounter(X11->display, extra->topextra->syncUpdateCounter); + extra->topextra->syncUpdateCounter = 0; + } +#endif } void QWidgetPrivate::registerDropSite(bool on) diff --git a/src/gui/painting/qbezier_p.h b/src/gui/painting/qbezier_p.h index 399dd89..f1f7eb1 100644 --- a/src/gui/painting/qbezier_p.h +++ b/src/gui/painting/qbezier_p.h @@ -162,27 +162,27 @@ inline void QBezier::coefficients(qreal t, qreal &a, qreal &b, qreal &c, qreal & inline QPointF QBezier::pointAt(qreal t) const { -#if 1 - qreal a, b, c, d; - coefficients(t, a, b, c, d); - return QPointF(a*x1 + b*x2 + c*x3 + d*x4, a*y1 + b*y2 + c*y3 + d*y4); -#else // numerically more stable: + qreal x, y; + qreal m_t = 1. - t; - qreal a = x1*m_t + x2*t; - qreal b = x2*m_t + x3*t; - qreal c = x3*m_t + x4*t; - a = a*m_t + b*t; - b = b*m_t + c*t; - qreal x = a*m_t + b*t; - qreal a = y1*m_t + y2*t; - qreal b = y2*m_t + y3*t; - qreal c = y3*m_t + y4*t; - a = a*m_t + b*t; - b = b*m_t + c*t; - qreal y = a*m_t + b*t; + { + qreal a = x1*m_t + x2*t; + qreal b = x2*m_t + x3*t; + qreal c = x3*m_t + x4*t; + a = a*m_t + b*t; + b = b*m_t + c*t; + x = a*m_t + b*t; + } + { + qreal a = y1*m_t + y2*t; + qreal b = y2*m_t + y3*t; + qreal c = y3*m_t + y4*t; + a = a*m_t + b*t; + b = b*m_t + c*t; + y = a*m_t + b*t; + } return QPointF(x, y); -#endif } inline QPointF QBezier::normalVector(qreal t) const diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp index 9bd9733..1d10d75 100644 --- a/src/gui/painting/qpainter.cpp +++ b/src/gui/painting/qpainter.cpp @@ -6469,10 +6469,16 @@ static void drawTextItemDecoration(QPainter *painter, const QPointF &pos, const QLineF line(pos.x(), pos.y(), pos.x() + qFloor(width), pos.y()); - const qreal underlineOffset = fe->underlinePosition().toReal(); + qreal underlineOffset = fe->underlinePosition().toReal(); + qreal y = pos.y(); + // compensate for different rounding rule in Core Graphics paint engine, + // ideally code like this should be moved to respective engines. + if (painter->paintEngine()->type() == QPaintEngine::CoreGraphics) { + y = qCeil(y); + } // deliberately ceil the offset to avoid the underline coming too close to // the text above it. - const qreal underlinePos = pos.y() + qCeil(underlineOffset); + const qreal underlinePos = y + qCeil(underlineOffset); if (underlineStyle == QTextCharFormat::SpellCheckUnderline) { underlineStyle = QTextCharFormat::UnderlineStyle(QApplication::style()->styleHint(QStyle::SH_SpellCheckUnderlineStyle)); diff --git a/src/gui/painting/qtextureglyphcache.cpp b/src/gui/painting/qtextureglyphcache.cpp index fdba9c9..3973abd 100644 --- a/src/gui/painting/qtextureglyphcache.cpp +++ b/src/gui/painting/qtextureglyphcache.cpp @@ -198,7 +198,7 @@ bool QTextureGlyphCache::populate(QFontEngine *fontEngine, int numGlyphs, const Coord c = { 0, 0, // will be filled in later glyph_width, glyph_height, // texture coords - metrics.x.round().truncate(), + metrics.x.truncate(), -metrics.y.truncate() }; // baseline for horizontal scripts listItemCoordinates.insert(key, c); @@ -367,9 +367,7 @@ void QImageTextureGlyphCache::createTextureData(int width, int height) int QImageTextureGlyphCache::glyphMargin() const { -#if (defined(Q_WS_MAC) && defined(QT_MAC_USE_COCOA)) - return 1; -#elif defined(Q_WS_X11) +#if (defined(Q_WS_MAC) && defined(QT_MAC_USE_COCOA)) || defined(Q_WS_X11) return 0; #else return m_type == QFontEngineGlyphCache::Raster_RGBMask ? 2 : 0; diff --git a/src/gui/styles/qmacstyle_mac.mm b/src/gui/styles/qmacstyle_mac.mm index 321db25..8436856 100644 --- a/src/gui/styles/qmacstyle_mac.mm +++ b/src/gui/styles/qmacstyle_mac.mm @@ -1195,15 +1195,15 @@ QRect QMacStylePrivate::comboboxEditBounds(const QRect &outerBounds, const HIThe QRect ret = outerBounds; switch (bdi.kind){ case kThemeComboBox: - ret.adjust(5, 8, -21, -4); + ret.adjust(5, 8, -22, -4); break; case kThemeComboBoxSmall: - ret.adjust(4, 5, -18, 0); - ret.setHeight(16); + ret.adjust(4, 6, -20, 0); + ret.setHeight(14); break; case kThemeComboBoxMini: - ret.adjust(4, 5, -16, 0); - ret.setHeight(13); + ret.adjust(4, 5, -18, -1); + ret.setHeight(12); break; case kThemePopupButton: ret.adjust(10, 3, -23, -3); diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp index 3762f39..26d9f2c 100644 --- a/src/gui/text/qfontdatabase.cpp +++ b/src/gui/text/qfontdatabase.cpp @@ -1130,13 +1130,14 @@ QT_BEGIN_INCLUDE_NAMESPACE #elif defined(Q_OS_SYMBIAN) # include "qfontdatabase_s60.cpp" #endif +QT_END_INCLUDE_NAMESPACE + #if !defined(Q_WS_X11) QString QFontDatabase::resolveFontFamilyAlias(const QString &family) { return family; } #endif -QT_END_INCLUDE_NAMESPACE static QtFontStyle *bestStyle(QtFontFoundry *foundry, const QtFontStyle::Key &styleKey, const QString &styleName = QString()) diff --git a/src/gui/text/qfontengine_coretext.mm b/src/gui/text/qfontengine_coretext.mm index 07711a3..64d4a24 100644 --- a/src/gui/text/qfontengine_coretext.mm +++ b/src/gui/text/qfontengine_coretext.mm @@ -718,8 +718,9 @@ void QCoreTextFontEngine::addGlyphsToPath(glyph_t *glyphs, QFixedPoint *position QImage QCoreTextFontEngine::imageForGlyph(glyph_t glyph, QFixed subPixelPosition, int margin, bool aa) { + Q_UNUSED(margin); const glyph_metrics_t br = boundingBox(glyph); - QImage im(qRound(br.width) + margin * 2, qRound(br.height) + margin * 2, QImage::Format_RGB32); + QImage im(qRound(br.width) + 2, qRound(br.height) + 2, QImage::Format_RGB32); im.fill(0); CGColorSpaceRef colorspace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); @@ -750,8 +751,8 @@ QImage QCoreTextFontEngine::imageForGlyph(glyph_t glyph, QFixed subPixelPosition CGContextSetFont(ctx, cgFont); - qreal pos_x = -br.x.toReal() + subPixelPosition.toReal() + margin; - qreal pos_y = im.height() + br.y.toReal() - margin; + qreal pos_x = -br.x.truncate() + subPixelPosition.toReal(); + qreal pos_y = im.height() + br.y.toReal(); CGContextSetTextPosition(ctx, pos_x, pos_y); CGSize advance; diff --git a/src/gui/text/qtextdocument.cpp b/src/gui/text/qtextdocument.cpp index 0abafb8..143dc1a 100644 --- a/src/gui/text/qtextdocument.cpp +++ b/src/gui/text/qtextdocument.cpp @@ -2710,7 +2710,7 @@ void QTextHtmlExporter::emitBlock(const QTextBlock &block) html += QLatin1Char('>'); if (block.begin().atEnd()) - html += "<br />"; + html += QLatin1String("<br />"); QTextBlock::Iterator it = block.begin(); if (fragmentMarkers && !it.atEnd() && block == doc->begin()) diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp index 8ddf3eb..31d7e8a 100644 --- a/src/gui/text/qtextengine.cpp +++ b/src/gui/text/qtextengine.cpp @@ -2890,6 +2890,7 @@ int QTextEngine::positionInLigature(const QScriptItem *si, int end, } const HB_CharAttributes *attrs = attributes(); + logClusters = this->logClusters(si); clusterLength = getClusterLength(logClusters, attrs, 0, end, glyph_pos, &clusterStart); if (clusterLength) { @@ -3051,6 +3052,22 @@ QTextItemInt::QTextItemInt(const QScriptItem &si, QFont *font, const QTextCharFo : justified(false), underlineStyle(QTextCharFormat::NoUnderline), charFormat(format), num_chars(0), chars(0), logClusters(0), f(0), fontEngine(0) { + f = font; + fontEngine = f->d->engineForScript(si.analysis.script); + Q_ASSERT(fontEngine); + + initWithScriptItem(si); +} + +QTextItemInt::QTextItemInt(const QGlyphLayout &g, QFont *font, const QChar *chars_, int numChars, QFontEngine *fe, const QTextCharFormat &format) + : flags(0), justified(false), underlineStyle(QTextCharFormat::NoUnderline), charFormat(format), + num_chars(numChars), chars(chars_), logClusters(0), f(font), glyphs(g), fontEngine(fe) +{ +} + +// Fix up flags and underlineStyle with given info +void QTextItemInt::initWithScriptItem(const QScriptItem &si) +{ // explicitly initialize flags so that initFontAttributes can be called // multiple times on the same TextItem flags = 0; @@ -3058,13 +3075,10 @@ QTextItemInt::QTextItemInt(const QScriptItem &si, QFont *font, const QTextCharFo flags |= QTextItem::RightToLeft; ascent = si.ascent; descent = si.descent; - f = font; - fontEngine = f->d->engineForScript(si.analysis.script); - Q_ASSERT(fontEngine); - if (format.hasProperty(QTextFormat::TextUnderlineStyle)) { - underlineStyle = format.underlineStyle(); - } else if (format.boolProperty(QTextFormat::FontUnderline) + if (charFormat.hasProperty(QTextFormat::TextUnderlineStyle)) { + underlineStyle = charFormat.underlineStyle(); + } else if (charFormat.boolProperty(QTextFormat::FontUnderline) || f->d->underline) { underlineStyle = QTextCharFormat::SingleUnderline; } @@ -3073,18 +3087,12 @@ QTextItemInt::QTextItemInt(const QScriptItem &si, QFont *font, const QTextCharFo if (underlineStyle == QTextCharFormat::SingleUnderline) flags |= QTextItem::Underline; - if (f->d->overline || format.fontOverline()) + if (f->d->overline || charFormat.fontOverline()) flags |= QTextItem::Overline; - if (f->d->strikeOut || format.fontStrikeOut()) + if (f->d->strikeOut || charFormat.fontStrikeOut()) flags |= QTextItem::StrikeOut; } -QTextItemInt::QTextItemInt(const QGlyphLayout &g, QFont *font, const QChar *chars_, int numChars, QFontEngine *fe) - : flags(0), justified(false), underlineStyle(QTextCharFormat::NoUnderline), - num_chars(numChars), chars(chars_), logClusters(0), f(font), glyphs(g), fontEngine(fe) -{ -} - QTextItemInt QTextItemInt::midItem(QFontEngine *fontEngine, int firstGlyphIndex, int numGlyphs) const { QTextItemInt ti = *this; diff --git a/src/gui/text/qtextengine_p.h b/src/gui/text/qtextengine_p.h index 055974a..b1bd0c3 100644 --- a/src/gui/text/qtextengine_p.h +++ b/src/gui/text/qtextengine_p.h @@ -312,11 +312,13 @@ public: logClusters(0), f(0), fontEngine(0) {} QTextItemInt(const QScriptItem &si, QFont *font, const QTextCharFormat &format = QTextCharFormat()); - QTextItemInt(const QGlyphLayout &g, QFont *font, const QChar *chars, int numChars, QFontEngine *fe); + QTextItemInt(const QGlyphLayout &g, QFont *font, const QChar *chars, int numChars, QFontEngine *fe, + const QTextCharFormat &format = QTextCharFormat()); /// copy the structure items, adjusting the glyphs arrays to the right subarrays. /// the width of the returned QTextItemInt is not adjusted, for speed reasons QTextItemInt midItem(QFontEngine *fontEngine, int firstGlyphIndex, int numGlyphs) const; + void initWithScriptItem(const QScriptItem &si); QFixed descent; QFixed ascent; diff --git a/src/gui/text/qtextlayout.cpp b/src/gui/text/qtextlayout.cpp index 7990667..3f0b9e8 100644 --- a/src/gui/text/qtextlayout.cpp +++ b/src/gui/text/qtextlayout.cpp @@ -2389,13 +2389,13 @@ void QTextLine::draw(QPainter *p, const QPointF &pos, const QTextLayout::FormatR unsigned short *logClusters = eng->logClusters(&si); QGlyphLayout glyphs = eng->shapedGlyphs(&si); - QTextItemInt gf(si, &f, format); - gf.glyphs = glyphs.mid(iterator.glyphsStart, iterator.glyphsEnd - iterator.glyphsStart); - gf.chars = eng->layoutData->string.unicode() + iterator.itemStart; + QTextItemInt gf(glyphs.mid(iterator.glyphsStart, iterator.glyphsEnd - iterator.glyphsStart), + &f, eng->layoutData->string.unicode() + iterator.itemStart, + iterator.itemEnd - iterator.itemStart, eng->fontEngine(si), format); gf.logClusters = logClusters + iterator.itemStart - si.position; - gf.num_chars = iterator.itemEnd - iterator.itemStart; gf.width = iterator.itemWidth; gf.justified = line.justified; + gf.initWithScriptItem(si); Q_ASSERT(gf.fontEngine); diff --git a/src/gui/widgets/qlabel.cpp b/src/gui/widgets/qlabel.cpp index 26dd0e1..dcf35aa 100644 --- a/src/gui/widgets/qlabel.cpp +++ b/src/gui/widgets/qlabel.cpp @@ -55,6 +55,10 @@ #include "private/qstylesheetstyle_p.h" #include <qmath.h> +#ifndef QT_NO_ACCESSIBILITY +#include <qaccessible.h> +#endif + QT_BEGIN_NAMESPACE /*! @@ -370,6 +374,11 @@ void QLabel::setText(const QString &text) #endif d->updateLabel(); + +#ifndef QT_NO_ACCESSIBILITY + if (accessibleName().isEmpty()) + QAccessible::updateAccessibility(this, 0, QAccessible::NameChanged); +#endif } QString QLabel::text() const diff --git a/src/plugins/accessible/widgets/itemviews.cpp b/src/plugins/accessible/widgets/itemviews.cpp new file mode 100644 index 0000000..4618f87 --- /dev/null +++ b/src/plugins/accessible/widgets/itemviews.cpp @@ -0,0 +1,1029 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "itemviews.h" + +#include <qheaderview.h> +#include <qtableview.h> +#include <qlistview.h> +#include <qtreeview.h> +#include <private/qtreewidget_p.h> +#include <qaccessible2.h> +#include <QDebug> + +#ifndef QT_NO_ACCESSIBILITY + +QT_BEGIN_NAMESPACE + +QString Q_GUI_EXPORT qt_accStripAmp(const QString &text); + +#ifndef QT_NO_ITEMVIEWS +/* +Implementation of the IAccessible2 table2 interface. Much simpler than +the other table interfaces since there is only the main table and cells: + +TABLE/LIST/TREE + |- HEADER CELL + |- CELL + |- CELL + ... +*/ + +int QAccessibleTable2::logicalIndex(const QModelIndex &index) const +{ + if (!index.isValid()) + return -1; + int vHeader = verticalHeader() ? 1 : 0; + int hHeader = horizontalHeader() ? 1 : 0; + // row * number columns + column + 1 for one based counting + return (index.row() + hHeader)*(index.model()->columnCount() + vHeader) + (index.column() + vHeader) + 1; +} + +QAccessibleInterface *QAccessibleTable2::childFromLogical(int logicalIndex) const +{ + logicalIndex--; // one based counting ftw + int vHeader = verticalHeader() ? 1 : 0; + int hHeader = horizontalHeader() ? 1 : 0; + + int columns = view->model()->columnCount() + vHeader; + + int row = logicalIndex / columns; + int column = logicalIndex % columns; + + if (vHeader) { + if (column == 0) { + if (row == 0) { + return new QAccessibleTable2CornerButton(view); + } + return new QAccessibleTable2HeaderCell(view, row-1, Qt::Vertical); + } + --column; + } + if (hHeader) { + if (row == 0) { + return new QAccessibleTable2HeaderCell(view, column, Qt::Horizontal); + } + --row; + } + return new QAccessibleTable2Cell(view, view->model()->index(row, column), cellRole()); +} + +QAccessibleTable2::QAccessibleTable2(QWidget *w) + : QAccessibleObjectEx(w) +{ + view = qobject_cast<QAbstractItemView *>(w); + Q_ASSERT(view); + + if (qobject_cast<const QTableView*>(view)) { + m_role = QAccessible::Table; + } else if (qobject_cast<const QTreeView*>(view)) { + m_role = QAccessible::Tree; + } else if (qobject_cast<const QListView*>(view)) { + m_role = QAccessible::List; + } else { + // is this our best guess? + m_role = QAccessible::Table; + } +} + +QAccessibleTable2::~QAccessibleTable2() +{ +} + +QHeaderView *QAccessibleTable2::horizontalHeader() const +{ + QHeaderView *header = 0; + if (false) { +#ifndef QT_NO_TABLEVIEW + } else if (const QTableView *tv = qobject_cast<const QTableView*>(view)) { + header = tv->horizontalHeader(); +#endif +#ifndef QT_NO_TREEVIEW + } else if (const QTreeView *tv = qobject_cast<const QTreeView*>(view)) { + header = tv->header(); +#endif + } + return header; +} + +QHeaderView *QAccessibleTable2::verticalHeader() const +{ + QHeaderView *header = 0; + if (false) { +#ifndef QT_NO_TABLEVIEW + } else if (const QTableView *tv = qobject_cast<const QTableView*>(view)) { + header = tv->verticalHeader(); +#endif + } + return header; +} + +void QAccessibleTable2::modelReset() +{} + +void QAccessibleTable2::rowsInserted(const QModelIndex &, int first, int last) +{ + lastChange.firstRow = first; + lastChange.lastRow = last; + lastChange.firstColumn = 0; + lastChange.lastColumn = 0; + lastChange.type = QAccessible2::TableModelChangeInsert; +} + +void QAccessibleTable2::rowsRemoved(const QModelIndex &, int first, int last) +{ + lastChange.firstRow = first; + lastChange.lastRow = last; + lastChange.firstColumn = 0; + lastChange.lastColumn = 0; + lastChange.type = QAccessible2::TableModelChangeDelete; +} + +void QAccessibleTable2::columnsInserted(const QModelIndex &, int first, int last) +{ + lastChange.firstRow = 0; + lastChange.lastRow = 0; + lastChange.firstColumn = first; + lastChange.lastColumn = last; + lastChange.type = QAccessible2::TableModelChangeInsert; +} + +void QAccessibleTable2::columnsRemoved(const QModelIndex &, int first, int last) +{ + lastChange.firstRow = 0; + lastChange.lastRow = 0; + lastChange.firstColumn = first; + lastChange.lastColumn = last; + lastChange.type = QAccessible2::TableModelChangeDelete; +} + +void QAccessibleTable2::rowsMoved( const QModelIndex &, int, int, const QModelIndex &, int) +{ + lastChange.firstRow = 0; + lastChange.lastRow = 0; + lastChange.firstColumn = 0; + lastChange.lastColumn = 0; + lastChange.type = QAccessible2::TableModelChangeUpdate; +} + +void QAccessibleTable2::columnsMoved( const QModelIndex &, int, int, const QModelIndex &, int) +{ + lastChange.firstRow = 0; + lastChange.lastRow = 0; + lastChange.firstColumn = 0; + lastChange.lastColumn = 0; + lastChange.type = QAccessible2::TableModelChangeUpdate; +} + +QAccessibleTable2Cell *QAccessibleTable2::cell(const QModelIndex &index) const +{ + if (index.isValid()) + return new QAccessibleTable2Cell(view, index, cellRole()); + return 0; +} + +QAccessibleTable2CellInterface *QAccessibleTable2::cellAt(int row, int column) const +{ + Q_ASSERT(role(0) != QAccessible::Tree); + QModelIndex index = view->model()->index(row, column); + //Q_ASSERT(index.isValid()); + if (!index.isValid()) { + qWarning() << "QAccessibleTable2::cellAt: invalid index: " << index << " for " << view; + return 0; + } + return cell(index); +} + +QAccessibleInterface *QAccessibleTable2::caption() const +{ + return 0; +} + +QString QAccessibleTable2::columnDescription(int column) const +{ + return view->model()->headerData(column, Qt::Horizontal).toString(); +} + +int QAccessibleTable2::columnCount() const +{ + return view->model()->columnCount(); +} + +int QAccessibleTable2::rowCount() const +{ + return view->model()->rowCount(); +} + +int QAccessibleTable2::selectedCellCount() const +{ + return view->selectionModel()->selectedIndexes().count(); +} + +int QAccessibleTable2::selectedColumnCount() const +{ + return view->selectionModel()->selectedColumns().count(); +} + +int QAccessibleTable2::selectedRowCount() const +{ + return view->selectionModel()->selectedRows().count(); +} + +QString QAccessibleTable2::rowDescription(int row) const +{ + return view->model()->headerData(row, Qt::Vertical).toString(); +} + +QList<QAccessibleTable2CellInterface*> QAccessibleTable2::selectedCells() const +{ + QList<QAccessibleTable2CellInterface*> cells; + Q_FOREACH (const QModelIndex &index, view->selectionModel()->selectedIndexes()) { + cells.append(cell(index)); + } + return cells; +} + +QList<int> QAccessibleTable2::selectedColumns() const +{ + QList<int> columns; + Q_FOREACH (const QModelIndex &index, view->selectionModel()->selectedColumns()) { + columns.append(index.column()); + } + return columns; +} + +QList<int> QAccessibleTable2::selectedRows() const +{ + QList<int> rows; + Q_FOREACH (const QModelIndex &index, view->selectionModel()->selectedRows()) { + rows.append(index.row()); + } + return rows; +} + +QAccessibleInterface *QAccessibleTable2::summary() const +{ + return 0; +} + +bool QAccessibleTable2::isColumnSelected(int column) const +{ + return view->selectionModel()->isColumnSelected(column, QModelIndex()); +} + +bool QAccessibleTable2::isRowSelected(int row) const +{ + return view->selectionModel()->isRowSelected(row, QModelIndex()); +} + +bool QAccessibleTable2::selectRow(int row) +{ + QModelIndex index = view->model()->index(row, 0); + if (!index.isValid() || view->selectionMode() & QAbstractItemView::NoSelection) + return false; + view->selectionModel()->select(index, QItemSelectionModel::Select); + return true; +} + +bool QAccessibleTable2::selectColumn(int column) +{ + QModelIndex index = view->model()->index(0, column); + if (!index.isValid() || view->selectionMode() & QAbstractItemView::NoSelection) + return false; + view->selectionModel()->select(index, QItemSelectionModel::Select); + return true; +} + +bool QAccessibleTable2::unselectRow(int row) +{ + QModelIndex index = view->model()->index(row, 0); + if (!index.isValid() || view->selectionMode() & QAbstractItemView::NoSelection) + return false; + view->selectionModel()->select(index, QItemSelectionModel::Deselect); + return true; +} + +bool QAccessibleTable2::unselectColumn(int column) +{ + QModelIndex index = view->model()->index(0, column); + if (!index.isValid() || view->selectionMode() & QAbstractItemView::NoSelection) + return false; + view->selectionModel()->select(index, QItemSelectionModel::Columns & QItemSelectionModel::Deselect); + return true; +} + +QAccessible2::TableModelChange QAccessibleTable2::modelChange() const +{ + QAccessible2::TableModelChange change; + // FIXME + return change; +} + +QAccessible::Role QAccessibleTable2::role(int child) const +{ + Q_ASSERT(child >= 0); + if (child > 0) + return QAccessible::Cell; + return m_role; +} + +QAccessible::State QAccessibleTable2::state(int child) const +{ + Q_ASSERT(child == 0); + return QAccessible::Normal | HasInvokeExtension; +} + +int QAccessibleTable2::childAt(int x, int y) const +{ + QPoint viewportOffset = view->viewport()->mapTo(view, QPoint(0,0)); + QPoint indexPosition = view->mapFromGlobal(QPoint(x, y) - viewportOffset); + // FIXME: if indexPosition < 0 in one coordinate, return header + + QModelIndex index = view->indexAt(indexPosition); + if (index.isValid()) { + return logicalIndex(index); + } + return -1; +} + +int QAccessibleTable2::childCount() const +{ + int vHeader = verticalHeader() ? 1 : 0; + int hHeader = horizontalHeader() ? 1 : 0; + return (view->model()->rowCount()+hHeader) * (view->model()->columnCount()+vHeader); +} + +int QAccessibleTable2::indexOfChild(const QAccessibleInterface *iface) const +{ + Q_ASSERT(iface->role(0) != QAccessible::TreeItem); // should be handled by tree class + if (iface->role(0) == QAccessible::Cell || iface->role(0) == QAccessible::ListItem) { + const QAccessibleTable2Cell* cell = static_cast<const QAccessibleTable2Cell*>(iface); + return logicalIndex(cell->m_index); + } else if (iface->role(0) == QAccessible::ColumnHeader){ + const QAccessibleTable2HeaderCell* cell = static_cast<const QAccessibleTable2HeaderCell*>(iface); + return cell->index + (verticalHeader() ? 1 : 0) + 1; + } else if (iface->role(0) == QAccessible::RowHeader){ + const QAccessibleTable2HeaderCell* cell = static_cast<const QAccessibleTable2HeaderCell*>(iface); + return (cell->index+1) * (view->model()->rowCount()+1) + 1; + } else if (iface->role(0) == QAccessible::Pane) { + return 1; // corner button + } else { + qWarning() << "WARNING QAccessibleTable2::indexOfChild Fix my children..." + << iface->role(0) << iface->text(QAccessible::Name, 0); + } + // FIXME: we are in denial of our children. this should stop. + return -1; +} + +QString QAccessibleTable2::text(Text t, int child) const +{ + Q_ASSERT(child == 0); + if (t == QAccessible::Description) + return view->accessibleDescription(); + return view->accessibleName(); +} + +QRect QAccessibleTable2::rect(int child) const +{ + Q_ASSERT(!child); + if (!view->isVisible()) + return QRect(); + QPoint pos = view->mapToGlobal(QPoint(0, 0)); + return QRect(pos.x(), pos.y(), view->width(), view->height()); +} + +int QAccessibleTable2::navigate(RelationFlag relation, int index, QAccessibleInterface **iface) const +{ + *iface = 0; + switch (relation) { + case Ancestor: { + if (index == 1 && view->parent()) { + *iface = QAccessible::queryAccessibleInterface(view->parent()); + if (*iface) + return 0; + } + break; + } + case QAccessible::Child: { + Q_ASSERT(index > 0); + *iface = childFromLogical(index); + if (*iface) { + return 0; + } + break; + } + default: + break; + } + return -1; +} + +QAccessible::Relation QAccessibleTable2::relationTo(int, const QAccessibleInterface *, int) const +{ + return QAccessible::Unrelated; +} + +#ifndef QT_NO_ACTION +int QAccessibleTable2::userActionCount(int) const +{ + return 0; +} +QString QAccessibleTable2::actionText(int, Text, int) const +{ + return QString(); +} +bool QAccessibleTable2::doAction(int, int, const QVariantList &) +{ + return false; +} +#endif + + +// TREE VIEW + +QModelIndex QAccessibleTree::indexFromLogical(int row, int column) const +{ + const QTreeView *treeView = qobject_cast<const QTreeView*>(view); + QModelIndex modelIndex = treeView->d_func()->viewItems.at(row).index; + + if (modelIndex.isValid() && column > 0) { + modelIndex = view->model()->index(modelIndex.row(), column, modelIndex.parent()); + } + return modelIndex; +} + +int QAccessibleTree::childAt(int x, int y) const +{ + QPoint viewportOffset = view->viewport()->mapTo(view, QPoint(0,0)); + QPoint indexPosition = view->mapFromGlobal(QPoint(x, y) - viewportOffset); + + QModelIndex index = view->indexAt(indexPosition); + if (!index.isValid()) + return -1; + + const QTreeView *treeView = qobject_cast<const QTreeView*>(view); + int row = treeView->d_func()->viewIndex(index) + (horizontalHeader() ? 1 : 0); + int column = index.column(); + + int i = row * view->model()->columnCount() + column + 1; + Q_ASSERT(i > view->model()->columnCount()); + return i; +} + +int QAccessibleTree::childCount() const +{ + const QTreeView *treeView = qobject_cast<const QTreeView*>(view); + Q_ASSERT(treeView); + if (!view->model()) + return 0; + + int hHeader = horizontalHeader() ? 1 : 0; + return (treeView->d_func()->viewItems.count() + hHeader)* view->model()->columnCount(); +} + +int QAccessibleTree::rowCount() const +{ + const QTreeView *treeView = qobject_cast<const QTreeView*>(view); + Q_ASSERT(treeView); + return treeView->d_func()->viewItems.count(); +} + +int QAccessibleTree::indexOfChild(const QAccessibleInterface *iface) const +{ + if (iface->role(0) == QAccessible::TreeItem) { + const QAccessibleTable2Cell* cell = static_cast<const QAccessibleTable2Cell*>(iface); + const QTreeView *treeView = qobject_cast<const QTreeView*>(view); + Q_ASSERT(treeView); + int row = treeView->d_func()->viewIndex(cell->m_index) + (horizontalHeader() ? 1 : 0); + int column = cell->m_index.column(); + + int index = row * view->model()->columnCount() + column + 1; + //qDebug() << "QAccessibleTree::indexOfChild r " << row << " c " << column << "index " << index; + Q_ASSERT(index > treeView->model()->columnCount()); + return index; + } else if (iface->role(0) == QAccessible::ColumnHeader){ + const QAccessibleTable2HeaderCell* cell = static_cast<const QAccessibleTable2HeaderCell*>(iface); + //qDebug() << "QAccessibleTree::indexOfChild header " << cell->index << "is: " << cell->index + 1; + return cell->index + 1; + } else { + qWarning() << "WARNING QAccessibleTable2::indexOfChild invalid child" + << iface->role(0) << iface->text(QAccessible::Name, 0); + } + // FIXME: add scrollbars and don't just ignore them + return -1; +} + +int QAccessibleTree::navigate(RelationFlag relation, int index, QAccessibleInterface **iface) const +{ + switch (relation) { + case QAccessible::Child: { + Q_ASSERT(index > 0); + --index; + int hHeader = horizontalHeader() ? 1 : 0; + + if (hHeader) { + if (index < view->model()->columnCount()) { + *iface = new QAccessibleTable2HeaderCell(view, index, Qt::Horizontal); + return 0; + } else { + index -= view->model()->columnCount(); + } + } + + int row = index / view->model()->columnCount(); + int column = index % view->model()->columnCount(); + QModelIndex modelIndex = indexFromLogical(row, column); + if (modelIndex.isValid()) { + *iface = cell(modelIndex); + return 0; + } + return -1; + } + default: + break; + } + return QAccessibleTable2::navigate(relation, index, iface); +} + +QAccessible::Relation QAccessibleTree::relationTo(int, const QAccessibleInterface *, int) const +{ + return QAccessible::Unrelated; +} + +QAccessibleTable2CellInterface *QAccessibleTree::cellAt(int row, int column) const +{ + QModelIndex index = indexFromLogical(row, column); + if (!index.isValid()) { + qWarning() << "Requested invalid tree cell: " << row << column; + return 0; + } + return new QAccessibleTable2Cell(view, index, cellRole()); +} + +QString QAccessibleTree::rowDescription(int) const +{ + return QString(); // no headers for rows in trees +} + +bool QAccessibleTree::isRowSelected(int row) const +{ + QModelIndex index = indexFromLogical(row); + return view->selectionModel()->isRowSelected(index.row(), index.parent()); +} + +bool QAccessibleTree::selectRow(int row) +{ + QModelIndex index = indexFromLogical(row); + if (!index.isValid() || view->selectionMode() & QAbstractItemView::NoSelection) + return false; + view->selectionModel()->select(index, QItemSelectionModel::Select); + return true; +} + +// TABLE CELL + +QAccessibleTable2Cell::QAccessibleTable2Cell(QAbstractItemView *view_, const QModelIndex &index_, QAccessible::Role role_) + : /* QAccessibleSimpleEditableTextInterface(this), */ view(view_), m_index(index_), m_role(role_) +{ + Q_ASSERT(index_.isValid()); +} + +int QAccessibleTable2Cell::columnExtent() const { return 1; } +int QAccessibleTable2Cell::rowExtent() const { return 1; } + +QList<QAccessibleInterface*> QAccessibleTable2Cell::rowHeaderCells() const +{ + QList<QAccessibleInterface*> headerCell; + if (verticalHeader()) { + headerCell.append(new QAccessibleTable2HeaderCell(view, m_index.row(), Qt::Vertical)); + } + return headerCell; +} + +QList<QAccessibleInterface*> QAccessibleTable2Cell::columnHeaderCells() const +{ + QList<QAccessibleInterface*> headerCell; + if (horizontalHeader()) { + headerCell.append(new QAccessibleTable2HeaderCell(view, m_index.column(), Qt::Horizontal)); + } + return headerCell; +} + +QHeaderView *QAccessibleTable2Cell::horizontalHeader() const +{ + QHeaderView *header = 0; + + if (false) { +#ifndef QT_NO_TABLEVIEW + } else if (const QTableView *tv = qobject_cast<const QTableView*>(view)) { + header = tv->horizontalHeader(); +#endif +#ifndef QT_NO_TREEVIEW + } else if (const QTreeView *tv = qobject_cast<const QTreeView*>(view)) { + header = tv->header(); +#endif + } + + return header; +} + +QHeaderView *QAccessibleTable2Cell::verticalHeader() const +{ + QHeaderView *header = 0; +#ifndef QT_NO_TABLEVIEW + if (const QTableView *tv = qobject_cast<const QTableView*>(view)) + header = tv->verticalHeader(); +#endif + return header; +} + +int QAccessibleTable2Cell::columnIndex() const +{ + return m_index.column(); +} + +int QAccessibleTable2Cell::rowIndex() const +{ + if (role(0) == QAccessible::TreeItem) { + const QTreeView *treeView = qobject_cast<const QTreeView*>(view); + Q_ASSERT(treeView); + int row = treeView->d_func()->viewIndex(m_index); + return row; + } + return m_index.row(); +} + +bool QAccessibleTable2Cell::isSelected() const +{ + return view->selectionModel()->isSelected(m_index); +} + +void QAccessibleTable2Cell::rowColumnExtents(int *row, int *column, int *rowExtents, int *columnExtents, bool *selected) const +{ + *row = m_index.row(); + *column = m_index.column(); + *rowExtents = 1; + *columnExtents = 1; + *selected = isSelected(); +} + +QAccessibleTable2Interface* QAccessibleTable2Cell::table() const +{ + return QAccessible::queryAccessibleInterface(view)->table2Interface(); +} + +QAccessible::Role QAccessibleTable2Cell::role(int child) const +{ + Q_ASSERT(child == 0); + return m_role; +} + +QAccessible::State QAccessibleTable2Cell::state(int child) const +{ + Q_ASSERT(child == 0); + State st = Normal; + + QRect globalRect = view->rect(); + globalRect.translate(view->mapToGlobal(QPoint(0,0))); + if (!globalRect.intersects(rect(0))) + st |= Invisible; + + if (view->selectionModel()->isSelected(m_index)) + st |= Selected; + if (view->selectionModel()->currentIndex() == m_index) + st |= Focused; + if (m_index.model()->data(m_index, Qt::CheckStateRole).toInt() == Qt::Checked) + st |= Checked; + + Qt::ItemFlags flags = m_index.flags(); + if (flags & Qt::ItemIsSelectable) { + st |= Selectable; + st |= Focusable; + if (view->selectionMode() == QAbstractItemView::MultiSelection) + st |= MultiSelectable; + if (view->selectionMode() == QAbstractItemView::ExtendedSelection) + st |= ExtSelectable; + } + if (m_role == QAccessible::TreeItem) { + const QTreeView *treeView = qobject_cast<const QTreeView*>(view); + if (treeView->isExpanded(m_index)) + st |= Expanded; + } + return st; +} + +bool QAccessibleTable2Cell::isExpandable() const +{ + return view->model()->hasChildren(m_index); +} + +QRect QAccessibleTable2Cell::rect(int child) const +{ + Q_ASSERT(child == 0); + + QRect r; + r = view->visualRect(m_index); + + if (!r.isNull()) + r.translate(view->viewport()->mapTo(view, QPoint(0,0))); + r.translate(view->mapToGlobal(QPoint(0, 0))); + return r; +} + +QString QAccessibleTable2Cell::text(Text t, int child) const +{ + Q_ASSERT(child == 0); + QAbstractItemModel *model = view->model(); + QString value; + switch (t) { + case QAccessible::Value: + case QAccessible::Name: + value = model->data(m_index, Qt::AccessibleTextRole).toString(); + if (value.isEmpty()) + value = model->data(m_index, Qt::DisplayRole).toString(); + break; + case QAccessible::Description: + value = model->data(m_index, Qt::AccessibleDescriptionRole).toString(); + break; + default: + break; + } + return value; +} + +void QAccessibleTable2Cell::setText(Text /*t*/, int child, const QString &text) +{ + Q_ASSERT(child == 0); + if (!m_index.flags() & Qt::ItemIsEditable) + return; + view->model()->setData(m_index, text); +} + +bool QAccessibleTable2Cell::isValid() const +{ + if (!m_index.isValid()) { + qDebug() << "Interface is not valid"; + } + + return m_index.isValid(); +} + +int QAccessibleTable2Cell::navigate(RelationFlag relation, int index, QAccessibleInterface **iface) const +{ + if (relation == Ancestor && index == 1) { + if (m_role == QAccessible::TreeItem) { + *iface = new QAccessibleTree(view); + } else { + *iface = new QAccessibleTable2(view); + } + return 0; + } + + *iface = 0; + if (!view) + return -1; + + switch (relation) { + + case Child: { + return -1; + } + case Sibling: + if (index > 0) { + QAccessibleInterface *parent = queryAccessibleInterface(view); + int ret = parent->navigate(QAccessible::Child, index, iface); + delete parent; + if (*iface) + return ret; + } + return -1; + +// From table1 implementation: +// case Up: +// case Down: +// case Left: +// case Right: { +// // This is in the "not so nice" category. In order to find out which item +// // is geometrically around, we have to set the current index, navigate +// // and restore the index as well as the old selection +// view->setUpdatesEnabled(false); +// const QModelIndex oldIdx = view->currentIndex(); +// QList<QModelIndex> kids = children(); +// const QModelIndex currentIndex = index ? kids.at(index - 1) : QModelIndex(row); +// const QItemSelection oldSelection = view->selectionModel()->selection(); +// view->setCurrentIndex(currentIndex); +// const QModelIndex idx = view->moveCursor(toCursorAction(relation), Qt::NoModifier); +// view->setCurrentIndex(oldIdx); +// view->selectionModel()->select(oldSelection, QItemSelectionModel::ClearAndSelect); +// view->setUpdatesEnabled(true); +// if (!idx.isValid()) +// return -1; + +// if (idx.parent() != row.parent() || idx.row() != row.row()) +// *iface = cell(idx); +// return index ? kids.indexOf(idx) + 1 : 0; } + default: + break; + } + + return -1; +} + +QAccessible::Relation QAccessibleTable2Cell::relationTo(int child, const QAccessibleInterface *other, int otherChild) const +{ + Q_ASSERT(child == 0); + Q_ASSERT(otherChild == 0); + // we only check for parent-child relationships in trees + if (m_role == QAccessible::TreeItem && other->role(0) == QAccessible::TreeItem) { + QModelIndex otherIndex = static_cast<const QAccessibleTable2Cell*>(other)->m_index; + // is the other our parent? + if (otherIndex.parent() == m_index) + return QAccessible::Ancestor; + // are we the other's child? + if (m_index.parent() == otherIndex) + return QAccessible::Child; + } + return QAccessible::Unrelated; +} + +#ifndef QT_NO_ACTION +int QAccessibleTable2Cell::userActionCount(int) const +{ + return 0; +} + +QString QAccessibleTable2Cell::actionText(int, Text, int) const +{ + return QString(); +} + +bool QAccessibleTable2Cell::doAction(int, int, const QVariantList &) +{ + return false; +} + +QAccessibleTable2HeaderCell::QAccessibleTable2HeaderCell(QAbstractItemView *view_, int index_, Qt::Orientation orientation_) + : view(view_), index(index_), orientation(orientation_) +{ + Q_ASSERT(index_ >= 0); +} + +QAccessible::Role QAccessibleTable2HeaderCell::role(int child) const +{ + Q_ASSERT(child == 0); + if (orientation == Qt::Horizontal) + return QAccessible::ColumnHeader; + return QAccessible::RowHeader; +} + +QAccessible::State QAccessibleTable2HeaderCell::state(int child) const +{ + Q_ASSERT(child == 0); + return QAccessible::Normal; +} + +QRect QAccessibleTable2HeaderCell::rect(int child) const +{ + Q_ASSERT(child == 0); + + QHeaderView *header = 0; + if (false) { +#ifndef QT_NO_TABLEVIEW + } else if (const QTableView *tv = qobject_cast<const QTableView*>(view)) { + if (orientation == Qt::Horizontal) { + header = tv->horizontalHeader(); + } else { + header = tv->verticalHeader(); + } +#endif +#ifndef QT_NO_TREEVIEW + } else if (const QTreeView *tv = qobject_cast<const QTreeView*>(view)) { + header = tv->header(); +#endif + } + QPoint zero = header->mapToGlobal(QPoint(0, 0)); + int sectionSize = header->sectionSize(index); + int sectionPos = header->sectionPosition(index); + return orientation == Qt::Horizontal + ? QRect(zero.x() + sectionPos, zero.y(), sectionSize, header->height()) + : QRect(zero.x(), zero.y() + sectionPos, header->width(), sectionSize); +} + +QString QAccessibleTable2HeaderCell::text(Text t, int child) const +{ + Q_ASSERT(child == 0); + QAbstractItemModel *model = view->model(); + QString value; + switch (t) { + case QAccessible::Value: + case QAccessible::Name: + value = model->headerData(index, orientation, Qt::AccessibleTextRole).toString(); + if (value.isEmpty()) + value = model->headerData(index, orientation, Qt::DisplayRole).toString(); + break; + case QAccessible::Description: + value = model->headerData(index, orientation, Qt::AccessibleDescriptionRole).toString(); + break; + default: + break; + } + return value; +} + +void QAccessibleTable2HeaderCell::setText(Text, int, const QString &) +{ + return; +} + +bool QAccessibleTable2HeaderCell::isValid() const +{ + return true; +} + +int QAccessibleTable2HeaderCell::navigate(RelationFlag relation, int index, QAccessibleInterface **iface) const +{ + if (relation == QAccessible::Ancestor && index == 1) { + if (false) { +#ifndef QT_NO_TREEVIEW + } else if (qobject_cast<const QTreeView*>(view)) { + *iface = new QAccessibleTree(view); + return 0; +#endif + } else { + *iface = new QAccessibleTable2(view); + return 0; + } + } + *iface = 0; + return -1; +} + +QAccessible::Relation QAccessibleTable2HeaderCell::relationTo(int, const QAccessibleInterface *, int) const +{ + return QAccessible::Unrelated; +} + +#ifndef QT_NO_ACTION +int QAccessibleTable2HeaderCell::userActionCount(int) const +{ + return 0; +} + +QString QAccessibleTable2HeaderCell::actionText(int, Text, int) const +{ + return QString(); +} + +bool QAccessibleTable2HeaderCell::doAction(int, int, const QVariantList &) +{ + return false; +} +#endif + + + +#endif + +#endif // QT_NO_ITEMVIEWS + +QT_END_NAMESPACE + +#endif // QT_NO_ACCESSIBILITY diff --git a/src/plugins/accessible/widgets/itemviews.h b/src/plugins/accessible/widgets/itemviews.h new file mode 100644 index 0000000..c8492e3 --- /dev/null +++ b/src/plugins/accessible/widgets/itemviews.h @@ -0,0 +1,319 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef ACCESSIBLE_ITEMVIEWS_H +#define ACCESSIBLE_ITEMVIEWS_H + +#include <QtGui/qabstractitemview.h> +#include <QtGui/qheaderview.h> +#include <QtGui/qaccessible.h> +#include <QtGui/qaccessible2.h> +#include <QtGui/qaccessiblewidget.h> + + +QT_BEGIN_NAMESPACE + +#ifndef QT_NO_ACCESSIBILITY + +#ifndef QT_NO_ITEMVIEWS + +class QAccessibleTable2Cell; +class QAccessibleTable2HeaderCell; + +class QAccessibleTable2: public QAccessibleTable2Interface, public QAccessibleObjectEx +{ + Q_ACCESSIBLE_OBJECT +public: + explicit QAccessibleTable2(QWidget *w); + + virtual ~QAccessibleTable2(); + + QObject *object() const { return view; } + Role role(int child) const; + State state(int child) const; + QString text(Text t, int child) const; + QRect rect(int child) const; + + int childAt(int x, int y) const; + int childCount() const; + int indexOfChild(const QAccessibleInterface *) const; + + int navigate(RelationFlag relation, int index, QAccessibleInterface **iface) const; + Relation relationTo(int child, const QAccessibleInterface *other, int otherChild) const; + +#ifndef QT_NO_ACTION + int userActionCount(int child) const; + QString actionText(int action, Text t, int child) const; + bool doAction(int action, int child, const QVariantList ¶ms); +#endif + QVariant invokeMethodEx(Method, int, const QVariantList &) { return QVariant(); } + + // table2 interface + virtual QAccessibleTable2CellInterface *cellAt(int row, int column) const; + virtual QAccessibleInterface *caption() const; + virtual QAccessibleInterface *summary() const; + virtual QString columnDescription(int column) const; + virtual QString rowDescription(int row) const; + virtual int columnCount() const; + virtual int rowCount() const; + virtual QAccessible2::TableModelChange modelChange() const; + + // selection + virtual int selectedCellCount() const; + virtual int selectedColumnCount() const; + virtual int selectedRowCount() const; + virtual QList<QAccessibleTable2CellInterface*> selectedCells() const; + virtual QList<int> selectedColumns() const; + virtual QList<int> selectedRows() const; + virtual bool isColumnSelected(int column) const; + virtual bool isRowSelected(int row) const; + virtual bool selectRow(int row); + virtual bool selectColumn(int column); + virtual bool unselectRow(int row); + virtual bool unselectColumn(int column); + +protected: + virtual void modelReset(); + virtual void rowsInserted(const QModelIndex &parent, int first, int last); + virtual void rowsRemoved(const QModelIndex &parent, int first, int last); + virtual void columnsInserted(const QModelIndex &parent, int first, int last); + virtual void columnsRemoved(const QModelIndex &parent, int first, int last); + virtual void rowsMoved( const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row); + virtual void columnsMoved( const QModelIndex &parent, int start, int end, const QModelIndex &destination, int column); + +protected: + QAbstractItemView* view; + QAccessible2::TableModelChange lastChange; + inline QAccessibleTable2Cell *cell(const QModelIndex &index) const; + inline QAccessible::Role cellRole() const { + switch (m_role) { + case QAccessible::List: + return QAccessible::ListItem; + case QAccessible::Table: + return QAccessible::Cell; + case QAccessible::Tree: + return QAccessible::TreeItem; + default: + Q_ASSERT(0); + } + return QAccessible::NoRole; + } + + QHeaderView *horizontalHeader() const; + QHeaderView *verticalHeader() const; +private: + // the child index for a model index + inline int logicalIndex(const QModelIndex &index) const; + // the model index from the child index + QAccessibleInterface *childFromLogical(int logicalIndex) const; + QAccessible::Role m_role; +}; + +class QAccessibleTree :public QAccessibleTable2 +{ +public: + explicit QAccessibleTree(QWidget *w) + : QAccessibleTable2(w) + {} + + virtual ~QAccessibleTree() {} + + int childAt(int x, int y) const; + int childCount() const; + int indexOfChild(const QAccessibleInterface *) const; + + int rowCount() const; + + int navigate(RelationFlag relation, int index, QAccessibleInterface **iface) const; + Relation relationTo(int child, const QAccessibleInterface *other, int otherChild) const; + + // table2 interface + QAccessibleTable2CellInterface *cellAt(int row, int column) const; + QString rowDescription(int row) const; + bool isRowSelected(int row) const; + bool selectRow(int row); + +private: + QModelIndex indexFromLogical(int row, int column = 0) const; +}; + +class QAccessibleTable2Cell: public QAccessibleTable2CellInterface /*), public QAccessibleTextInterface, public QAccessibleSimpleEditableTextInterface*/ +{ +public: + QAccessibleTable2Cell(QAbstractItemView *view, const QModelIndex &m_index, QAccessible::Role role); + + QObject *object() const { return 0; } + Role role(int child) const; + State state(int child) const; + QRect rect(int child) const; + bool isValid() const; + + int childAt(int, int) const { return 0; } + int childCount() const { return 0; } + int indexOfChild(const QAccessibleInterface *) const { return -1; } + + QString text(Text t, int child) const; + void setText(Text t, int child, const QString &text); + + int navigate(RelationFlag relation, int m_index, QAccessibleInterface **iface) const; + Relation relationTo(int child, const QAccessibleInterface *other, int otherChild) const; + + bool isExpandable() const; + +#ifndef QT_NO_ACTION + int userActionCount(int child) const; + QString actionText(int action, Text t, int child) const; + bool doAction(int action, int child, const QVariantList ¶ms); +#endif + + // cell interface + virtual int columnExtent() const; + virtual QList<QAccessibleInterface*> columnHeaderCells() const; + virtual int columnIndex() const; + virtual int rowExtent() const; + virtual QList<QAccessibleInterface*> rowHeaderCells() const; + virtual int rowIndex() const; + virtual bool isSelected() const; + virtual void rowColumnExtents(int *row, int *column, int *rowExtents, int *columnExtents, bool *selected) const; + virtual QAccessibleTable2Interface* table() const; + +private: + QHeaderView *verticalHeader() const; + QHeaderView *horizontalHeader() const; + QAbstractItemView *view; + QModelIndex m_index; + QAccessible::Role m_role; + +friend class QAccessibleTable2; +friend class QAccessibleTree; +}; + + +class QAccessibleTable2HeaderCell: public QAccessibleInterface /*), public QAccessibleTextInterface, public QAccessibleSimpleEditableTextInterface*/ +{ +public: + // For header cells, pass the header view in addition + QAccessibleTable2HeaderCell(QAbstractItemView *view, int index, Qt::Orientation orientation); + + QObject *object() const { return 0; } + Role role(int child) const; + State state(int child) const; + QRect rect(int child) const; + bool isValid() const; + + int childAt(int, int) const { return 0; } + int childCount() const { return 0; } + int indexOfChild(const QAccessibleInterface *) const { return -1; } + + QString text(Text t, int child) const; + void setText(Text t, int child, const QString &text); + + int navigate(RelationFlag relation, int index, QAccessibleInterface **iface) const; + Relation relationTo(int child, const QAccessibleInterface *other, int otherChild) const; + +#ifndef QT_NO_ACTION + int userActionCount(int child) const; + QString actionText(int action, Text t, int child) const; + bool doAction(int action, int child, const QVariantList ¶ms); +#endif + +private: + QAbstractItemView *view; + int index; + Qt::Orientation orientation; + +friend class QAccessibleTable2; +friend class QAccessibleTree; +}; + +// This is the corner button on the top left of a table. +// It can be used to select all cells or it is not active at all. +// For now it is ignored. +class QAccessibleTable2CornerButton: public QAccessibleInterface +{ +public: + QAccessibleTable2CornerButton(QAbstractItemView *view_) + :view(view_) + {} + + QObject *object() const { return 0; } + Role role(int child) const { Q_ASSERT(child == 0); return QAccessible::Pane; } + State state(int child) const { Q_ASSERT(child == 0); return QAccessible::Normal; } + QRect rect(int child) const { Q_ASSERT(child == 0); return QRect(); } + bool isValid() const { return true; } + + int childAt(int, int) const { return 0; } + int childCount() const { return 0; } + int indexOfChild(const QAccessibleInterface *) const { return -1; } + + QString text(Text, int) const { return QString(); } + void setText(Text, int, const QString &) {} + + int navigate(RelationFlag relation, int index, QAccessibleInterface **iface) const + { + if (relation == QAccessible::Ancestor && index == 1) { + *iface = QAccessible::queryAccessibleInterface(view); + return 0; + } + return -1; + } + Relation relationTo(int, const QAccessibleInterface *, int) const + { + return QAccessible::Unrelated; + } + +#ifndef QT_NO_ACTION + int userActionCount(int) const { return 0; } + QString actionText(int, Text, int) const { return QString(); } + bool doAction(int, int, const QVariantList &) { return false; } +#endif +private: + QAbstractItemView *view; +}; + + +#endif + +#endif // QT_NO_ACCESSIBILITY + +QT_END_NAMESPACE + +#endif // ACCESSIBLE_ITEMVIEWS_H diff --git a/src/plugins/accessible/widgets/main.cpp b/src/plugins/accessible/widgets/main.cpp index aa5459c..cd17a6e 100644 --- a/src/plugins/accessible/widgets/main.cpp +++ b/src/plugins/accessible/widgets/main.cpp @@ -44,11 +44,13 @@ #include "simplewidgets.h" #include "rangecontrols.h" #include "complexwidgets.h" +#include "itemviews.h" #include <qaccessibleplugin.h> #include <qplugin.h> #include <qpushbutton.h> #include <qtoolbutton.h> +#include <qtreeview.h> #include <qvariant.h> #include <qaccessible.h> @@ -56,6 +58,7 @@ QT_BEGIN_NAMESPACE + class AccessibleFactory : public QAccessiblePlugin { public: @@ -251,6 +254,22 @@ QAccessibleInterface *AccessibleFactory::create(const QString &classname, QObjec iface = new QAccessibleMenu(widget); #endif #ifndef QT_NO_ITEMVIEWS +#ifdef Q_WS_X11 + } else if (classname == QLatin1String("QAbstractItemView")) { + if (qobject_cast<const QTreeView*>(widget)) { + iface = new QAccessibleTree(widget); + } else { + iface = new QAccessibleTable2(widget); + } + } else if (classname == QLatin1String("QWidget") + && widget->objectName() == QLatin1String("qt_scrollarea_viewport") + && qobject_cast<QAbstractItemView*>(widget->parentWidget())) { + if (qobject_cast<const QTreeView*>(widget->parentWidget())) { + iface = new QAccessibleTree(widget->parentWidget()); + } else { + iface = new QAccessibleTable2(widget->parentWidget()); + } +#else } else if (classname == QLatin1String("QHeaderView")) { iface = new QAccessibleHeader(widget); } else if (classname == QLatin1String("QAbstractItemView")) { @@ -259,7 +278,8 @@ QAccessibleInterface *AccessibleFactory::create(const QString &classname, QObjec && widget->objectName() == QLatin1String("qt_scrollarea_viewport") && qobject_cast<QAbstractItemView*>(widget->parentWidget())) { iface = new QAccessibleItemView(widget); -#endif +#endif // Q_WS_X11 +#endif // QT_NO_ITEMVIEWS #ifndef QT_NO_TABBAR } else if (classname == QLatin1String("QTabBar")) { iface = new QAccessibleTabBar(widget); diff --git a/src/plugins/accessible/widgets/widgets.pro b/src/plugins/accessible/widgets/widgets.pro index 79110cb..9632f41 100644 --- a/src/plugins/accessible/widgets/widgets.pro +++ b/src/plugins/accessible/widgets/widgets.pro @@ -7,14 +7,18 @@ QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/accessible QTDIR_build:REQUIRES += "contains(QT_CONFIG, accessibility)" SOURCES += main.cpp \ - simplewidgets.cpp \ - rangecontrols.cpp \ - complexwidgets.cpp \ - qaccessiblewidgets.cpp \ - qaccessiblemenu.cpp + simplewidgets.cpp \ + rangecontrols.cpp \ + complexwidgets.cpp \ + qaccessiblewidgets.cpp \ + qaccessiblemenu.cpp \ + itemviews.cpp HEADERS += qaccessiblewidgets.h \ - simplewidgets.h \ - rangecontrols.h \ - complexwidgets.h \ - qaccessiblemenu.h + simplewidgets.h \ + rangecontrols.h \ + complexwidgets.h \ + qaccessiblemenu.h \ + itemviews.h + + diff --git a/tests/auto/qaccessibility/tst_qaccessibility.cpp b/tests/auto/qaccessibility/tst_qaccessibility.cpp index d764187..d452820 100644 --- a/tests/auto/qaccessibility/tst_qaccessibility.cpp +++ b/tests/auto/qaccessibility/tst_qaccessibility.cpp @@ -190,7 +190,8 @@ static int verifyHierarchy(QAccessibleInterface *iface) if (middleChild) { entry = if2->navigate(QAccessible::Sibling, middle, &if3); EXPECT(entry == 0 && if3->object() == middleChild->object()); - delete if3; + if (entry == 0) + delete if3; EXPECT(iface->indexOfChild(middleChild) == middle); } @@ -270,6 +271,9 @@ private slots: void scrollAreaTest(); void tableWidgetTest(); void tableViewTest(); + void table2ListTest(); + void table2TreeTest(); + void table2TableTest(); void calendarWidgetTest(); void dockWidgetTest(); void pushButtonTest(); @@ -304,6 +308,10 @@ QString eventName(const int ev) case 0x0012: return "ScrollingStart"; case 0x0013: return "ScrollingEnd"; case 0x0018: return "MenuCommand"; + + case 0x0116: return "TableModelChanged"; + case 0x011B: return "TextCaretMoved"; + case 0x8000: return "ObjectCreated"; case 0x8001: return "ObjectDestroyed"; case 0x8002: return "ObjectShow"; @@ -1752,18 +1760,21 @@ void tst_QAccessibility::applicationTest() void tst_QAccessibility::mainWindowTest() { - QMainWindow mw; - mw.resize(300, 200); - mw.show(); // triggers layout + QMainWindow *mw = new QMainWindow; + mw->resize(300, 200); + mw->show(); // triggers layout QLatin1String name = QLatin1String("I am the main window"); - mw.setWindowTitle(name); - QTest::qWaitForWindowShown(&mw); + mw->setWindowTitle(name); + QTest::qWaitForWindowShown(mw); + QVERIFY_EVENT(mw, 0, QAccessible::ObjectShow); - QAccessibleInterface *interface = QAccessible::queryAccessibleInterface(&mw); + QAccessibleInterface *interface = QAccessible::queryAccessibleInterface(mw); QCOMPARE(interface->text(QAccessible::Name, 0), name); QCOMPARE(interface->role(0), QAccessible::Window); delete interface; + delete mw; + QTestAccessibility::clearEvents(); } class CounterButton : public QPushButton { @@ -2749,6 +2760,9 @@ void tst_QAccessibility::textBrowserTest() void tst_QAccessibility::listViewTest() { +#if defined(Q_WS_X11) + QSKIP( "Accessible table1 interface is no longer supported on X11.", SkipAll); +#else { QListView listView; QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(&listView); @@ -2814,6 +2828,7 @@ void tst_QAccessibility::listViewTest() } QTestAccessibility::clearEvents(); +#endif } @@ -3068,9 +3083,11 @@ void tst_QAccessibility::lineEditTest() le3->deselect(); le3->setCursorPosition(3); QCOMPARE(textIface->cursorPosition(), 3); + QTRY_VERIFY(QTestAccessibility::events().contains(QTestAccessibilityEvent(le3, 0, QAccessible::TextCaretMoved))); QCOMPARE(textIface->selectionCount(), 0); - int start, end; + QTestAccessibility::clearEvents(); + int start, end; QCOMPARE(textIface->text(0, 8), QString::fromLatin1("I always")); QCOMPARE(textIface->textAtOffset(0, QAccessible2::CharBoundary,&start,&end), QString::fromLatin1("I")); QCOMPARE(start, 0); @@ -3113,6 +3130,7 @@ void tst_QAccessibility::lineEditTest() delete iface; delete toplevel; + QTestAccessibility::clearEvents(); } void tst_QAccessibility::workspaceTest() @@ -3523,6 +3541,9 @@ void tst_QAccessibility::scrollAreaTest() void tst_QAccessibility::tableWidgetTest() { +#if defined(Q_WS_X11) + QSKIP( "Accessible table1 interface is no longer supported on X11.", SkipAll); +#else { QWidget *topLevel = new QWidget; QTableWidget *w = new QTableWidget(8,4,topLevel); @@ -3562,6 +3583,7 @@ void tst_QAccessibility::tableWidgetTest() delete topLevel; } QTestAccessibility::clearEvents(); +#endif } class QtTestTableModel: public QAbstractTableModel @@ -3644,6 +3666,9 @@ public: void tst_QAccessibility::tableViewTest() { +#if defined(Q_WS_X11) + QSKIP( "Accessible table1 interface is no longer supported on X11.", SkipAll); +#else { QtTestTableModel *model = new QtTestTableModel(3, 4); QTableView *w = new QTableView(); @@ -3723,6 +3748,331 @@ void tst_QAccessibility::tableViewTest() delete model; } QTestAccessibility::clearEvents(); +#endif +} + +void tst_QAccessibility::table2ListTest() +{ +#if !defined(Q_WS_X11) + QSKIP( "Accessible table2 interface is currently only supported on X11.", SkipAll); +#else + QListWidget *listView = new QListWidget; + listView->addItem("Oslo"); + listView->addItem("Berlin"); + listView->addItem("Brisbane"); + listView->resize(400,400); + listView->show(); + QTest::qWait(1); // Need this for indexOfchild to work. +#if defined(Q_WS_X11) + qt_x11_wait_for_window_manager(listView); + QTest::qWait(100); +#endif + + QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(listView); + QCOMPARE(verifyHierarchy(iface), 0); + + QCOMPARE((int)iface->role(0), (int)QAccessible::List); + QCOMPARE(iface->childCount(), 3); + + QAccessibleInterface *child1 = 0; + QCOMPARE(iface->navigate(QAccessible::Child, 1, &child1), 0); + QVERIFY(child1); + QCOMPARE(iface->indexOfChild(child1), 1); + QCOMPARE(child1->text(QAccessible::Name, 0), QString("Oslo")); + QCOMPARE(child1->role(0), QAccessible::ListItem); + delete child1; + + QAccessibleInterface *child2 = 0; + QCOMPARE(iface->navigate(QAccessible::Child, 2, &child2), 0); + QVERIFY(child2); + QCOMPARE(iface->indexOfChild(child2), 2); + QCOMPARE(child2->text(QAccessible::Name, 0), QString("Berlin")); + delete child2; + + QAccessibleInterface *child3 = 0; + QCOMPARE(iface->navigate(QAccessible::Child, 3, &child3), 0); + QVERIFY(child3); + QCOMPARE(iface->indexOfChild(child3), 3); + QCOMPARE(child3->text(QAccessible::Name, 0), QString("Brisbane")); + delete child3; + QTestAccessibility::clearEvents(); + + // Check for events + QTest::mouseClick(listView->viewport(), Qt::LeftButton, 0, listView->visualItemRect(listView->item(1)).center()); + QVERIFY(QTestAccessibility::events().contains(QTestAccessibilityEvent(listView, 2, QAccessible::Selection))); + QVERIFY(QTestAccessibility::events().contains(QTestAccessibilityEvent(listView, 2, QAccessible::Focus))); + QTest::mouseClick(listView->viewport(), Qt::LeftButton, 0, listView->visualItemRect(listView->item(2)).center()); + QVERIFY(QTestAccessibility::events().contains(QTestAccessibilityEvent(listView, 3, QAccessible::Selection))); + QVERIFY(QTestAccessibility::events().contains(QTestAccessibilityEvent(listView, 3, QAccessible::Focus))); + + listView->addItem("Munich"); + QCOMPARE(iface->childCount(), 4); + + // table 2 + QAccessibleTable2Interface *table2 = iface->table2Interface(); + QVERIFY(table2); + QCOMPARE(table2->columnCount(), 1); + QCOMPARE(table2->rowCount(), 4); + QAccessibleTable2CellInterface *cell1; + QVERIFY(cell1 = table2->cellAt(0,0)); + QCOMPARE(cell1->text(QAccessible::Name, 0), QString("Oslo")); + QAccessibleTable2CellInterface *cell4; + QVERIFY(cell4 = table2->cellAt(3,0)); + QCOMPARE(cell4->text(QAccessible::Name, 0), QString("Munich")); + QCOMPARE(cell4->role(0), QAccessible::ListItem); + QCOMPARE(cell4->rowIndex(), 3); + QCOMPARE(cell4->columnIndex(), 0); + QVERIFY(!cell4->isExpandable()); + + delete cell4; + delete cell1; + delete iface; + delete listView; + QTestAccessibility::clearEvents(); +#endif +} + +void tst_QAccessibility::table2TreeTest() +{ +#if !defined(Q_WS_X11) + QSKIP( "Accessible table2 interface is currently only supported on X11.", SkipAll); +#else + QTreeWidget *treeView = new QTreeWidget; + treeView->setColumnCount(2); + QTreeWidgetItem *header = new QTreeWidgetItem; + header->setText(0, "Artist"); + header->setText(1, "Work"); + treeView->setHeaderItem(header); + + QTreeWidgetItem *root1 = new QTreeWidgetItem; + root1->setText(0, "Spain"); + treeView->addTopLevelItem(root1); + + QTreeWidgetItem *item1 = new QTreeWidgetItem; + item1->setText(0, "Picasso"); + item1->setText(1, "Guernica"); + root1->addChild(item1); + + QTreeWidgetItem *item2 = new QTreeWidgetItem; + item2->setText(0, "Tapies"); + item2->setText(1, "Ambrosia"); + root1->addChild(item2); + + QTreeWidgetItem *root2 = new QTreeWidgetItem; + root2->setText(0, "Austria"); + treeView->addTopLevelItem(root2); + + QTreeWidgetItem *item3 = new QTreeWidgetItem; + item3->setText(0, "Klimt"); + item3->setText(1, "The Kiss"); + root2->addChild(item3); + + treeView->resize(400,400); + treeView->show(); + QTest::qWait(1); // Need this for indexOfchild to work. +#if defined(Q_WS_X11) + qt_x11_wait_for_window_manager(treeView); + QTest::qWait(100); +#endif + + QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(treeView); + QEXPECT_FAIL("", "Implement Sibling navigation for table2 cells.", Continue); + QCOMPARE(verifyHierarchy(iface), 0); + + QCOMPARE((int)iface->role(0), (int)QAccessible::Tree); + // header and 2 rows (the others are not expanded, thus not visible) + QCOMPARE(iface->childCount(), 6); + + QAccessibleInterface *header1 = 0; + QCOMPARE(iface->navigate(QAccessible::Child, 1, &header1), 0); + QVERIFY(header1); + QCOMPARE(iface->indexOfChild(header1), 1); + QCOMPARE(header1->text(QAccessible::Name, 0), QString("Artist")); + QCOMPARE(header1->role(0), QAccessible::ColumnHeader); + delete header1; + + QAccessibleInterface *child1 = 0; + QCOMPARE(iface->navigate(QAccessible::Child, 3, &child1), 0); + QVERIFY(child1); + QCOMPARE(iface->indexOfChild(child1), 3); + QCOMPARE(child1->text(QAccessible::Name, 0), QString("Spain")); + QCOMPARE(child1->role(0), QAccessible::TreeItem); + QVERIFY(!(child1->state(0) & QAccessible::Expanded)); + delete child1; + + QAccessibleInterface *child2 = 0; + QCOMPARE(iface->navigate(QAccessible::Child, 5, &child2), 0); + QVERIFY(child2); + QCOMPARE(iface->indexOfChild(child2), 5); + QCOMPARE(child2->text(QAccessible::Name, 0), QString("Austria")); + delete child2; + + QTestAccessibility::clearEvents(); + + // table 2 + QAccessibleTable2Interface *table2 = iface->table2Interface(); + QVERIFY(table2); + QCOMPARE(table2->columnCount(), 2); + QCOMPARE(table2->rowCount(), 2); + QAccessibleTable2CellInterface *cell1; + QVERIFY(cell1 = table2->cellAt(0,0)); + QCOMPARE(cell1->text(QAccessible::Name, 0), QString("Spain")); + QAccessibleTable2CellInterface *cell2; + QVERIFY(cell2 = table2->cellAt(1,0)); + QCOMPARE(cell2->text(QAccessible::Name, 0), QString("Austria")); + QCOMPARE(cell2->role(0), QAccessible::TreeItem); + QCOMPARE(cell2->rowIndex(), 1); + QCOMPARE(cell2->columnIndex(), 0); + QVERIFY(cell2->isExpandable()); + QCOMPARE(iface->indexOfChild(cell2), 5); + QVERIFY(!(cell2->state(0) & QAccessible::Expanded)); + QCOMPARE(table2->columnDescription(1), QString("Work")); + delete cell2; + delete cell1; + + treeView->expandAll(); + + QTest::qWait(1); // Need this for indexOfchild to work. +#if defined(Q_WS_X11) + qt_x11_wait_for_window_manager(treeView); + QTest::qWait(100); +#endif + + QCOMPARE(table2->columnCount(), 2); + QCOMPARE(table2->rowCount(), 5); + cell1 = table2->cellAt(1,0); + QCOMPARE(cell1->text(QAccessible::Name, 0), QString("Picasso")); + QCOMPARE(iface->indexOfChild(cell1), 5); // 1 based + 2 header + 2 for root item + + cell2 = table2->cellAt(4,0); + QCOMPARE(cell2->text(QAccessible::Name, 0), QString("Klimt")); + QCOMPARE(cell2->role(0), QAccessible::TreeItem); + QCOMPARE(cell2->rowIndex(), 4); + QCOMPARE(cell2->columnIndex(), 0); + QVERIFY(!cell2->isExpandable()); + QCOMPARE(iface->indexOfChild(cell2), 11); + + QCOMPARE(table2->columnDescription(0), QString("Artist")); + QCOMPARE(table2->columnDescription(1), QString("Work")); + + delete iface; + QTestAccessibility::clearEvents(); +#endif +} + + +void tst_QAccessibility::table2TableTest() +{ +#if !defined(Q_WS_X11) + QSKIP( "Accessible table2 interface is currently only supported on X11.", SkipAll); +#else + QTableWidget *tableView = new QTableWidget(3, 3); + tableView->setColumnCount(3); + QStringList hHeader; + hHeader << "h1" << "h2" << "h3"; + tableView->setHorizontalHeaderLabels(hHeader); + + QStringList vHeader; + vHeader << "v1" << "v2" << "v3"; + tableView->setVerticalHeaderLabels(vHeader); + + for (int i = 0; i<9; ++i) { + QTableWidgetItem *item = new QTableWidgetItem; + item->setText(QString::number(i/3) + QString(".") + QString::number(i%3)); + tableView->setItem(i/3, i%3, item); + } + + tableView->resize(600,600); + tableView->show(); + QTest::qWait(1); // Need this for indexOfchild to work. +#if defined(Q_WS_X11) + qt_x11_wait_for_window_manager(tableView); + QTest::qWait(100); +#endif + + QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(tableView); + QEXPECT_FAIL("", "Implement Sibling navigation for table2 cells.", Continue); + QCOMPARE(verifyHierarchy(iface), 0); + + QCOMPARE((int)iface->role(0), (int)QAccessible::Table); + // header and 2 rows (the others are not expanded, thus not visible) + QCOMPARE(iface->childCount(), 9+3+3+1); // cell+headers+topleft button + + QAccessibleInterface *cornerButton = 0; + QCOMPARE(iface->navigate(QAccessible::Child, 1, &cornerButton), 0); + QVERIFY(cornerButton); + QCOMPARE(iface->indexOfChild(cornerButton), 1); + QCOMPARE(cornerButton->role(0), QAccessible::Pane); + delete cornerButton; + + QAccessibleInterface *child1 = 0; + QCOMPARE(iface->navigate(QAccessible::Child, 3, &child1), 0); + QVERIFY(child1); + QCOMPARE(iface->indexOfChild(child1), 3); + QCOMPARE(child1->text(QAccessible::Name, 0), QString("h2")); + QCOMPARE(child1->role(0), QAccessible::ColumnHeader); + QVERIFY(!(child1->state(0) & QAccessible::Expanded)); + delete child1; + + QAccessibleInterface *child2 = 0; + QCOMPARE(iface->navigate(QAccessible::Child, 11, &child2), 0); + QVERIFY(child2); + QCOMPARE(iface->indexOfChild(child2), 11); + QCOMPARE(child2->text(QAccessible::Name, 0), QString("1.1")); + QAccessibleTable2CellInterface *cell2Iface = static_cast<QAccessibleTable2CellInterface*>(child2); + QCOMPARE(cell2Iface->rowIndex(), 1); + QCOMPARE(cell2Iface->columnIndex(), 1); + delete child2; + + QAccessibleInterface *child3 = 0; + QCOMPARE(iface->navigate(QAccessible::Child, 12, &child3), 0); + QCOMPARE(iface->indexOfChild(child3), 12); + QCOMPARE(child3->text(QAccessible::Name, 0), QString("1.2")); + delete child3; + + QTestAccessibility::clearEvents(); + + // table 2 + QAccessibleTable2Interface *table2 = iface->table2Interface(); + QVERIFY(table2); + QCOMPARE(table2->columnCount(), 3); + QCOMPARE(table2->rowCount(), 3); + QAccessibleTable2CellInterface *cell1; + QVERIFY(cell1 = table2->cellAt(0,0)); + QCOMPARE(cell1->text(QAccessible::Name, 0), QString("0.0")); + QCOMPARE(iface->indexOfChild(cell1), 6); + + QAccessibleTable2CellInterface *cell2; + QVERIFY(cell2 = table2->cellAt(0,1)); + QCOMPARE(cell2->text(QAccessible::Name, 0), QString("0.1")); + QCOMPARE(cell2->role(0), QAccessible::Cell); + QCOMPARE(cell2->rowIndex(), 0); + QCOMPARE(cell2->columnIndex(), 1); + QCOMPARE(iface->indexOfChild(cell2), 7); + delete cell2; + + QAccessibleTable2CellInterface *cell3; + QVERIFY(cell3 = table2->cellAt(1,2)); + QCOMPARE(cell3->text(QAccessible::Name, 0), QString("1.2")); + QCOMPARE(cell3->role(0), QAccessible::Cell); + QCOMPARE(cell3->rowIndex(), 1); + QCOMPARE(cell3->columnIndex(), 2); + QCOMPARE(iface->indexOfChild(cell3), 12); + delete cell3; + + QCOMPARE(table2->columnDescription(0), QString("h1")); + QCOMPARE(table2->columnDescription(1), QString("h2")); + QCOMPARE(table2->columnDescription(2), QString("h3")); + QCOMPARE(table2->rowDescription(0), QString("v1")); + QCOMPARE(table2->rowDescription(1), QString("v2")); + QCOMPARE(table2->rowDescription(2), QString("v3")); + + delete iface; + + delete tableView; + + QTestAccessibility::clearEvents(); +#endif } void tst_QAccessibility::calendarWidgetTest() @@ -3980,6 +4330,9 @@ void tst_QAccessibility::comboBoxTest() void tst_QAccessibility::treeWidgetTest() { +#if defined(Q_WS_X11) + QSKIP( "Accessible table1 interface is no longer supported on X11.", SkipAll); +#else QWidget *w = new QWidget; QTreeWidget *tree = new QTreeWidget(w); QHBoxLayout *l = new QHBoxLayout(w); @@ -4037,6 +4390,7 @@ void tst_QAccessibility::treeWidgetTest() delete w; QTestAccessibility::clearEvents(); +#endif } void tst_QAccessibility::labelTest() diff --git a/tests/auto/qpainterpath/tst_qpainterpath.cpp b/tests/auto/qpainterpath/tst_qpainterpath.cpp index 3941a11..33315ad 100644 --- a/tests/auto/qpainterpath/tst_qpainterpath.cpp +++ b/tests/auto/qpainterpath/tst_qpainterpath.cpp @@ -114,6 +114,8 @@ private slots: void connectPathMoveTo(); void translate(); + + void lineWithinBounds(); }; // Testing get/set functions @@ -1306,6 +1308,25 @@ void tst_QPainterPath::translate() QCOMPARE(complexPath.translated(-offset), untranslatedComplexPath); } + +void tst_QPainterPath::lineWithinBounds() +{ + const int iteration_count = 3; + volatile const qreal yVal = 0.5; + QPointF a(0.0, yVal); + QPointF b(1000.0, yVal); + QPointF c(2000.0, yVal); + QPointF d(3000.0, yVal); + QPainterPath path; + path.moveTo(QPointF(0, yVal)); + path.cubicTo(QPointF(1000.0, yVal), QPointF(2000.0, yVal), QPointF(3000.0, yVal)); + for(int i=0; i<=iteration_count; i++) { + qreal actual = path.pointAtPercent(qreal(i) / iteration_count).y(); + QVERIFY(actual == yVal); // don't use QCOMPARE, don't want fuzzy comparison + } +} + + QTEST_APPLESS_MAIN(tst_QPainterPath) #include "tst_qpainterpath.moc" diff --git a/tools/qvfb/qvfb.pro b/tools/qvfb/qvfb.pro index c101d00..29ce202 100644 --- a/tools/qvfb/qvfb.pro +++ b/tools/qvfb/qvfb.pro @@ -8,9 +8,6 @@ DESTDIR = ../../bin target.path=$$[QT_INSTALL_BINS] INSTALLS += target -DEPENDPATH = ../../include -INCLUDEPATH += ../../src/gui/embedded - FORMS = config.ui HEADERS = qvfb.h \ qvfbview.h \ @@ -19,10 +16,7 @@ HEADERS = qvfb.h \ gammaview.h \ qvfbprotocol.h \ qvfbshmem.h \ - qvfbmmap.h \ - ../../src/gui/embedded/qvfbhdr.h \ - ../../src/gui/embedded/qlock_p.h \ - ../../src/gui/embedded/qwssignalhandler_p.h + qvfbmmap.h SOURCES = qvfb.cpp \ qvfbview.cpp \ @@ -31,9 +25,7 @@ SOURCES = qvfb.cpp \ qanimationwriter.cpp \ qvfbprotocol.cpp \ qvfbshmem.cpp \ - qvfbmmap.cpp \ - ../../src/gui/embedded/qlock.cpp \ - ../../src/gui/embedded/qwssignalhandler.cpp + qvfbmmap.cpp include(../shared/deviceskin/deviceskin.pri) diff --git a/tools/qvfb/qvfbmmap.cpp b/tools/qvfb/qvfbmmap.cpp index 7e80e37..01c1d9c 100644 --- a/tools/qvfb/qvfbmmap.cpp +++ b/tools/qvfb/qvfbmmap.cpp @@ -48,9 +48,7 @@ #include <unistd.h> #include <sys/ipc.h> #include <sys/types.h> -#include <sys/shm.h> #include <sys/stat.h> -#include <sys/sem.h> #include <sys/mman.h> #include <fcntl.h> #include <errno.h> diff --git a/tools/qvfb/qvfbshmem.cpp b/tools/qvfb/qvfbshmem.cpp index a03b25d..c17a680 100644 --- a/tools/qvfb/qvfbshmem.cpp +++ b/tools/qvfb/qvfbshmem.cpp @@ -39,10 +39,9 @@ ** ****************************************************************************/ -#include "qlock_p.h" - #include "qvfbshmem.h" -#include "qvfbhdr.h" +#include <qvfbhdr.h> +#include <private/qlock_p.h> #include <QFile> #include <QTimer> @@ -53,8 +52,6 @@ #include <sys/types.h> #include <sys/shm.h> #include <sys/stat.h> -#include <sys/sem.h> -#include <sys/mman.h> #include <fcntl.h> #include <errno.h> #include <math.h> @@ -69,27 +66,40 @@ QT_BEGIN_NAMESPACE // live. static QString qws_dataDir(int qws_display_id) { - QByteArray dataDir = QT_VFB_DATADIR(qws_display_id).toLocal8Bit(); - if (mkdir(dataDir, 0700)) { + static QString result; + if (!result.isEmpty()) + return result; + result = QT_VFB_DATADIR(qws_display_id); + QByteArray dataDir = result.toLocal8Bit(); + +#if defined(Q_OS_INTEGRITY) + /* ensure filesystem is ready before starting requests */ + WaitForFileSystemInitialization(); +#endif + + if (QT_MKDIR(dataDir, 0700)) { if (errno != EEXIST) { qFatal("Cannot create Qt for Embedded Linux data directory: %s", dataDir.constData()); } } - struct stat buf; - if (lstat(dataDir, &buf)) + QT_STATBUF buf; + if (QT_LSTAT(dataDir, &buf)) qFatal("stat failed for Qt for Embedded Linux data directory: %s", dataDir.constData()); if (!S_ISDIR(buf.st_mode)) qFatal("%s is not a directory", dataDir.constData()); + +#if !defined(Q_OS_INTEGRITY) && !defined(Q_OS_VXWORKS) && !defined(Q_OS_QNX) if (buf.st_uid != getuid()) qFatal("Qt for Embedded Linux data directory is not owned by user %uh", getuid()); if ((buf.st_mode & 0677) != 0600) qFatal("Qt for Embedded Linux data directory has incorrect permissions: %s", dataDir.constData()); - dataDir += "/"; +#endif - return QString(dataDir); + result.append(QLatin1Char('/')); + return result; } @@ -130,20 +140,10 @@ QShMemViewProtocol::QShMemViewProtocol(int displayid, const QSize &s, qws_dataDir(displayid); - QString oldPipe = "/tmp/qtembedded-" + username + "/" + QString("QtEmbedded-%1").arg(displayid); - int oldPipeSemkey = ftok(oldPipe.toLatin1().constData(), 'd'); - if (oldPipeSemkey != -1) { - int oldPipeLockId = semget(oldPipeSemkey, 0, 0); - if (oldPipeLockId >= 0){ - sembuf sops; - sops.sem_num = 0; - sops.sem_op = 1; - sops.sem_flg = SEM_UNDO; - int rv; - do { - rv = semop(lockId,&sops,1); - } while (rv == -1 && errno == EINTR); - + { + QString oldPipe = "/tmp/qtembedded-" + username + "/" + QString("QtEmbedded-%1").arg(displayid); + QLock oldPipeLock(oldPipe, 'd', false); + if (oldPipeLock.isValid()) { perror("QShMemViewProtocol::QShMemViewProtocol"); qFatal("Cannot create lock file as an old version of QVFb has " "opened %s. Close other QVFb and try again", diff --git a/tools/qvfb/qvfbview.cpp b/tools/qvfb/qvfbview.cpp index 3f13ecc..91c5380 100644 --- a/tools/qvfb/qvfbview.cpp +++ b/tools/qvfb/qvfbview.cpp @@ -61,12 +61,7 @@ #include <stdlib.h> #include <unistd.h> -#include <sys/ipc.h> #include <sys/types.h> -#include <sys/shm.h> -#include <sys/stat.h> -#include <sys/sem.h> -#include <fcntl.h> #include <errno.h> #include <math.h> |