Location: PHPKode > projects > WCL - Web Control Library for PHP > IControl/IControl.php
<?php
/*
 * 	(C) Copyright by Christian Möller
 * 	All Rights reserved
 *
 * 	This file is part of the WCL (Web Control Library).
 *
 *  WCL is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  Foobar is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with WCL.  If not, see <http://www.gnu.org/licenses/>.
 */



/*
 * Diese Klasse stellt ein IControl Objekt dar.
 * Die Struktur ist auf das Beschränkt, was sich
 * in jeder der Abgeleiteten Kindklassen befinden
 * sollte. Ein Großteil der Funktionalität eines
 * Abstrakten Steuerelements wird hier schon definiert,
 * und kann so bei der Erstellung eines eigenen 
 * Steuerelements, dass von IControl abgeleitet wurde,
 * genutzt werden. 
 * Diese Klasse sollte nicht direkt instanziert werden!
 */


class IControl {
	
	/*
	 * Hier werden die Eigenschaften des Abstrakten Objekts
	 * dargestellt, die fŸr jedes IControl Objekt bestehen.
	 */
	var	$name,
		$location = array(),
		$size = array(),
		$class_attrib,
		$style_attrib,
		$z_index,
		$controls = array(),
		$properties = array(),
		$_underlying_tag,
		$visible = true,
		$precode,
		$align,
		$parent = false;
	
	// Event Controller Structure
	var $event_controller;
	
	/*
	 * Konstruktor fŸr das Interface Control
	 */
	function IControl($name) {
		$this->event_controller = new EventController();
		$this->name = $name;
		$this->z_index = 1;
	}

	# REGION SETTER METHODS
	
	function setName($name) 	{ $this->name = name; }
	function setLocation($left, $top)	{ 
		if (!_eventmode()) $this->location["left"] = $left; 
		if (!_eventmode()) $this->location["top"] = $top; 
		_eventmode_add("style.position.left", $left);
		_eventmode_add("style.position.top", $top);
	}
	function setSize($width, $height)	{ 
		if (!_eventmode()) $this->size["width"] = $width; 
		if (!_eventmode()) $this->size["height"] = $height; 
		_eventmode_add("style.width", $width);
		_eventmode_add("style.height", $height);
	}
	function setWidth($width) {
		if (!_eventmode()) $this->size["width"] = $width;
		_eventmode_add("style.width", $width);
	}
	function setHeight($height) {
		if (!_eventmode()) $this->size["height"] = $height;
		_eventmode_add("style.height", $height);
	}
	function setAnchorLeft($object)	{
		$rsize = $object->getSize();
		$rlocation = $object->getLocation();
		$this->location["left"] = $rsize["width"] + $rlocation["left"];
		$this->location["top"] = $rlocation["top"];
	}
	function setCAttrib($attr)	{ 
		if (!_eventmode())$this->class_attrib = $attr; 
		_eventmode_add("className", '"'.$attr.'"');
	}
	function setSAttrib($attr) 	{ $this->style_attrib = $attr; }
	function setZIndex($index) 	{ 
		if (!_eventmode()) $this->z_index = $index; 
		_eventmode_add("style.zIndex", $index);
	}
	function setProp($k, $v="")	{ $this->properties[$k] = $v; }
	function setBaseTag($t)		{ $this->_underlying_tag = $t; }
	function setVisible()		{ 
		if (!_eventmode()) $this->visible = true; 
		_eventmode_add("style.display", "\"block\"");
	}
	function setInvisible()	{ 
		if (!_eventmode()) $this->visible = false; 
		_eventmode_add("style.display", "\"none\"");
	}
	function Dset_event($e, $d)	{ $this->event_controller->setEventHandler($e, $d); }
	function setEvent($script) {
		$this->precode .= $script->get_script();
		$this->event_controller->setEventHandler("javascript::".$script->get_eventname(), 
												 $script->get_calling());
	}
	function setVAlign($align) { $this->align = $align; }
	
	# REGION GETTER METHODS
	function getName()		 	{ 
		if (!_eventmode()) return $this->name; 
		else return $this->get_this().".id";
	}
	function getLocation()		{ 
		if (!_eventmode()) return $this->location; 
		else return $this->get_this().".style.position";
	}
	function getSize()			{ 
		if (!_eventmode()) return $this->size; 
		else return $this->get_this().".style.size";			// @TODO: style.size INVALID!
	}
	function getCAttrib()		{ 
		if (!_eventmode()) return $this->class_attrib; 
		else return $this->get_this().".class";
	}
	function getSAttrib()		{ 
		if (!_eventmode()) return $this->style_attrib;
		else return $this->get_this().".style";
	}
	function getZIndex()		{ 
		if (!_eventmode())return $this->z_index; 
		else return $this->get_this().".style.zIndex"; 
	}
	function getParent() 		{
		return $this->parent;
	}
	
	# REGION STATIC GETTER METHODS
	function getEvents()		{ return $this->event_controller; }
	function getControls()		{ return $this->controls; }
	function getProp($k)		{ return $this->properties[$k]; }
	function getVisibility()	{ return $this->visible; }
	function get_this()			{ return "document.getElementById('".$this->name."')"; }
	
	# REGION BASIC OPERATIONS ON CONTAINER
	function clear_controls()	{ $this->controls = array();  }
	function add($ctl)			{ $this->controls[] = $ctl; $ctl->parent = $this; }
	function bringToFront()		{ $this->set_zindex($this->z_index += 2); }
	function bringToBack()		{ $this->set_zindex(0); }
	function toString()			{ return $this->name; }
	
	
	/*
	 * Diese Funktion bindet das Effect - Framework von Scriptacolous ein.
	 * Damit ist es möglich, Effektoverlays auf Steuerelemente zu legen,
	 * um diese z.B. sanft ein- oder auszublenden.
	 */
	function enable_effects()	{ $this->precode .= init_effects(); }
	
	
	/*
	 * Die Funktion Render Style ist Teil der RenderBase Methode.
	 * Sie rendert die Style-Attribute, die durch die Verschiedenen
	 * Eigenschaften eines Steuerelements entstehen, wie z.B. Größe,
	 * Position, Anordnung.
	 */
	function render_style() {
		$style_attrib =  $this->style_attrib;
		
		if (!$this->visible)
			$style_attrib .= "; display: none";
		
		if ($this->size) {
			if ($this->size["width"])
				$style_attrib .= "; width: ".$this->size["width"];
			if ($this->size["height"]) 
				$style_attrib .= "; height: ".$this->size["height"];
		}
		
		if ($this->location) {
			$style_attrib .= "; position: relative; top: ".$this->location["top"]."; left: ".$this->location["left"];
		}
		
		if ($this->align) {
			$style_attrib .= "; vertical-align: ".$this->align;
		}
		
		if ($this->z_index) {
			$style_attrib .= "; z-index: ".$this->z_index;
		}
		
		return $style_attrib.";".$this->render_style_underlying();
	}
	
	
	/*
	 * Diese Funktion ist Teil der RenderBase Methode, und wurde
	 * nur als Stub Methode implementiert. Der Rückgabewert 
	 * der Methode wird an die gerenderten Style-Attribute von
	 * render_style angehangen. Diese Funktion ist EXPLIZIT
	 * zum Überschreiben gedacht. Eine Änderung in IControl
	 * wirkt sich auf ALLE Kindelemente aus, die die Funktion
	 * render_style_underlying nicht direkt implementiert haben.
	 */
	function render_style_underlying() {
		
	}
	
	/*
	 * Render Base ist Teil der render_partial_to Methode und
	 * Rendert die Grundlegenden Attribute eines Steuerelements,
	 * wie dessen Eindeutige ID, der Klassenname, und die Styles.
	 */
	function render_base() {
		$style_attrib = $this->render_style();
		return ' id="'.$this->name.'" class="'.$this->class_attrib.'" style="'.$style_attrib.'" ';	
	}
	
	/*
	 * Diese Funktion rendert Benutzereigenschaften des Objekts,
	 * welche über et_prop gesetzt wurden.
	 */
	function render_properties() {
		$render_out = "";
		foreach ($this->properties as $prop=>$prop_value) 
			if ($prop_value)
				$render_out .= " ".$prop."=\"".$prop_value."\" ";
			else 
				$render_out .= " ".$prop." ";
		return $render_out;
	}
	
	/*
	 * Render Controls rendert die Kindelemente eines Containers.
	 * Dabei wird jedes Kondobjekt aufgerufen, und dessen
	 * Rendermethode aufgerufen. Sollte ein Kindobjekt nicht
	 * die Rendermethode direkt implementieren, wird die 
	 * Implementierung in der IControl genutzt.
	 */
	function render_controls()	{
		$render_out = "";
		foreach ($this->controls as $ctl) 
			$render_out .= $ctl->render()."\n";
		return $render_out;
	}
	
	/*
	 * Diese Funktion wurde als implementierte Methode erstellt,
	 * um damit Steuerelementen, die keine speziellen
	 * Rendermechanismen verlangen, das Rendern der einzelnen
	 * Teilbereiche eines Controls zu erleichtern.
	 */
	function render() {
		$render_out = $this->render_partial_to()."\n";
		$render_out .= $this->render_controls();
		$render_out .= $this->render_partial_tc()."\n";
		
		return $render_out;
	}
	
	/*
	 * Diese Funktion rendert den Tag Open Content des Steuerelements.
	 * Das Bedeutet, es wird der Header des Steuerelements gerendert,
	 * noch kein Content oder Child Controls.
	 * Die Funktion bezieht sich dabei auf dan festgelegten Tag,
	 * der über die Funktion set_base_tag() gesetzt wird. Ein 
	 * Überschreiben der Funktion wird in den wenigsten Fällen von
	 * Nöten sein, um die Flexibilität zu bewahren, wurde Funktion
	 * trotzdem ausgekapselt.
	 */
	function render_partial_to() {
		$render_out = $this->precode;
		$render_out .= "<".	$this->_underlying_tag .
							$this->render_base().
							$this->render_properties(). 
							$this->event_controller->render_events().">";
		return $render_out;
	}
	
	/*
	 * Die Funktion rendert den Tag Close Content des Steuerelements.
	 * In diesem Bereich werden zwar sehr selten spezielle Änderungen
	 * über Kindobjekte entstehen, um aber die Flexibilität zu bewahren,
	 * wurde die Funktion extrahiert. Unter Umständen soll vor dem 
	 * schließenden Tag noch etwas ausgegeben werden o.ä.
	 */
	function render_partial_tc() {
		$render_out = "</". $this->_underlying_tag .">\n";
		return $render_out;
	}
}	

?>
Return current item: WCL - Web Control Library for PHP