







































Module('ca.carleton.gcrc.atlas.mapCanvas.layerText','$Revision: 3627 $',function(mod){

var modObservable=imprt('ca.carleton.gcrc.mvc.observable');
var modMap=imprt('ca.carleton.gcrc.atlas.mapCanvas.map');
var modDomUtil=imprt('ca.carleton.gcrc.dom.util');






mod.TextRendererFactory=Class(modMap.LayerRendererFactory,function(publ,priv,supr){
















publ.__init__=function(
layerName_,
textAttribute_,
colour_,colourAttribute_,
size_,sizeAttribute_,
visibleAttribute_,
opacity_,opacityAttribute_,
xOffset_,yOffset_,
orientation_,orientationAttribute_
,geometryAttribute_
){

supr.__init__.call(this);


this.layerName=layerName_;


this.textAttribute=textAttribute_;


this.colour=colour_;


this.colourAttribute=colourAttribute_;


this.size=size_;


this.sizeAttribute=sizeAttribute_;


this.visibleAttribute=visibleAttribute_;


this.opacity=opacity_;


this.opacityAttribute=opacityAttribute_;


this.xOffset=xOffset_;


this.yOffset=yOffset_;


this.orientation=orientation_;


this.orientationAttribute=orientationAttribute_;


this.geometryAttribute=geometryAttribute_;

this.editableDataSource=false;
}








publ.CreateRenderer=function(uniqueId_,mapInfo_){
return new mod.TextRenderer(uniqueId_,mapInfo_,this);
}






publ.SetEditableDataSource=function(flag_){
this.editableDataSource=flag_;
}




publ.GetEditableDataSource=function(){
return this.editableDataSource;
}
});









mod.TextRenderer=Class(modMap.LayerRenderer,function(publ,priv,supr){






publ.__init__=function(uniqueId_,mapInfo_,factory_){

supr.__init__.call(this,mapInfo_);


this.uniqueId=uniqueId_;


this.mapInfo=mapInfo_;

this.dataSource=null;


this.factory=factory_;


this.layer=this.mapInfo.dataModel.LayerFromName(this.factory.layerName);

this.fontSize=12;


this.features={};
}





publ.DrawOn=function(group_){
this.group=group_;
this.group.setAttributeNS(null,'id','text_'+this.uniqueId);

this.RecomputeScale();


this.Observe(this.layer,'add_atom',this.AddAtom,null);
this.Observe(this.layer,'remove_atom',this.RemoveAtom,null);
this.Observe(this.layer,'display_state',this.FeatureStateChanged,null);
this.Observe(this.layer,this.factory.textAttribute,this.FeatureTextChanged,null);
if(null!=this.factory.colourAttribute){
this.Observe(this.layer,this.factory.colourAttribute,this.FeatureColourChanged,null);
}
if(null!=this.factory.visibleAttribute){
this.Observe(this.layer,this.factory.visibleAttribute,this.FeatureVisibilityChanged,null);
}
if(null!=this.factory.sizeAttribute){
this.Observe(this.layer,this.factory.sizeAttribute,this.FeatureSizeChanged,null);
}
if(null!=this.factory.opacityAttribute){
this.Observe(this.layer,this.factory.opacityAttribute,this.FeatureOpacityChanged,null);
}
if(null!=this.factory.orientationAttribute){
this.Observe(this.layer,this.factory.orientationAttribute,this.FeatureOrientationChanged,null);
}


var featureLoop;
var features=this.layer.Features();
for(featureLoop=0;featureLoop<features.length;++featureLoop){
this.ApplyVisibility(features[featureLoop]);
}
}





publ.ZoomLevelChanged=function(){
this.RecomputeScale();

for(var featureId in this.features){
var featureInfo=this.features[featureId];
this.ApplyScale(featureInfo);
}
}






publ.ApplyScale=function(featureInfo){
var transString='scale('+this.scale+','+(0-this.scale)+')';


var scaleGroups=featureInfo.scaleGroups;
var loop;
for(loop=0;loop<scaleGroups.length;++loop){
var group=scaleGroups[loop];
group.setAttributeNS(null,'transform',transString);
}
}





publ.RecomputeScale=function(){
var sx=this.group.getScreenCTM().a;

if(0==sx){
this.scale=0;
}else{
this.scale=1/sx;
}


}





publ.AddAllAtomsOnFeature=function(feature_){
var featureInfo=this.FeatureInfo(feature_);


if(1==featureInfo.isVisible){

var atomLoop;
var atoms=feature_.Atoms();
for(atomLoop=0;atomLoop<atoms.length;++atomLoop){
this._AddAtomGeometry(feature_,atoms[atomLoop]);
}
}
}






publ.AddAtom=function(event_){
var feature=event_.originator;
var atom=event_.data;
var featureInfo=this.FeatureInfo(feature);

var receiver=this;
this.mapInfo.dataModel.RegisterForEndProcessing(function(){

if(1==featureInfo.isVisible){
receiver._AddAtomGeometry(feature,atom);
}
});
}







publ._AddAtomGeometry=function(feature_,atom_){
var atomId=atom_.id;
var layerId=feature_.layerModel.name;
var featureId=feature_.id;

var featureInfo=this.FeatureInfo(feature_);


var coordString=atom_.PropertyValueFromName(this.factory.geometryAttribute);
if(null!=coordString)
{
this.dataSource=atom_.dataSource;

var coords=coordString.split(',');
var theX=coords[0];
var theY=coords[1];


var transGroup=this.mapInfo.document.createElementNS(this.mapInfo.svgNS,'g');
transGroup.setAttributeNS(null,'transform','translate('+theX+','+theY+')');


var scaleGroup=this.mapInfo.document.createElementNS(this.mapInfo.svgNS,'g');
transGroup.appendChild(scaleGroup);
featureInfo.scaleGroups.push(scaleGroup);


var orientationGroup=this.mapInfo.document.createElementNS(this.mapInfo.svgNS,'g');
orientationGroup.setAttributeNS(null,'transform','rotate('+(0-featureInfo.orientation)+')');
scaleGroup.appendChild(orientationGroup);
featureInfo.orientationGroups.push(orientationGroup);


var offsetGroup=this.mapInfo.document.createElementNS(this.mapInfo.svgNS,'g');
offsetGroup.setAttributeNS(null,'transform','translate('+featureInfo.xOffset+','+(0-featureInfo.yOffset)+')');
orientationGroup.appendChild(offsetGroup);
featureInfo.offsetGroups.push(offsetGroup);


var sizeGroup=this.mapInfo.document.createElementNS(this.mapInfo.svgNS,'g');
offsetGroup.appendChild(sizeGroup);
featureInfo.sizeGroups.push(sizeGroup);


this.RedrawTextNode(featureInfo,sizeGroup);


this.ApplyScale(featureInfo);
this.ApplySize(featureInfo);


featureInfo.group.appendChild(transGroup);
}
}






publ.RemoveAtom=function(event_){
var feature=event_.originator;
var atom=event_.data;
var atomId=atom.id;


var featureInfo=this.FeatureInfo(feature);
featureInfo.redrawRequested=true;
var receiver=this;
this.mapInfo.dataModel.RegisterForEndProcessing(function(){

if(true==featureInfo.redrawRequested){
var truVisibility=featureInfo.isVisible;
featureInfo.isVisible=false;
receiver.ApplyVisibility(feature);
featureInfo.isVisible=truVisibility;
receiver.ApplyVisibility(feature);

featureInfo.redrawRequested=false;
}


});
}






publ.FeatureTextChanged=function(event_){
var feature=event_.originator;
var featureInfo=this.FeatureInfo(feature);


featureInfo.currentText=event_.data;


this.RedrawTextNodes(featureInfo);
}





publ.RedrawTextNodes=function(featureInfo){

var loop;
for(loop=0;loop<featureInfo.sizeGroups.length;++loop){
var parentGroup=featureInfo.sizeGroups[loop];
this.RedrawTextNode(featureInfo,parentGroup);
}
}







publ.RedrawTextNode=function(featureInfo,parentGroup){
modDomUtil.RemoveChildren(parentGroup);

var textNode=this.mapInfo.document.createTextNode(featureInfo.currentText);

var textElem=this.mapInfo.document.createElementNS(this.mapInfo.svgNS,'text');
textElem.mapCanvasFeature=featureInfo.model;


textElem.appendChild(textNode);

parentGroup.appendChild(textElem);
}






publ.FeatureStateChanged=function(event_){
var feature=event_.originator;
var featureInfo=this.FeatureInfo(feature);

this.ApplyColour(featureInfo);
}





publ.FeatureColourChanged=function(event_){
var feature=event_.originator;
var colourValue=event_.data;


var featureInfo=this.FeatureInfo(feature);
featureInfo.colourValue=colourValue;

this.ApplyColour(featureInfo);
}





publ.ApplyColour=function(featureInfo){
var inFocus=featureInfo.model.IsInFocus();
var selected=featureInfo.model.IsSelected();

var fillColour;

if(true==inFocus&&true==selected){
fillColour=this.mapInfo.colourSelectedInFocus;
}else if(true==selected){
fillColour=this.mapInfo.colourSelected;
}else if(true==inFocus){
fillColour=this.mapInfo.colourInFocus;
}else{
if(null==featureInfo.colourValue){
fillColour='#000000';
}else{
fillColour=featureInfo.colourValue;
}
}


featureInfo.group.setAttributeNS(null,'cursor','pointer');
featureInfo.group.setAttributeNS(null,'fill',fillColour);
featureInfo.group.setAttributeNS(null,'stroke',fillColour);
featureInfo.group.setAttributeNS(null,'font-family',"'Arial'");
featureInfo.group.setAttributeNS(null,'font-size',''+this.fontSize+'px');
featureInfo.group.setAttributeNS(null,'font-weight','bold');
featureInfo.group.setAttributeNS(null,'letter-spacing','-1');
featureInfo.group.setAttributeNS(null,'text-anchor','middle');
featureInfo.group.setAttributeNS(null,'stroke-width',1.2);
}





publ.FeatureVisibilityChanged=function(event_){
var feature=event_.originator;
var visibilityValue=event_.data;


var featureInfo=this.FeatureInfo(feature);


var effectiveVisibility;
if(null==visibilityValue||0==visibilityValue){
effectiveVisibility=0;
}else{
effectiveVisibility=1;
}

if(featureInfo.isVisible!=effectiveVisibility){
featureInfo.isVisible=effectiveVisibility;

this.ApplyVisibility(feature);
}
}





publ.ApplyVisibility=function(feature_){
var featureInfo=this.FeatureInfo(feature_);


if(0==featureInfo.isVisible){

featureInfo.sizeGroups=new Array();
featureInfo.unifyGroups=new Array();
modDomUtil.RemoveChildren(featureInfo.group);
}else{
if(0==featureInfo.previousVisibility){
this.AddAllAtomsOnFeature(feature_);
}
}
featureInfo.previousVisibility=featureInfo.isVisible;
}





publ.FeatureSizeChanged=function(event_){
var feature=event_.originator;
var sizeValue=event_.data;


var featureInfo=this.FeatureInfo(feature);
featureInfo.sizeValue=sizeValue;

this.ApplySize(featureInfo);
}





publ.ApplySize=function(featureInfo){
var size=featureInfo.sizeValue;
var effectiveSize=size/this.fontSize;

var transString='scale('+effectiveSize+','+effectiveSize+')';


var sizeGroups=featureInfo.sizeGroups;
var loop;
for(loop=0;loop<sizeGroups.length;++loop){
var group=sizeGroups[loop];
group.setAttributeNS(null,'transform',transString);
}
}





publ.FeatureOpacityChanged=function(event_){
var feature=event_.originator;
var opacity=event_.data;


var featureInfo=this.FeatureInfo(feature);
featureInfo.opacity=opacity;

this.ApplyOpacity(feature);
}





publ.ApplyOpacity=function(feature_){
var featureInfo=this.FeatureInfo(feature_);

var effectiveOpacity=featureInfo.opacity/100;
if(effectiveOpacity<0){
effectiveOpacity=0;
}else if(effectiveOpacity>1){
effectiveOpacity=1;
}


featureInfo.group.setAttributeNS(null,'opacity',effectiveOpacity);
}





publ.FeatureOrientationChanged=function(event_){
var feature=event_.originator;
var orientation=event_.data;


var featureInfo=this.FeatureInfo(feature);
featureInfo.orientation=orientation;

this.ApplyOrientation(feature);
}





publ.ApplyOrientation=function(feature_){
var featureInfo=this.FeatureInfo(feature_);

var transString='rotate('+(0-featureInfo.orientation)+')';


var sizeGroups=featureInfo.orientationGroups;
var loop;
for(loop=0;loop<orientationGroups.length;++loop){
var group=orientationGroups[loop];
group.setAttributeNS(null,'transform',transString);
}
}







publ.FeatureInfo=function(feature_){

























var featureInfo=this.features[feature_.id];
if(null==featureInfo){
featureInfo={};
this.features[feature_.id]=featureInfo;

featureInfo.scaleGroups=new Array();
featureInfo.sizeGroups=new Array();
featureInfo.orientationGroups=new Array();
featureInfo.offsetGroups=new Array();

featureInfo.model=feature_;


featureInfo.redrawRequested=false;




featureInfo.currentText=feature_.GetVariableValue(this.factory.textAttribute,'');


if(null!=this.factory.colourAttribute){
var colourValue=feature_.GetVariableValue(this.factory.colourAttribute);
featureInfo.colourValue=colourValue;
}else if(null!=this.factory.colour){
featureInfo.colourValue=this.factory.colour;
}else{
featureInfo.colourValue='#000000';
}


if(null!=this.factory.visibleAttribute){

var visibilityValue=feature_.GetVariableValue(this.factory.visibleAttribute);
var effectiveVisibility;
if(null==visibilityValue||0==visibilityValue){
effectiveVisibility=0;
}else{
effectiveVisibility=1;
}
featureInfo.isVisible=effectiveVisibility;
}else{
featureInfo.isVisible=1;
}
featureInfo.previousVisibility=0;


if(null!=this.factory.sizeAttribute){
featureInfo.sizeValue=feature_.GetVariableValue(this.factory.sizeAttribute);
}else{
featureInfo.sizeValue=this.factory.size;
}


if(null!=this.factory.opacityAttribute){
featureInfo.opacity=feature_.GetVariableValue(this.factory.opacityAttribute);
}else{
featureInfo.opacity=this.factory.opacity;
}


featureInfo.xOffset=this.factory.xOffset;
featureInfo.yOffset=this.factory.yOffset;


if(null!=this.factory.orientationAttribute){
featureInfo.orientation=feature_.GetVariableValue(this.factory.orientationAttribute);
}else{
featureInfo.orientation=this.factory.orientation;
}


gElem=this.mapInfo.document.createElementNS(this.mapInfo.svgNS,'g');
this.group.appendChild(gElem);
featureInfo.group=gElem;


this.ApplyOpacity(feature_);
this.ApplySize(featureInfo);
this.ApplyColour(featureInfo);
}

return featureInfo;
}




publ.GetDataSource=function(){
return this.dataSource;
}




publ.GetGeometryAttribute=function(){
return this.factory.geometryAttribute;
}




publ.GetGeometryType=function(){
return'point';
}
});

});