Refactor Web2D to use mootool classes.

This commit is contained in:
Paulo Veiga
2011-08-30 14:21:55 -03:00
parent 7f02ed5cf4
commit e437e0e329
30 changed files with 2344 additions and 2599 deletions

View File

@@ -16,137 +16,259 @@
* limitations under the License.
*/
web2d.Element = function(peer, attributes) {
this._peer = peer;
if (peer == null) {
throw "Element peer can not be null";
}
web2d.Element = new Class({
initialize : function(peer, attributes) {
this._peer = peer;
if (peer == null) {
throw "Element peer can not be null";
}
this._dispatcherByEventType = new Hash({});
if ($defined(attributes)) {
this._initialize(attributes);
}
};
this._dispatcherByEventType = new Hash({});
if ($defined(attributes)) {
this._initialize(attributes);
}
},
web2d.Element.prototype._SIGNATURE_MULTIPLE_ARGUMENTS = -1;
_initialize : function(attributes) {
var batchExecute = {};
web2d.Element.prototype._initialize = function(attributes) {
var batchExecute = {};
// Collect arguments ...
for (var key in attributes) {
var funcName = this._attributeNameToFuncName(key, 'set');
var funcArgs = batchExecute[funcName];
if (!$defined(funcArgs)) {
funcArgs = [];
}
// Collect arguments ...
for (var key in attributes) {
var signature = web2d.Element._propertyNameToSignature[key];
var argPositions = signature[1];
if (argPositions != web2d.Element._SIGNATURE_MULTIPLE_ARGUMENTS) {
funcArgs[argPositions] = attributes[key];
} else {
funcArgs = attributes[key].split(' ');
}
batchExecute[funcName] = funcArgs;
}
// Call functions ...
for (var key in batchExecute) {
var func = this[key];
if (!$defined(func)) {
throw "Could not find function: " + key;
}
func.apply(this, batchExecute[key]);
}
},
setSize : function(width, height) {
this._peer.setSize(width, height);
},
setPosition : function(cx, cy) {
this._peer.setPosition(cx, cy);
},
positionRelativeTo : function(elem, options) {
this._peer.positionRelativeTo(elem, options);
},
/**
* Allows the registration of event listeners on the event target.
* type
* A string representing the event type to listen for.
* listener
* The object that receives a notification when an event of the specified type occurs. This must be an object implementing the EventListener interface, or simply a function in JavaScript.
*
* The following events types are supported:
*
*/
addEvent : function(type, listener) {
this._peer.addEvent(type, listener);
},
/**
*
* Allows the removal of event listeners from the event target.
*
* Parameters:
* type
* A string representing the event type being registered.
* listener
* The listener parameter takes an interface implemented by the user which contains the methods to be called when the event occurs.
* This interace will be invoked passing an event as argument and the 'this' referece in the function will be the element.
*/
removeEvent : function(type, listener) {
this._peer.removeEvent(type, listener);
},
/**
* /*
* Returns element type name.
*/
getType : function() {
throw "Not implemeneted yet. This method must be implemented by all the inherited objects.";
},
/**
* Todo: Doc
*/
getFill : function() {
return this._peer.getFill();
},
/**
* Used to define the fill element color and element opacity.
* color: Fill color
* opacity: Opacity of the fill. It must be less than 1.
*/
setFill : function(color, opacity) {
this._peer.setFill(color, opacity);
},
getPosition : function() {
return this._peer.getPosition();
},
/*
* Defines the element stroke properties.
* width: stroke width
* style: "solid|dot|dash|dashdot|longdash".
* color: stroke color
* opacity: stroke visibility
*/
setStroke : function(width, style, color, opacity) {
if (style != null && style != undefined && style != 'dash' && style != 'dot' && style != 'solid' && style != 'longdash' && style != "dashdot") {
throw "Unsupported stroke style: '" + style + "'";
}
this._peer.setStroke(width, style, color, opacity);
},
_attributeNameToFuncName : function(attributeKey, prefix) {
var signature = web2d.Element._propertyNameToSignature[attributeKey];
if (!$defined(signature)) {
throw "Unsupported attribute: " + attributeKey;
}
var firstLetter = signature[0].charAt(0);
return prefix + firstLetter.toUpperCase() + signature[0].substring(1);
},
/**
* All element properties can be setted using either a method invocation or attribute invocation.
* key: size, width, height, position, x, y, stroke, strokeWidth, strokeStyle, strokeColor, strokeOpacity,
* fill, fillColor, fillOpacity, coordSize, coordSizeWidth, coordSizeHeight, coordOrigin, coordOriginX, coordOrigiY
*/
setAttribute : function(key, value) {
var funcName = this._attributeNameToFuncName(key, 'set');
var funcArgs = batchExecute[funcName];
if (!$defined(funcArgs)) {
funcArgs = [];
var signature = web2d.Element._propertyNameToSignature[key];
if (signature == null) {
throw "Could not find the signature for:" + key;
}
var signature = this._propertyNameToSignature[key];
// Parse arguments ..
var argPositions = signature[1];
if (argPositions != this._SIGNATURE_MULTIPLE_ARGUMENTS) {
funcArgs[argPositions] = attributes[key];
var args = [];
if (argPositions !== this._SIGNATURE_MULTIPLE_ARGUMENTS) {
args[argPositions] = value;
}
else if (typeof value == "array") {
args = value;
} else {
funcArgs = attributes[key].split(' ');
var strValue = String(value);
args = strValue.split(' ');
}
batchExecute[funcName] = funcArgs;
}
// Call functions ...
for (var key in batchExecute) {
var func = this[key];
if (!$defined(func)) {
throw "Could not find function: " + key;
// Look up method ...
var setter = this[funcName];
if (setter == null) {
throw "Could not find the function name:" + funcName;
}
func.apply(this, batchExecute[key]);
setter.apply(this, args);
},
getAttribute : function(key) {
var funcName = this._attributeNameToFuncName(key, 'get');
var signature = web2d.Element._propertyNameToSignature[key];
if (signature == null) {
throw "Could not find the signature for:" + key;
}
var getter = this[funcName];
if (getter == null) {
throw "Could not find the function name:" + funcName;
}
var getterResult = getter.apply(this, []);
var attibuteName = signature[2];
if (!$defined(attibuteName)) {
throw "Could not find attribute mapping for:" + key;
}
var result = getterResult[attibuteName];
if (!$defined(result)) {
throw "Could not find attribute with name:" + attibuteName;
}
return result;
},
/**
* Defines the element opacity.
* Parameters:
* opacity: A value between 0 and 1.
*/
setOpacity : function(opacity) {
this._peer.setStroke(null, null, null, opacity);
this._peer.setFill(null, opacity);
},
setVisibility : function(isVisible) {
this._peer.setVisibility(isVisible);
},
isVisible : function() {
return this._peer.isVisible();
},
/**
* Move the element to the front
*/
moveToFront : function() {
this._peer.moveToFront();
},
/**
* Move the element to the back
*/
moveToBack : function() {
this._peer.moveToBack();
},
getStroke : function() {
return this._peer.getStroke();
},
setCursor : function(type) {
this._peer.setCursor(type);
},
getParent : function() {
return this._peer.getParent();
}
};
});
web2d.Element.prototype.setSize = function(width, height) {
this._peer.setSize(width, height);
};
web2d.Element.prototype.setPosition = function(cx, cy) {
this._peer.setPosition(cx, cy);
};
web2d.Element.prototype._supportedEvents = ["click","dblclick","mousemove","mouseout","mouseover","mousedown","mouseup"];
web2d.Element.prototype.positionRelativeTo = function(elem, options) {
this._peer.positionRelativeTo(elem, options);
};
/**
* Allows the registration of event listeners on the event target.
* type
* A string representing the event type to listen for.
* listener
* The object that receives a notification when an event of the specified type occurs. This must be an object implementing the EventListener interface, or simply a function in JavaScript.
*
* The following events types are supported:
*
*/
web2d.Element.prototype.addEvent = function(type, listener) {
this._peer.addEvent(type, listener);
};
/**
*
* Allows the removal of event listeners from the event target.
*
* Parameters:
* type
* A string representing the event type being registered.
* listener
* The listener parameter takes an interface implemented by the user which contains the methods to be called when the event occurs.
* This interace will be invoked passing an event as argument and the 'this' referece in the function will be the element.
*/
web2d.Element.prototype.removeEvent = function(type, listener) {
this._peer.removeEvent(type, listener);
};
/**
* /*
* Returns element type name.
*/
web2d.Element.prototype.getType = function() {
throw "Not implemeneted yet. This method must be implemented by all the inherited objects.";
};
/**
* Todo: Doc
*/
web2d.Element.prototype.getFill = function() {
return this._peer.getFill();
};
/**
* Used to define the fill element color and element opacity.
* color: Fill color
* opacity: Opacity of the fill. It must be less than 1.
*/
web2d.Element.prototype.setFill = function(color, opacity) {
this._peer.setFill(color, opacity);
};
web2d.Element.prototype.getPosition = function() {
return this._peer.getPosition();
};
/*
* Defines the element stroke properties.
* width: stroke width
* style: "solid|dot|dash|dashdot|longdash".
* color: stroke color
* opacity: stroke visibility
*/
web2d.Element.prototype.setStroke = function(width, style, color, opacity) {
if (style != null && style != undefined && style != 'dash' && style != 'dot' && style != 'solid' && style != 'longdash' && style != "dashdot") {
throw "Unsupported stroke style: '" + style + "'";
}
this._peer.setStroke(width, style, color, opacity);
};
web2d.Element.prototype._propertyNameToSignature =
web2d.Element._SIGNATURE_MULTIPLE_ARGUMENTS = -1;
web2d.Element._supportedEvents = ["click","dblclick","mousemove","mouseout","mouseover","mousedown","mouseup"];
web2d.Element._propertyNameToSignature =
{
// Format: [attribute name, argument position on setter, attribute name on getter]
size: ['size',-1],
@@ -178,123 +300,3 @@ web2d.Element.prototype._propertyNameToSignature =
visibility:['visibility',0],
opacity:['opacity',0]
};
web2d.Element.prototype._attributeNameToFuncName = function(attributeKey, prefix) {
var signature = this._propertyNameToSignature[attributeKey];
if (!$defined(signature)) {
throw "Unsupported attribute: " + attributeKey;
}
var firstLetter = signature[0].charAt(0);
return prefix + firstLetter.toUpperCase() + signature[0].substring(1);
};
/**
* All element properties can be setted using either a method invocation or attribute invocation.
* key: size, width, height, position, x, y, stroke, strokeWidth, strokeStyle, strokeColor, strokeOpacity,
* fill, fillColor, fillOpacity, coordSize, coordSizeWidth, coordSizeHeight, coordOrigin, coordOriginX, coordOrigiY
*/
web2d.Element.prototype.setAttribute = function(key, value) {
var funcName = this._attributeNameToFuncName(key, 'set');
var signature = this._propertyNameToSignature[key];
if (signature == null) {
throw "Could not find the signature for:" + key;
}
// Parse arguments ..
var argPositions = signature[1];
var args = [];
if (argPositions !== this._SIGNATURE_MULTIPLE_ARGUMENTS) {
args[argPositions] = value;
}
else if (typeof value == "array") {
args = value;
} else {
var strValue = String(value);
args = strValue.split(' ');
}
// Look up method ...
var setter = this[funcName];
if (setter == null) {
throw "Could not find the function name:" + funcName;
}
setter.apply(this, args);
};
web2d.Element.prototype.getAttribute = function(key) {
var funcName = this._attributeNameToFuncName(key, 'get');
var signature = this._propertyNameToSignature[key];
if (signature == null) {
throw "Could not find the signature for:" + key;
}
var getter = this[funcName];
if (getter == null) {
throw "Could not find the function name:" + funcName;
}
var getterResult = getter.apply(this, []);
var attibuteName = signature[2];
if (!$defined(attibuteName)) {
throw "Could not find attribute mapping for:" + key;
}
var result = getterResult[attibuteName];
if (!$defined(result)) {
throw "Could not find attribute with name:" + attibuteName;
}
return result;
};
/**
* Defines the element opacity.
* Parameters:
* opacity: A value between 0 and 1.
*/
web2d.Element.prototype.setOpacity = function(opacity) {
this._peer.setStroke(null, null, null, opacity);
this._peer.setFill(null, opacity);
};
web2d.Element.prototype.setVisibility = function(isVisible) {
this._peer.setVisibility(isVisible);
};
web2d.Element.prototype.isVisible = function() {
return this._peer.isVisible();
};
/**
* Move the element to the front
*/
web2d.Element.prototype.moveToFront = function() {
this._peer.moveToFront();
};
/**
* Move the element to the back
*/
web2d.Element.prototype.moveToBack = function() {
this._peer.moveToBack();
};
web2d.Element.prototype.getStroke = function() {
return this._peer.getStroke();
};
web2d.Element.prototype.setCursor = function(type) {
this._peer.setCursor(type);
};
web2d.Element.prototype.getParent = function() {
return this._peer.getParent();
}