jui.define("chart.widget.map.control", [ "util.base" ], function(_) {
var SCROLL_MIN_Y = 21.5,
SCROLL_MAX_Y = 149;
/**
* @class chart.widget.map.control
* @extends chart.widget.map.core
*/
var MapControlWidget = function(chart, axis, widget) {
var self = this;
var scale = 1,
viewX = 0,
viewY = 0,
blockX = 0,
blockY = 0,
scrollY = 0,
btn = { top: null, right: null, bottom: null, left: null, home: null, up: null, down: null, thumb: null };
function createBtnGroup(type, opacity, x, y, url) {
btn[type] = chart.svg.group({
cursor: (url != null) ? "pointer" : "move"
}, function() {
chart.svg.rect({
x: 0.5,
y: 0.5,
width: 20,
height: 20,
rx: 2,
ry: 2,
stroke: 0,
fill: chart.theme("mapControlButtonColor"),
"fill-opacity": opacity
});
if(url != null) {
chart.svg.image({
x: 4.5,
y: 4.5,
width: 11,
height: 11,
"xmlns:xlink": "http://www.w3.org/1999/xlink",
"xlink:href": url,
opacity: 0.6
});
}
}).translate(x, y);
return btn[type];
}
function createScrollThumbLines() {
return chart.svg.group({}, function() {
for(var i = 0; i < 6; i++) {
var y = 22 * i;
chart.svg.path({
fill: "none",
"stroke-width": 1,
"stroke-opacity": 0.6,
stroke: chart.theme("mapControlScrollLineColor")
}).MoveTo(1.5, 41.5 + y).LineTo(18.5, 41.5 + y);
}
});
}
function getScrollThumbY(scale) {
return self.getScaleToValue(scale, widget.min, widget.max, SCROLL_MIN_Y, SCROLL_MAX_Y);
}
function getScrollScale(y) {
return self.getValueToScale(y, SCROLL_MIN_Y, SCROLL_MAX_Y, widget.min, widget.max);
}
function setButtonEvents() {
var originViewX = viewX,
originViewY = viewY;
btn.top.on("click", function(e) {
viewY -= blockY;
move();
});
btn.right.on("click", function(e) {
viewX += blockX;
move();
});
btn.bottom.on("click", function(e) {
viewY += blockY;
move();
});
btn.left.on("click", function(e) {
viewX -= blockX;
move();
});
btn.home.on("click", function(e) {
viewX = originViewX;
viewY = originViewY;
move();
});
btn.up.on("click", function(e) {
if(scale > widget.max) return;
scale += 0.1;
zoom();
});
btn.down.on("click", function(e) {
if(scale - 0.09 < widget.min) return;
scale -= 0.1;
zoom();
});
function move() {
axis.updateGrid("map", {
scale: scale,
viewX: viewX,
viewY: viewY
});
axis.map.view(viewX, viewY);
// 차트 렌더링이 활성화되지 않았을 경우
if(!chart.isRender()) {
chart.render();
}
}
function zoom() {
axis.updateGrid("map", {
scale: scale,
viewX: viewX,
viewY: viewY
});
scrollY = getScrollThumbY(scale);
axis.map.scale(scale);
btn.thumb.translate(0, scrollY);
// 차트 렌더링이 활성화되지 않았을 경우
if(!chart.isRender()) {
chart.render();
}
}
}
function setScrollEvent(bar) {
var startY = 0,
moveY = 0;
btn.thumb.on("mousedown", function(e) {
if(startY > 0) return;
startY = e.y;
});
btn.thumb.on("mousemove", moveThumb);
bar.on("mousemove", moveThumb);
btn.thumb.on("mouseup", endMoveThumb);
bar.on("mouseup", endMoveThumb);
bar.on("mouseout", endMoveThumb);
function moveThumb(e) {
if(startY == 0) return;
var sy = scrollY + e.y - startY;
if(sy >= SCROLL_MIN_Y && sy <= SCROLL_MAX_Y) {
moveY = e.y - startY;
scale = getScrollScale(sy);
axis.updateGrid("map", {
scale: scale,
viewX: viewX,
viewY: viewY
});
axis.map.scale(scale);
btn.thumb.translate(0, getScrollThumbY(scale));
// 차트 렌더링이 활성화되지 않았을 경우
if(!chart.isRender()) {
chart.render();
}
}
}
function endMoveThumb(e) {
if(startY == 0) return;
startY = 0;
scrollY += moveY;
}
}
this.drawBefore = function() {
scale = axis.map.scale();
viewX = axis.map.view().x;
viewY = axis.map.view().y;
blockX = axis.map.size().width / 10;
blockY = axis.map.size().height / 10;
scrollY = getScrollThumbY(scale);
}
this.draw = function() {
var g = chart.svg.group({}, function() {
var top = chart.svg.group(),
bottom = chart.svg.group().translate(20, 80),
bar = chart.svg.rect({
x: 0.5,
y: 0.5,
width: 26,
height: 196,
rx: 4,
ry: 4,
stroke: 0,
fill: chart.theme("mapControlScrollColor"),
"fill-opacity": 0.15
}).translate(-3, -3);
top.append(createBtnGroup("left", 0.8, 0, 20, chart.theme("mapControlLeftButtonImage")));
top.append(createBtnGroup("right", 0.8, 40, 20, chart.theme("mapControlRightButtonImage")));
top.append(createBtnGroup("top", 0.8, 20, 0, chart.theme("mapControlTopButtonImage")));
top.append(createBtnGroup("bottom", 0.8, 20, 40, chart.theme("mapControlBottomButtonImage")));
top.append(createBtnGroup("home", 0, 20, 20, chart.theme("mapControlHomeButtonImage")));
bottom.append(bar);
bottom.append(createScrollThumbLines());
bottom.append(createBtnGroup("up", 0.8, 0, 0, chart.theme("mapControlUpButtonImage")));
bottom.append(createBtnGroup("down", 0.8, 0, 170, chart.theme("mapControlDownButtonImage")));
bottom.append(createBtnGroup("thumb", 0.8, 0, scrollY));
setButtonEvents();
setScrollEvent(bar);
});
var ot = widget.orient,
ag = widget.align,
dx = widget.dx,
dy = widget.dy,
x2 = axis.area("x2"),
y2 = axis.area("y2");
if(ot == "bottom" && ag == "start") {
g.translate(dx, y2 - (273 + dy));
} else if(ot == "bottom" && ag == "end") {
g.translate(x2 - (60 + dx), y2 - (273 + dy));
} else if(ot == "top" && ag == "end") {
g.translate(x2 - (60 + dx), dy);
} else {
g.translate(dx, dy);
}
return g;
}
}
MapControlWidget.setup = function() {
return {
/** @cfg {"top"/"bottom" } Sets the location where the label is displayed (top, bottom). */
orient: "top",
/** @cfg {"start"/"end" } Aligns the label (center, start, end). */
align: "start",
min: 1,
max: 3,
dx: 5,
dy: 5
}
}
return MapControlWidget;
}, "chart.widget.map.core");