From 618293517861b69334cd470068199394120cd20a Mon Sep 17 00:00:00 2001
From: xue <>
Date: Fri, 30 Jun 2006 18:41:56 +0000
Subject: Merge from 3.0 branch till 1218.
---
.gitattributes | 2 +
HISTORY | 2 +
build.xml | 27 ++-
buildscripts/classtree/DWExtension.php | 255 +++++++++++++++++++++++++++
buildscripts/classtree/DWExtensionReadme.txt | 22 +++
buildscripts/classtree/build.php | 93 ++++++++--
buildscripts/texbuilder/pages.php | 1 +
framework/Caching/TMemCache.php | 2 +-
framework/Caching/TSqliteCache.php | 2 +-
framework/Exceptions/TErrorHandler.php | 2 +-
framework/Exceptions/messages.txt | 4 +-
framework/Web/THttpSession.php | 2 +-
framework/Web/UI/TTemplateManager.php | 6 +-
framework/Web/UI/TThemeManager.php | 10 +-
framework/Web/UI/WebControls/TDataGrid.php | 19 +-
index.html | 68 +++----
16 files changed, 455 insertions(+), 62 deletions(-)
create mode 100644 buildscripts/classtree/DWExtension.php
create mode 100644 buildscripts/classtree/DWExtensionReadme.txt
diff --git a/.gitattributes b/.gitattributes
index 487302b1..04b42000 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -310,6 +310,8 @@ buildscripts/PhpDocumentor/user/error.ini -text
buildscripts/PhpDocumentor/user/pear-makedocs.ini -text
buildscripts/PhpDocumentor/user/prado.ini -text
buildscripts/PhpDocumentor/user/testdocbook.ini -text
+buildscripts/classtree/DWExtension.php -text
+buildscripts/classtree/DWExtensionReadme.txt -text
buildscripts/classtree/build.php -text
buildscripts/index/api_index.php -text
buildscripts/index/build.php -text
diff --git a/HISTORY b/HISTORY
index f1fca4fa..e3d35ac6 100644
--- a/HISTORY
+++ b/HISTORY
@@ -18,6 +18,7 @@ BUG: Ticket#234 - Postback target could be out of date (Qiang)
BUG: Ticket#239 - Ondeactivate handler for the first View of MultiView is always fired (Qiang)
BUG: Ticket#244 - redirect() needs absolute URL (Qiang)
BUG: Ticket#245 - getIsSecureConnection() is not working correctly (Qiang)
+BUG: Ticket#260 - Wrong value of a configuration option in setUseTransparentSessionID (Qiang)
CHG: ensureChildControls() is now invoked in TControl::initRecursive (Qiang)
CHG: Postback enabled control will always disable default client-side browser action. (Qiang)
CHG: CSS and JS files in a theme are now included in page in alphabetic order (Qiang)
@@ -32,6 +33,7 @@ ENH: Added TPageService.BasePageClass property (Qiang)
ENH: Added TDataGrid.EmptyTemplate property (Qiang)
ENH: Added paging feature to all TDataBoundControl-derived controls (Qiang)
NEW: Added TPager (Qiang)
+NEW: Added Dreamweaver taglib extension (Stanislav, Qiang)
Version 3.0.1 June 4, 2006
==========================
diff --git a/build.xml b/build.xml
index 7441e63a..ad468d0a 100644
--- a/build.xml
+++ b/build.xml
@@ -132,6 +132,8 @@
+
+
Changing file permissions...
@@ -221,7 +223,30 @@
-
+
+
+
+
+
+ Distribution Not Completed Yet!!!
+
+The following steps need to be manually performed in order to complete
+the PRADO distribution:
+
+1. Package DreamWeaver extension by running DW extension manager with
+ buildscripts/classtree/PRADO.mxi and saving the generated file as
+ "${build.src.dir}/editors/Dreamweaver/PRADO.mxp"
+
+2. If building on Linux, the CHM doc file needs to be generated by compiling
+ "${build.doc.dir}/manual/CHMdefaultConverter/phpdoc.hhp"
+ and saving the generated file as
+ "${build.src.dir}/docs/manual.chm"
+
+3. Use winzip (on Windows) and gzip (on Linux) to generate the compressed
+ release files of the direcotry
+ "${build.src.dir}".
+
+
diff --git a/buildscripts/classtree/DWExtension.php b/buildscripts/classtree/DWExtension.php
new file mode 100644
index 00000000..f85f100d
--- /dev/null
+++ b/buildscripts/classtree/DWExtension.php
@@ -0,0 +1,255 @@
+
+ * @author Qiang Xue
+ */
+class PradoVTMDocument
+{
+ private $_document;
+ private $_attributes;
+
+ public function __construct($controlName)
+ {
+ $this->_document = new DOMDocument('1.0', 'utf-8');
+ $this->prepareDocument($controlName);
+ }
+
+ protected function prepareDocument($controlName)
+ {
+ $this->_document->formatOutput = true;
+
+ //--- add
+ $tag = $this->_document->createElement('tag');
+ $tag->setAttribute('name',$controlName);
+ $tag->setAttribute('casesensitive','yes');
+ $this->_document->appendChild($tag);
+
+ //--- add
+ $tagFormat = $this->_document->createElement('tagformat');
+ $tagFormat->setAttribute('nlbeforetag','1');
+ $tagFormat->setAttribute('nlaftertag','1');
+ $tagFormat->setAttribute('indentcontents','yes');
+ $tag->appendChild($tagFormat);
+
+ //--- add
+ //$tagDialog = $this->_document->createElement('tagdialog');
+ //$tagDialog->setAttribute('file',$controlName.'.htm');
+ //$tag->appendChild($tagDialog);
+
+ $this->_attributes = $this->_document->createElement('attributes');
+ $tag->appendChild($this->_attributes);
+ }
+
+ public function getDocument()
+ {
+ return $this->_document;
+ }
+
+ public function addAttribute($attribName, $attribType)
+ {
+ //--- add
+ $attrib = $this->_document->createElement('attrib');
+ $attrib->setAttribute('name',$attribName);
+ if (is_array($attribType))
+ {
+ $attrib->setAttribute('type','Enumerated');
+ foreach ($attribType as $value)
+ {
+ $option = $this->_document->createElement('attriboption');
+ $option->setAttribute('value',$value);
+ $option->setAttribute('caption','');
+ $attrib->appendChild($option);
+ }
+ }
+ else if($attribType!=='')
+ {
+ $attrib->setAttribute('type',$attribType);
+ }
+ $attrib->setAttribute('casesensitive','yes');
+ $this->_attributes->appendChild($attrib);
+ }
+
+ public function addEvent($eventName)
+ {
+ //--- add
+ $this->addAttribute($eventName,'');
+ //--- add
+ $event = $this->_document->createElement('event');
+ $event->setAttribute('name',$eventName);
+ $this->_attributes->appendChild($event);
+ }
+
+ public function getXML()
+ {
+ return $this->_document->saveXML();
+ }
+}
+
+/**
+ * PradoMXIDocument class
+ *
+ * @author Stanislav Yordanov
+ * @author Qiang Xue
+ */
+class PradoMXIDocument
+{
+ private $_tagLibraryElement;
+ private $_filesElement;
+ private $_document;
+
+ public function __construct($version)
+ {
+ $this->_document = new DOMDocument('1.0', 'utf-8');
+ $this->prepareDocument($version);
+ }
+
+ protected function prepareDocument($version)
+ {
+ $this->_document->formatOutput = true;
+ //--- add root element
+ $rootElement = $this->_document->createElement('macromedia-extension');
+ $rootElement->setAttribute('name','PRADO Taglib');
+ $rootElement->setAttribute('version',$version);
+ $rootElement->setAttribute('type','Suite');
+ $rootElement->setAttribute('requires-restart','true');
+ $this->_document->appendChild($rootElement);
+ //--- add
+ $element = $this->_document->createElement('author');
+ $element->setAttribute('name','Stanislav Yordanov, Qiang Xue');
+ $rootElement->appendChild($element);
+ $time = date('F j, Y, h:i:s a',time());
+ //--- add
+ $description = << and Qiang Xue
+Time: $time
+Requirement: Macromedia Dreamweaver MX/MX 2004/8.0 or above
+Description: This suite adds PRADO tag library. The tag library contains PRADO component
+tags, properties and events that are commonly used on PRADO templates.
+EOD;
+ $element = $this->_document->createElement('description');
+ $element->appendChild($this->_document->createCDATASection($description));
+ $rootElement->appendChild($element);
+ //--- add
+ $productsElement = $this->_document->createElement('products');
+ $rootElement->appendChild($productsElement);
+ //--- add
+ $product = $this->_document->createElement('product');
+ $product->setAttribute('name','Dreamweaver');
+ $product->setAttribute('version','6');
+ $product->setAttribute('primary','false');
+ $productsElement->appendChild($product);
+ //--- add
+ $element = $this->_document->createElement('ui-access');
+ $element->appendChild($this->_document->createCDATASection("PRADO"));
+ $rootElement->appendChild($element);
+ //--- add
+ $this->_filesElement = $this->_document->createElement('files');
+ $rootElement->appendChild($this->_filesElement);
+ //--- add
+ $configChangeElement = $this->_document->createElement('configuration-changes');
+ $rootElement->appendChild($configChangeElement);
+ //--- add
+ $tagLibChangeElement = $this->_document->createElement('taglibrary-changes');
+ $configChangeElement->appendChild($tagLibChangeElement);
+ //--- add
+ $tagLibInsertElement = $this->_document->createElement('taglibrary-insert');
+ $tagLibChangeElement->appendChild($tagLibInsertElement);
+ //--- add
+ $this->_tagLibraryElement = $element = $this->_document->createElement('taglibrary');
+ $element->setAttribute('doctypes','HTML,DWTemplate');
+ $element->setAttribute('id','DWTagLibrary_PRADO_tags');
+ $element->setAttribute('name','PRADO tags');
+ $element->setAttribute('prefix','setAttribute('tagchooser','PRADO/TagChooser.xml');
+ $tagLibInsertElement->appendChild($element);
+
+ $element = $this->_document->createElement('file');
+ $element->setAttribute('name','Configuration/TagLibraries/PRADO/TagChooser.xml');
+ $element->setAttribute('destination','$dreamweaver/Configuration/TagLibraries/PRADO/TagChooser.xml');
+ $this->_filesElement->appendChild($element);
+ }
+
+ public function addTag($tagName)
+ {
+ $element = $this->_document->createElement('file');
+ $element->setAttribute('name','Configuration/TagLibraries/PRADO/'.$tagName.'.vtm');
+ $element->setAttribute('destination','$dreamweaver/Configuration/TagLibraries/PRADO/'.$tagName.'.vtm');
+ $this->_filesElement->appendChild($element);
+
+ $element = $this->_document->createElement('tagref');
+ $element->setAttribute('file','PRADO/'.$tagName.'.vtm');
+ $element->setAttribute('name',$tagName);
+ $this->_tagLibraryElement->appendChild($element);
+ }
+
+ public function getDocument()
+ {
+ return $this->_document;
+ }
+
+ public function getXML()
+ {
+ return $this->_document->saveXML();
+ }
+}
+
+/**
+ * PradoTagChooser class
+ *
+ * @author Stanislav Yordanov
+ * @author Qiang Xue
+ */
+class PradoTagChooser
+{
+ private $_document;
+ private $_tclibrary;
+ private $_category;
+
+ public function __construct()
+ {
+ $this->_document = new DOMDocument('1.0', 'utf-8');
+ $this->prepareDocument();
+ }
+
+ protected function prepareDocument()
+ {
+ $this->_document->standalone = true;
+ $this->_document->formatOutput = true;
+ $tclibrary = $this->_document->createElement('tclibrary');
+ $tclibrary->setAttribute('name','PRADO tags');
+ $tclibrary->setAttribute('desc','A collection of all PRADO tags.');
+ $tclibrary->setAttribute('reference','PRADO');
+ $this->_document->appendChild($tclibrary);
+
+ $this->_category = $this->_document->createElement('category');
+ $this->_category->setAttribute('name','General');
+ $this->_category->setAttribute('icon','Configuration/TagLibraries/Icons/Elements.gif');
+ $tclibrary->appendChild($this->_category);
+ }
+
+ public function addElement($elementName)
+ {
+ $element = $this->_document->createElement('element');
+ $element->setAttribute('name','com:'.$elementName);
+ $element->setAttribute('value','');
+ $element->setAttribute('reference','PRADO,COM:'.strtoupper($elementName));
+ $this->_category->appendChild($element);
+ }
+
+ public function getXML()
+ {
+ $this->_document->normalize();
+ /*
+ $resultXML = $this->_document->saveXML();
+ $resultXML = str_replace('>','>',$resultXML);
+ $resultXML = str_replace('<','<',$resultXML);
+ return $resultXML;
+ */
+ return $this->_document->saveXML();
+ }
+}
+?>
\ No newline at end of file
diff --git a/buildscripts/classtree/DWExtensionReadme.txt b/buildscripts/classtree/DWExtensionReadme.txt
new file mode 100644
index 00000000..e273abd6
--- /dev/null
+++ b/buildscripts/classtree/DWExtensionReadme.txt
@@ -0,0 +1,22 @@
+This directory contains the Macromedia Dreamweaver Extension for PRADO.
+
+This PRADO extension contains a tag library that enables Dreamweaver to
+auto-complete PRADO component tags when you use it to edit PRADO templates.
+
+Before installation, make sure you have uninstalled any older versions
+of the PRADO extension.
+
+To install this extension, run Dreamweaver's extension manager program and
+select the file PRADO.mxp to install.
+
+After installation, restart Dreamweaver. Open a new HTML document and start typing
+in PRADO component tags. You will see as you are typing, a dropdown list may
+pop up which contains the available component names, properties and events.
+Some property types are also handled.
+
+This extension is tested with Dreamweaver 2004 MX. Please let me know if you find it
+working on other versions.
+
+Enjoy!
+
+Qiang
diff --git a/buildscripts/classtree/build.php b/buildscripts/classtree/build.php
index bc95d1c8..d7f74828 100644
--- a/buildscripts/classtree/build.php
+++ b/buildscripts/classtree/build.php
@@ -1,7 +1,10 @@
buildTree();
-$a->saveToFile('classes.data');
+$a->saveToFile($basePath.'/classes.data');
+$a->saveAsDWExtension($basePath);
class ClassTreeBuilder
{
const REGEX_RULES='/^\s*(abstract\s+)?class\s+(\w+)(\s+extends\s+(\w+)\s*|\s*)/msS';
- private $_basePath;
+ private $_frameworkPath;
private $_exclusions;
private $_classes=array();
- public function __construct($basePath,$exclusions)
+ public function __construct($frameworkPath,$exclusions)
{
- $this->_basePath=realpath($basePath);
+ $this->_frameworkPath=realpath($frameworkPath);
$this->_exclusions=array();
foreach($exclusions as $exclusion)
{
if($exclusion[0]==='/')
- $this->_exclusions[realpath($basePath.'/'.$exclusion)]=true;
+ $this->_exclusions[realpath($frameworkPath.'/'.$exclusion)]=true;
else
$this->_exclusions[$exclusion]=true;
}
@@ -37,7 +41,7 @@ class ClassTreeBuilder
public function buildTree()
{
- $sourceFiles=$this->getSourceFiles($this->_basePath);
+ $sourceFiles=$this->getSourceFiles($this->_frameworkPath);
foreach($sourceFiles as $sourceFile)
$this->parseFile($sourceFile);
ksort($this->_classes);
@@ -73,7 +77,7 @@ class ClassTreeBuilder
protected function parseFile($sourceFile)
{
include_once($sourceFile);
- $classFile=strtr(substr($sourceFile,strlen($this->_basePath)),'\\','/');
+ $classFile=strtr(substr($sourceFile,strlen($this->_frameworkPath)),'\\','/');
echo "Parsing $classFile...\n";
$content=file_get_contents($sourceFile);
if(preg_match('/@package\s+([\w\.]+)\s*/msS',$content,$matches)>0)
@@ -175,8 +179,75 @@ class ClassTreeBuilder
return $files;
}
- public function saveAsTagLib($fileName)
+ public function saveAsDWExtension($basePath)
+ {
+ $tagPath=$basePath.'/Configuration/TagLibraries/PRADO';
+
+ // prepare the directory to save tag lib
+ @mkdir($basePath.'/Configuration');
+ @mkdir($basePath.'/Configuration/TagLibraries');
+ @mkdir($basePath.'/Configuration/TagLibraries/PRADO');
+
+ $docMXI = new PradoMXIDocument(Prado::getVersion());
+ $tagChooser = new PradoTagChooser;
+
+ $controlClass = new ReflectionClass('TControl');
+
+ foreach($this->_classes as $className=>$classInfo)
+ {
+ $class = new ReflectionClass($className);
+ if($class->isInstantiable() && ($className==='TControl' || $class->isSubclassOf($controlClass)))
+ {
+ $docMXI->addTag($className);
+ $tagChooser->addElement($className);
+ $docVTM = new PradoVTMDocument($className);
+ foreach($classInfo['Properties'] as $name=>$property)
+ {
+ $type=$property['type'];
+ if(isset($this->_classes[$type]) && ($type==='TFont' || strrpos($type,'Style')===strlen($type)-5 && $type!=='TStyle'))
+ $this->processObjectType($type,$this->_classes[$type],$name,$docVTM);
+ if($property['readonly'] || $property['protected'])
+ continue;
+ if(($type=$this->checkType($className,$name,$property['type']))!=='')
+ $docVTM->addAttribute($name,$type);
+ }
+ foreach($classInfo['Events'] as $name=>$event)
+ {
+ $docVTM->addEvent($name);
+ }
+ file_put_contents($tagPath.'/'.$className.'.vtm',$docVTM->getXML());
+ }
+ }
+
+ file_put_contents($basePath.'/PRADO.mxi',$docMXI->getXML());
+ file_put_contents($tagPath.'/TagChooser.xml',$tagChooser->getXML());
+
+ }
+
+ private function processObjectType($objectType,$objectInfo,$prefix,$doc)
+ {
+ foreach($objectInfo['Properties'] as $name=>$property)
+ {
+ if($property['type']==='TFont')
+ $this->processObjectType('TFont',$this->_classes['TFont'],$prefix.'.'.$name,$doc);
+ if($property['readonly'] || $property['protected'])
+ continue;
+ if(($type=$this->checkType($objectType,$name,$property['type']))!=='')
+ $doc->addAttribute($prefix.'.'.$name,$type);
+ }
+ }
+
+ private function checkType($className,$propertyName,$type)
{
+ if(strrpos($propertyName,'Color')===strlen($propertyName)-5)
+ return 'color';
+ if($propertyName==='Style')
+ return 'style';
+ if($type==='boolean')
+ return array('true','false');
+ if($type==='string' || $type==='integer' || $type==='ITemplate')
+ return 'text';
+ return '';
}
}
diff --git a/buildscripts/texbuilder/pages.php b/buildscripts/texbuilder/pages.php
index ec6e0155..f49d15fd 100644
--- a/buildscripts/texbuilder/pages.php
+++ b/buildscripts/texbuilder/pages.php
@@ -50,6 +50,7 @@ $pages['Control Reference : Standard Controls'] = array(
'Controls/LinkButton.page',
'Controls/Literal.page',
'Controls/MultiView.page',
+ 'Controls/Pager.page',
'Controls/Panel.page',
'Controls/PlaceHolder.page',
'Controls/RadioButton.page',
diff --git a/framework/Caching/TMemCache.php b/framework/Caching/TMemCache.php
index dd229312..bd1ae189 100644
--- a/framework/Caching/TMemCache.php
+++ b/framework/Caching/TMemCache.php
@@ -53,7 +53,7 @@
*
* TMemCache may be configured in application configuration file as follows
*
- *
+ *
*
* where {@link getHost Host} and {@link getPort Port} are configurable properties
* of TMemCache.
diff --git a/framework/Caching/TSqliteCache.php b/framework/Caching/TSqliteCache.php
index dc4bf13f..b94b39fe 100644
--- a/framework/Caching/TSqliteCache.php
+++ b/framework/Caching/TSqliteCache.php
@@ -55,7 +55,7 @@
*
* TSqliteCache may be configured in application configuration file as follows
*
- *
+ *
*
* where {@link getDbFile DbFile} is a property specifying the location of the
* SQLite DB file (in the namespace format).
diff --git a/framework/Exceptions/TErrorHandler.php b/framework/Exceptions/TErrorHandler.php
index 25f421e3..e18de7ab 100644
--- a/framework/Exceptions/TErrorHandler.php
+++ b/framework/Exceptions/TErrorHandler.php
@@ -42,7 +42,7 @@
* by the application object to handle errors.
*
* TErrorHandler may be configured in application configuration file as follows
- *
+ *
*
* @author Qiang Xue
* @version $Revision: $ $Date: $
diff --git a/framework/Exceptions/messages.txt b/framework/Exceptions/messages.txt
index 38541fed..22b28a42 100644
--- a/framework/Exceptions/messages.txt
+++ b/framework/Exceptions/messages.txt
@@ -144,7 +144,9 @@ authmanager_usermanager_invalid = TAuthManager.UserManager '{0}' does not refe
authmanager_usermanager_unchangeable = TAuthManager.UserManager cannot be modified after the module is initialized.
authmanager_session_required = TAuthManager requires a session application module.
-thememanager_basepath_invalid = TThemeManager.BasePath '{0}' is not a valid directory.
+thememanager_service_unavailable = TThemeManager requires TPageService to be available. This error often occurs when you configure TThemeManager outside of the page service configuration.
+thememanager_basepath_invalid = TThemeManager.BasePath '{0}' is not a valid path alias. Make sure you have defined this alias in configuration and it points to a valid directory.
+thememanager_basepath_invalid2 = TThemeManager.BasePath '{0}' is not a valid directory.
thememanager_basepath_unchangeable = TThemeManager.BasePath cannot be modified after the module is initialized.
theme_baseurl_required = TThemeManager.BasePath is required. By default, a directory named 'themes' under the directory containing the application entry script is assumed.
diff --git a/framework/Web/THttpSession.php b/framework/Web/THttpSession.php
index f95cb72d..4439cf57 100644
--- a/framework/Web/THttpSession.php
+++ b/framework/Web/THttpSession.php
@@ -376,7 +376,7 @@ class THttpSession extends TApplicationComponent implements IteratorAggregate,Ar
if($this->_started)
throw new TInvalidOperationException('httpsession_transid_unchangeable');
else
- ini_set('session.use_only_cookies',TPropertyValue::ensureBoolean($value)?'1':'0');
+ ini_set('session.use_trans_sid',TPropertyValue::ensureBoolean($value)?'1':'0');
}
/**
diff --git a/framework/Web/UI/TTemplateManager.php b/framework/Web/UI/TTemplateManager.php
index caa1dcbc..c13b5a9d 100644
--- a/framework/Web/UI/TTemplateManager.php
+++ b/framework/Web/UI/TTemplateManager.php
@@ -680,7 +680,7 @@ class TTemplate extends TApplicationComponent implements ITemplate
if($matchStart>$textStart)
{
$value=substr($input,$textStart,$matchStart-$textStart);
- if(strrpos($prop,'template')===strlen($prop)-8)
+ if(substr($prop,-8,8)==='template')
$value=$this->parseTemplateProperty($value,$textStart);
else
$value=$this->parseAttribute($value);
@@ -701,7 +701,7 @@ class TTemplate extends TApplicationComponent implements ITemplate
}
else if(strpos($str,'')===strlen($str)-4) // template comments
+ if(substr($str,-4,4)==='--!>') // template comments
{
if($expectPropEnd)
throw new TConfigurationException('template_comments_forbidden');
@@ -799,7 +799,7 @@ class TTemplate extends TApplicationComponent implements ITemplate
if(isset($attributes[$name]))
throw new TConfigurationException('template_property_duplicated',$name);
$value=$match[2][0];
- if(strrpos($name,'template')===strlen($name)-8)
+ if(substr($name,-8,8)==='template')
{
if($value[0]==='\'' || $value[0]==='"')
$attributes[$name]=$this->parseTemplateProperty(substr($value,1,strlen($value)-2),$match[2][1]+1);
diff --git a/framework/Web/UI/TThemeManager.php b/framework/Web/UI/TThemeManager.php
index 66bfa8be..245f8049 100644
--- a/framework/Web/UI/TThemeManager.php
+++ b/framework/Web/UI/TThemeManager.php
@@ -10,6 +10,8 @@
* @package System.Web.UI
*/
+Prado::using('System.Web.Services.TPageService');
+
/**
* TThemeManager class
*
@@ -63,7 +65,11 @@ class TThemeManager extends TModule
public function init($config)
{
$this->_initialized=true;
- $this->getService()->setThemeManager($this);
+ $service=$this->getService();
+ if($service instanceof TPageService)
+ $service->setThemeManager($this);
+ else
+ throw new TConfigurationException('thememanager_service_unavailable');
}
/**
@@ -105,7 +111,7 @@ class TThemeManager extends TModule
{
$this->_basePath=dirname($this->getRequest()->getApplicationFilePath()).'/'.self::DEFAULT_BASEPATH;
if(($basePath=realpath($this->_basePath))===false || !is_dir($basePath))
- throw new TConfigurationException('thememanager_basepath_invalid',$this->_basePath);
+ throw new TConfigurationException('thememanager_basepath_invalid2',$this->_basePath);
$this->_basePath=$basePath;
}
return $this->_basePath;
diff --git a/framework/Web/UI/WebControls/TDataGrid.php b/framework/Web/UI/WebControls/TDataGrid.php
index f811edaf..fead5344 100644
--- a/framework/Web/UI/WebControls/TDataGrid.php
+++ b/framework/Web/UI/WebControls/TDataGrid.php
@@ -954,9 +954,7 @@ class TDataGrid extends TBaseDataList implements INamingContainer
{
foreach($columns as $column)
$column->initialize();
- if($allowPaging)
- $this->_topPager=$this->createPager();
- $this->_header=$this->createItemInternal(-1,-1,self::IT_HEADER,true,null,$columns);
+
$selectedIndex=$this->getSelectedItemIndex();
$editIndex=$this->getEditItemIndex();
foreach($data as $key=>$row)
@@ -965,6 +963,12 @@ class TDataGrid extends TBaseDataList implements INamingContainer
$keys->add($this->getDataFieldValue($row,$keyField));
else
$keys->add($key);
+ if($index===0)
+ {
+ if($allowPaging)
+ $this->_topPager=$this->createPager();
+ $this->_header=$this->createItemInternal(-1,-1,self::IT_HEADER,true,null,$columns);
+ }
if($index===$editIndex)
$itemType=self::IT_EDITITEM;
else if($index===$selectedIndex)
@@ -977,9 +981,12 @@ class TDataGrid extends TBaseDataList implements INamingContainer
$index++;
$dsIndex++;
}
- $this->_footer=$this->createItemInternal(-1,-1,self::IT_FOOTER,true,null,$columns);
- if($allowPaging)
- $this->_bottomPager=$this->createPager();
+ if($index>0)
+ {
+ $this->_footer=$this->createItemInternal(-1,-1,self::IT_FOOTER,true,null,$columns);
+ if($allowPaging)
+ $this->_bottomPager=$this->createPager();
+ }
}
$this->setViewState('ItemCount',$index,0);
if(!$dsIndex && $this->_emptyTemplate!==null)
diff --git a/index.html b/index.html
index 133ca6f4..8e895f36 100644
--- a/index.html
+++ b/index.html
@@ -59,6 +59,13 @@ The installation is done! You will see the following subdirectories,
Personal Website (incomplete)
+Editor Support
+
+A Macromedia Dreamweaver extension can be found under editors/Dreamweaver.
+This extension contains a tag library that enables Dreamweaver to auto-complete
+PRADO component tags when you use it to edit PRADO templates.
+
+
Documentation
- API documentation
@@ -98,6 +105,7 @@ The installation is done! You will see the following subdirectories,
Special Credits To
- Stever for providing an Apple G3 notebook for testing safari browser issues.
+- Stanislav Yordanov - the script of generating Dreameweaver extension for PRADO
- All PRADO users - great suggestions, feedback and support
- ASP.NET 2.0 for its great inspiration and reference
- All third-party work used in PRADO
@@ -105,47 +113,39 @@ The installation is done! You will see the following subdirectories,
License
-PRADO is free software released under the terms of the following BSD license.
+
+The PRADO framework and the included demos are freeware. They are released under
+the terms of the following BSD License.
-Copyright © 2004-2006, PradoSoft (http://www.pradosoft.com)
+
+Copyright 2004-2006 by The PRADO Group (http://www.pradosoft.com)
All rights reserved.
-Redistribution and use in source and binary forms,
-with or without modification, are permitted provided
-that the following conditions are met:
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
-- Redistributions of source code must retain the above
- copyright notice, this list of conditions and the
- following disclaimer.
-
-- Redistributions in binary form must reproduce
- the above copyright notice, this list of conditions
- and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
-- Neither the name of the developer nor the names of
- its contributors may be used to endorse or promote
- products derived from this software without specific
- prior written permission.
+- Redistributions of source code must retain the above copyright notice, this
+list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation and/or
+other materials provided with the distribution.
+- Neither the name of the PRADO Group nor the names of its contributors may be
+used to endorse or promote products derived from this software without specific
+prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS
-AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
-THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
-THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.