📄 widget.js
字号:
// 메뉴에 마우스 클릭이 일어난 시점에 드래그를 위한 제일 첫 동작 (해당 object에 각종 함수나 상태변수 설정) function widgetDragEnable(obj, funcDragStart, funcDrag, funcDragEnd) { // 상위 object에 드래그 가능하다는 상태와 각 드래그 관련 함수를 설정 obj.draggable = true; obj.dragStart = funcDragStart; obj.drag = funcDrag; obj.dragEnd = funcDragEnd; // 드래그 가능하지 않다면 드래그 가능하도록 상태 지정하고 mousemove이벤트 등록 if (!widgetDragManager.isDrag) { widgetDragManager.isDrag = true; xAddEventListener(document, 'mousemove', widgetDragMouseMove, false); } } // 드래그를 시작할때 호출되는 함수 (이동되는 형태를 보여주기 위한 작업을 함)function widgetDragStart(tobj, px, py) { if(tobj.className == 'widgetResize' || tobj.className == 'widgetResizeLeft' || tobj.className == 'widgetBoxResize' || tobj.className == 'widgetBoxResizeLeft') return; var obj = widgetGetTmpObject(tobj); xInnerHtml(obj, xInnerHtml(tobj)); xLeft(obj, xPageX(tobj)); xTop(obj, xPageY(tobj)); xWidth(obj, xWidth(tobj)); xHeight(obj, xHeight(tobj)); xDisplay(obj, 'block');}// 드래그 시작후 마우스를 이동할때 발생되는 이벤트에 의해 실행되는 함수function widgetDrag(tobj, dx, dy) { var minWidth = 40; var minHeight = 10; var sx = xPageX(tobj.parentNode); var sy = xPageY(tobj.parentNode); var nx = tobj.xDPX; var ny = tobj.xDPY; var zoneWidth = xWidth(zonePageObj); var zoneLeft = xPageX(zonePageObj); var zoneRight = zoneLeft + zoneWidth; var pWidth = xWidth(tobj.parentNode); var cssFloat = getFloat(tobj.parentNode); if(!cssFloat) cssFloat = 'left'; // 위젯 리사이즈 (우측) if(tobj.className == 'widgetResize' || tobj.className == 'widgetBoxResize') { if(nx < sx+minWidth) nx = sx+minWidth; if(nx > zoneRight) nx = zoneRight; if(cssFloat == 'right') nx = sx + pWidth; var new_width = nx - sx; if(new_width < minWidth) new_width = minWidth; var new_height = ny - sy; if(new_height < minHeight) new_height = minHeight; if( zoneRight < sx+new_width) new_width = zoneRight - sx; // 위젯의 크기 조절 xWidth(tobj.nextSibling.nextSibling, new_width); xHeight(tobj.nextSibling.nextSibling, new_height); xWidth(tobj.parentNode, new_width); xHeight(tobj.parentNode, new_height); // 위젯 리사이즈 (좌측) } else if(tobj.className == 'widgetResizeLeft' || tobj.className == 'widgetBoxResizeLeft') { if(nx < zoneLeft) nx = zoneLeft; if(cssFloat == 'left') nx = sx; var new_width = pWidth + (sx - nx); if(new_width < minWidth) new_width = minWidth; var new_height = ny - sy; if(new_height < minHeight) new_height = minHeight; // 위젯의 크기 조절 xWidth(tobj.nextSibling, new_width); xHeight(tobj.nextSibling, new_height); xWidth(tobj.parentNode, new_width); xHeight(tobj.parentNode, new_height); // 위젯 드래그 } else { var obj = widgetGetTmpObject(tobj); xLeft(obj, parseInt(xPageX(obj),10) + parseInt(dx,10)); xTop(obj, parseInt(xPageY(obj),10) + parseInt(dy,10)); // 박스 안에 있을 경우에는 박스내의 위젯하고 자리를 바꾸고 그 외의 경우에는 박스를 빠져 나간다 if(tobj.parentNode != zonePageObj) { // 박스내에 있는 위젯들을 구함 var widgetList = xGetElementsByClassName("widgetOutput",tobj.parentNode); for(var i=0;i<widgetList.length;i++) { var target_obj = widgetList[i]; var l = xPageX(target_obj); var t = xPageY(target_obj); var ll = parseInt(l,10) + parseInt(xWidth(target_obj),10); var tt = parseInt(t,10) + parseInt(xHeight(target_obj),10); if( tobj != target_obj && tobj.xDPX >= l && tobj.xDPX <= ll && tobj.xDPY >= t && tobj.xDPY <= tt && tobj.parentNode == target_obj.parentNode) { var next1 = target_obj.nextSibling; if(!next1) { next1 = xCreateElement("DIV"); target_obj.parentNode.appendChild(next1); } var next2 = tobj.nextSibling; if(!next2) { next2 = xCreateElement("DIV"); tobj.parentNode.appendChild(next2); } if(next1) next1.parentNode.insertBefore(tobj, next1); if(next2) next2.parentNode.insertBefore(target_obj, next2); doFitBorderSize(); widgetList = null; return; } } widgetList = null; // 만약 다른 위젯과 자리를 바꾸지 못하였는데 자기 부모창밖에 있는게 확인이 되면 박스 밖으로 내보낸다. var l = xPageX(tobj.parentNode); var t = xPageY(tobj.parentNode); var ll = parseInt(l,10) + parseInt(xWidth(tobj.parentNode),10); var tt = parseInt(t,10) + parseInt(xHeight(tobj.parentNode),10); if( (tobj.xDPX < l || tobj.xDPX > ll) || (tobj.xDPY < t || tobj.xDPY > tt) ) { zonePageObj.insertBefore(tobj, tobj.parentNode.parentNode.parentNode); doFitBorderSize(); return; } // 박스 밖에 있을 경우에는 다른 위젯과 자리를 바꾸거나 박스내에 들어가도록 한다 } else { // 이동하려는 위젯이 박스 위젯이 아니라면 박스 위젯들을 구해서 입력 유무를 검사한다 if(tobj.getAttribute("widget")!="widgetBox") { var boxList = xGetElementsByClassName("nullWidget", zonePageObj); for(var i=0;i<boxList.length;i++) { var target_obj = boxList[i]; xHeight(target_obj, xHeight(target_obj.parentNode)); xWidth(target_obj, xWidth(target_obj.parentNode)); var l = xPageX(target_obj); var t = xPageY(target_obj); var ll = parseInt(l,10) + parseInt(xWidth(target_obj),10); var tt = parseInt(t,10) + parseInt(xHeight(target_obj),10); if( tobj.xDPX >= l && tobj.xDPX <= ll && tobj.xDPY >= t && tobj.xDPY <= tt) { if(target_obj.className == "nullWidget") { target_obj.appendChild(tobj); // 이동을 멈춤 widgetManualEnd(); doFitBorderSize(); boxList = null; return; } } } boxList = null; } // 다른 위젯들을 구해서 자리를 바꿈 var widgetList = xGetElementsByClassName("widgetOutput",zonePageObj); for(var i=0;i<widgetList.length;i++) { var target_obj = widgetList[i]; var widget = target_obj.getAttribute("widget"); if(widget == 'widgetBox' || target_obj.parentNode != zonePageObj) continue; var l = xPageX(target_obj); var t = xPageY(target_obj); var ll = parseInt(l,10) + parseInt(xWidth(target_obj),10); var tt = parseInt(t,10) + parseInt(xHeight(target_obj),10); if( tobj != target_obj && tobj.xDPX >= l && tobj.xDPX <= ll && tobj.xDPY >= t && tobj.xDPY <= tt && tobj.parentNode == target_obj.parentNode) { var next1 = target_obj.nextSibling; if(!next1) next1 = target_obj.parentNode.lastChild; if(!next1) { next1 = xCreateElement("DIV"); target_obj.parentNode.appendChild(next1); } var next2 = tobj.nextSibling; if(!next2) { next2 = xCreateElement("DIV"); tobj.parentNode.appendChild(next2); } if(next1) next1.parentNode.insertBefore(tobj, next1); if(next2) next2.parentNode.insertBefore(target_obj, next2); doFitBorderSize(); widgetList = null; return; } } widgetList = null; } }} // 드래그 종료 (이동되는 object가 이동할 곳에 서서히 이동되는 것처럼 보이는 효과)function widgetDragEnd(tobj, px, py) { var obj = widgetGetTmpObject(tobj); widgetDisapear = widgetDisapearObject(obj, tobj); widgetDragDisable(tobj.getAttribute('id'));}// 스르르 사라지게 함 (일단 사라지게 하는 기능을 제거.. 속도 문제)function widgetDisapearObject(obj, tobj) { xInnerHtml(tobj,xInnerHtml(obj)); xInnerHtml(obj,''); xDisplay(obj, 'none'); obj.parentNode.removeChild(obj); widgetTmpObject[tobj.id] = null; return; var it = 5; var ib = 1; var x = parseInt(xPageX(obj),10); var y = parseInt(xPageY(obj),10); var ldt = (x - parseInt(xPageX(tobj),10)) / ib; var tdt = (y - parseInt(xPageY(tobj),10)) / ib; return setInterval(function() { if(ib < 1) { clearInterval(widgetDisapear); xInnerHtml(tobj,xInnerHtml(obj)); xInnerHtml(obj,''); xDisplay(obj, 'none'); obj.parentNode.removeChild(obj); widgetTmpObject[tobj.id] = null; return; } ib -= 5; x-=ldt; y-=tdt; xLeft(obj, x); xTop(obj, y); }, it/ib);}// 마우스다운 이벤트 발생시 호출됨function widgetMouseDown(e) { var evt = new xEvent(e); var obj = evt.target; while(obj && !obj.draggable) { obj = xParent(obj, true); } if(obj) { xPreventDefault(e); obj.xDPX = evt.pageX; obj.xDPY = evt.pageY; widgetDragManager.obj = obj; xAddEventListener(document, 'mouseup', widgetMouseUp, false); if (obj.dragStart) obj.dragStart(obj, evt.pageX, evt.pageY); }}// 마우스 버튼을 놓았을때 동작될 함수 (각종 이벤트 해제 및 변수 설정 초기화)function widgetMouseUp(e) { if (widgetDragManager.obj) { xPreventDefault(e); xRemoveEventListener(document, 'mouseup', widgetMouseUp, false); if (widgetDragManager.obj.dragEnd) { var evt = new xEvent(e); widgetDragManager.obj.dragEnd(widgetDragManager.obj, evt.pageX, evt.pageY); } widgetDragManager.obj = null; widgetDragManager.isDrag = false; } } // 드래그할때의 object이동등을 담당 function widgetDragMouseMove(e) { var evt = new xEvent(e); if(widgetDragManager.obj) { xPreventDefault(e); var obj = widgetDragManager.obj; var dx = evt.pageX - obj.xDPX; var dy = evt.pageY - obj.xDPY; obj.xDPX = evt.pageX; obj.xDPY = evt.pageY; if (obj.drag) { obj.drag(obj, dx, dy); } else { xMoveTo(obj, xLeft(obj) + dx, xTop(obj) + dy); } }}// 해당 object 에 더 이상 drag가 되지 않도록 설정function widgetDragDisable(id) { if (!widgetDragManager) return; var obj = xGetElementById(id); obj.draggable = false; obj.dragStart = null; obj.drag = null; obj.dragEnd = null; //obj.style.backgroundColor = obj.getAttribute('source_color'); xRemoveEventListener(obj, 'mousedown', widgetMouseDown, false); return;}// 강제로 드래그를 종료시킴function widgetManualEnd() { var tobj = widgetDragManager.obj; if(!tobj) return; xRemoveEventListener(document, 'mouseup', widgetMouseUp, false); var obj = widgetGetTmpObject(tobj); widgetDisapear = widgetDisapearObject(obj, tobj); widgetDragDisable(tobj.getAttribute('id')); widgetDragManager.obj = null; widgetDragManager.isDrag = false;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -