wisemapping-open-source/mindplot/src/main/javascript/IconGroup.js

342 lines
9.4 KiB
JavaScript
Raw Normal View History

2009-06-07 20:59:43 +02:00
/*
2011-07-27 13:25:10 +02:00
* Copyright [2011] [wisemapping]
*
* Licensed under WiseMapping Public License, Version 1.0 (the "License").
* It is basically the Apache License, Version 2.0 (the "License") plus the
* "powered by wisemapping" text requirement on every single page;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the license at
*
* http://www.wisemapping.org/license
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
mindplot.IconGroup = new Class({
initialize : function(topic) {
var offset = topic.getOffset();
this.options = {
width:0,
height:0,
x:offset.x / 2,
y:offset.y,
icons:[],
topic:topic,
nativeElem:new web2d.Group({width: 2, height:2,x: offset, y:offset, coordSizeWidth:1,coordSizeHeight:1})
};
this.updateIconGroupPosition();
this.registerListeners();
2011-08-24 05:03:52 +02:00
this._removeTip = new mindplot.IconGroup.RemoveTip(this.options.nativeElem, this);
2011-07-27 13:25:10 +02:00
},
setPosition : function(x, y) {
this.options.x = x;
this.options.y = y;
this.options.nativeElem.setPosition(x, y);
},
getPosition : function() {
return {x:this.options.x, y:this.options.y};
},
setSize : function(width, height) {
this.options.width = width;
this.options.height = height;
this.options.nativeElem.setSize(width, height);
this.options.nativeElem.setCoordSize(width, height);
},
getSize : function() {
return {width:this.options.width, height:this.options.height};
},
addIcon : function(icon) {
2011-08-21 17:42:00 +02:00
$defined(icon, "icon is not defined");
2011-07-27 13:25:10 +02:00
icon.setGroup(this);
var newIcon = icon.getImage();
var nativeElem = this.options.nativeElem;
2011-08-05 06:06:56 +02:00
2011-07-27 13:25:10 +02:00
var iconSize = newIcon.getSize();
var size = nativeElem.getSize();
newIcon.setPosition(size.width, 0);
this.options.icons.extend([icon]);
nativeElem.appendChild(newIcon);
size.width = size.width + iconSize.width;
if (iconSize.height > size.height) {
size.height = iconSize.height;
2009-06-07 20:59:43 +02:00
}
2011-07-27 13:25:10 +02:00
nativeElem.setCoordSize(size.width, size.height);
nativeElem.setSize(size.width, size.height);
this.options.width = size.width;
this.options.height = size.height;
2011-08-24 05:03:52 +02:00
// Register event for the group ..
var topicId = this.options.topic.getId();
2011-08-24 06:06:32 +02:00
this._removeTip.decorate(topicId, icon);
2011-07-27 13:25:10 +02:00
},
getIcons : function() {
return this.options.icons;
},
removeIcon : function(url) {
this._removeIcon(this.getIcon(url));
},
removeImageIcon : function(icon) {
var imgIcon = this.getImageIcon(icon);
this._removeIcon(imgIcon);
},
getIcon : function(url) {
var result = null;
2011-08-24 06:06:32 +02:00
this.options.icons.each(function(el) {
2011-07-27 13:25:10 +02:00
var nativeImage = el.getImage();
if (nativeImage.getHref() == url) {
result = el;
}
}, this);
return result;
},
getImageIcon : function(icon) {
var result = null;
2011-08-24 06:06:32 +02:00
this.options.icons.each(function(el) {
2011-07-28 18:06:15 +02:00
if (result == null && $defined(el.getModel().isIconModel) && el.getId() == icon.getId() && el.getUiId() == icon.getUiId()) {
2011-07-27 13:25:10 +02:00
result = el;
}
}, this);
return result;
},
findIconFromModel : function(iconModel) {
var result = null;
2011-08-24 06:06:32 +02:00
this.options.icons.each(function(el) {
2011-07-27 13:25:10 +02:00
var elModel = el.getModel();
2011-07-28 18:06:15 +02:00
if (result == null && $defined(elModel.isIconModel) && elModel.getId() == iconModel.getId()) {
2011-07-27 13:25:10 +02:00
result = el;
}
}, this);
if (result == null) {
throw "Icon can no be found.";
2009-06-07 20:59:43 +02:00
}
2011-07-27 13:25:10 +02:00
return result;
},
_removeIcon : function(icon) {
var nativeImage = icon.getImage();
this.options.icons.erase(icon);
var iconSize = nativeImage.getSize();
var size = this.options.nativeElem.getSize();
var position = nativeImage.getPosition();
2011-08-24 06:06:32 +02:00
this.options.icons.each(function(icon) {
2011-07-27 13:25:10 +02:00
var img = icon.getImage();
var pos = img.getPosition();
if (pos.x > position.x) {
img.setPosition(pos.x - iconSize.width, 0);
}
}.bind(this));
size.width = size.width - iconSize.width;
this.setSize(size.width, size.height);
},
2011-08-21 17:42:00 +02:00
getNativeElement : function() {
2011-07-27 13:25:10 +02:00
return this.options.nativeElem;
},
moveToFront : function() {
this.options.nativeElem.moveToFront();
},
registerListeners : function() {
2011-08-21 17:42:00 +02:00
this.options.nativeElem.addEvent('click', function(event) {
2011-07-27 13:25:10 +02:00
// Avoid node creation ...
2011-08-21 17:42:00 +02:00
event.stopPropagation();
2011-07-27 13:25:10 +02:00
});
2011-08-24 05:03:52 +02:00
2011-08-21 17:42:00 +02:00
this.options.nativeElem.addEvent('dblclick', function(event) {
event.stopPropagation();
2011-07-27 13:25:10 +02:00
});
},
getTopic : function() {
return this.options.topic;
},
updateIconGroupPosition : function() {
var offsets = this._calculateOffsets();
this.setPosition(offsets.x, offsets.y);
},
_calculateOffsets : function() {
var offset = this.options.topic.getOffset();
var text = this.options.topic.getTextShape();
2011-08-05 06:06:56 +02:00
2011-07-27 13:25:10 +02:00
var sizeHeight = text.getHtmlFontSize();
var yOffset = offset;
2011-08-05 06:06:56 +02:00
2011-07-27 13:25:10 +02:00
yOffset = text.getPosition().y + (sizeHeight - 18) / 2 + 1;
return {x:offset, y:yOffset};
}
2011-08-24 05:03:52 +02:00
});
mindplot.IconGroup.RemoveTip = new Class({
initialize : function(container) {
$assert(container, "group can not be null");
this._container = container;
},
show : function(topicId, icon) {
$assert(icon, 'icon can not be null');
// Nothing to do ...
if (this._activeIcon != icon) {
// If there is an active icon, close it first ...
if (this._activeIcon) {
2011-08-24 06:06:32 +02:00
this.close(0);
2011-08-24 05:03:52 +02:00
}
// Now, let move the position the icon...
var pos = icon.getPosition();
icon.setSize(15, 15);
2011-08-24 06:06:32 +02:00
// Register events ...
2011-08-24 05:03:52 +02:00
var widget = this._buildWeb2d();
widget.addEvent('click', function() {
2011-08-26 03:08:39 +02:00
icon.remove();
2011-08-24 05:03:52 +02:00
});
2011-08-24 06:06:32 +02:00
widget.addEvent('mouseover', function() {
this.show(topicId, icon);
}.bind(this));
widget.addEvent('mouseout', function() {
this.hide();
}.bind(this));
2011-08-24 05:03:52 +02:00
widget.setPosition(pos.x + 11, pos.y - 11);
this._container.appendChild(widget);
// Setup current element ...
this._activeIcon = icon;
this._widget = widget;
2011-08-24 06:06:32 +02:00
} else {
clearTimeout(this._closeTimeoutId);
2011-08-24 05:03:52 +02:00
}
},
2011-08-24 06:06:32 +02:00
hide : function() {
2011-08-25 05:17:13 +02:00
this.close(200);
2011-08-24 05:03:52 +02:00
},
2011-08-24 06:06:32 +02:00
close : function(delay) {
2011-08-24 05:03:52 +02:00
2011-08-24 06:06:32 +02:00
// This is not ok, trying to close the same dialog twice ?
if (this._closeTimeoutId) {
clearTimeout(this._closeTimeoutId)
}
2011-08-24 05:03:52 +02:00
if (this._activeIcon) {
2011-08-24 06:06:32 +02:00
var icon = this._activeIcon;
var widget = this._widget;
2011-08-24 05:03:52 +02:00
var close = function() {
2011-08-24 06:06:32 +02:00
2011-08-24 05:03:52 +02:00
icon.setSize(12, 12);
this._activeIcon = null;
2011-08-24 06:06:32 +02:00
this._container.removeChild(widget);
this._widget = null;
this._closeTimeoutId = null;
2011-08-24 05:03:52 +02:00
}.bind(this);
2011-08-24 06:06:32 +02:00
if (!$defined(delay) || delay == 0) {
close();
}
else {
this._closeTimeoutId = close.delay(delay);
}
2011-08-24 05:03:52 +02:00
}
},
2011-08-24 06:06:32 +02:00
_buildWeb2d : function() {
var result = new web2d.Group({
width: 10,
height:10,
x: 0,
y:0,
coordSizeWidth:10,
coordSizeHeight:10
});
2011-08-24 05:03:52 +02:00
2011-08-24 06:06:32 +02:00
var outerRect = new web2d.Rect(0, {
x: 0,
y: 0,
width:10,
height:10,
stroke:'0',
2011-08-24 06:14:58 +02:00
fillColor:'black'
2011-08-24 06:06:32 +02:00
});
result.appendChild(outerRect);
outerRect.setCursor('pointer');
var innerRect = new web2d.Rect(0, {
x: 1,
y: 1,
width:8,
height:8,
stroke:'1 solid white',
2011-08-24 06:14:58 +02:00
fillColor:'gray'
2011-08-24 06:06:32 +02:00
});
result.appendChild(innerRect);
2011-08-24 05:03:52 +02:00
var line = new web2d.Line({stroke:'1 solid white'});
line.setFrom(1, 1);
line.setTo(9, 9);
result.appendChild(line);
var line2 = new web2d.Line({stroke:'1 solid white'});
line2.setFrom(1, 9);
line2.setTo(9, 1);
result.appendChild(line2);
// Some sily events ...
result.addEvent('mouseover', function() {
2011-08-24 06:06:32 +02:00
innerRect.setFill('#CC0033');
2011-08-24 05:03:52 +02:00
});
result.addEvent('mouseout', function() {
2011-08-24 06:06:32 +02:00
innerRect.setFill('gray');
2011-08-24 05:03:52 +02:00
});
return result;
2011-08-24 06:06:32 +02:00
},
decorate : function(topicId, icon) {
icon.addEvent('mouseover', function() {
this.show(topicId, icon);
}.bind(this));
icon.addEvent('mouseout', function() {
this.hide();
}.bind(this))
2011-08-24 05:03:52 +02:00
}
2011-07-27 13:25:10 +02:00
});