<?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 fr 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 fr 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;
}
}
?>