(function () {
// 计算黄金分割点的位置
// bodySize : 整个页面的Body的大小
// windowSize : 窗口的大小
function _calculateGoldenPosition(bodySize, windowSize) {
var top = (bodySize.height - (bodySize.height / 1.618)) - windowSize.height / 2;
if (top < 0) {
top = 0;
}
var left = (bodySize.width - windowSize.width) / 2;
if (left < 0) {
left = 0;
}
return { left: left, top: top };
}
// 计算中间的位置
// bodySize : 整个页面的Body的大小
// windowSize : 窗口的大小
function _calculateCenterPosition(bodySize, windowSize) {
var top = (bodySize.height - windowSize.height) / 2;
if (top < 0) {
top = 0;
}
var left = (bodySize.width - windowSize.width) / 2;
if (left < 0) {
left = 0;
}
return { left: left, top: top };
}
// 创建IFrame节点片段
function _createIFrameHtml(iframeUrl, iframeName) {
return '';
}
// 获取窗体的外部容器
function _getWrapperNode(panel) {
return Ext.get(panel.el.findParentNode('.x-window-wrapper'));
}
// FineUI窗口域(Window)
X.wnd = {
closeButtonTooltip: "Close this window",
formModifiedConfirmTitle: "Close Confrim",
formModifiedConfirmMsg: "Current form has been modified.
Abandon changes?",
createIFrameHtml: function (iframeUrl, iframeName) {
return _createIFrameHtml(iframeUrl, iframeName);
},
// 显示一个弹出窗体
// 在 panel 实例中,定义了几个自定义属性,用于标示此实例的状态(在PanelBase中定义)
// 属性 - x_iframe/x_iframe_url/x_iframe_name/x_iframe_loaded
// panel : 当前弹出的窗体(Ext-Window)
// iframeUrl : 弹出窗体中包含的IFrame的地址
// windowTitle : 弹出窗体的标题
// left/top : 弹出窗体的左上角坐标(如果为空字符串,则使用中间位置或黄金分隔位置)
// isGoldenSection : 弹出窗体位于页面的黄金分隔位置
// hiddenHiddenFieldID : 在页面中放置表单字段记录此窗体是否弹出,也页面回发时保持状态用
show: function (panel, iframeUrl, windowTitle, left, top, isGoldenSection, hiddenHiddenFieldID) {
var target = X.util.getTargetWindow(panel['x_property_target']);
var guid = panel['x_property_guid'];
if (window.frameElement && target !== window) {
// 当前页面在IFrame中(也即时 window.frameElement 存在)
// 此弹出窗体需要在父窗口中弹出
if (!target.X[guid]) {
// 父窗口中已经创建了这个Ext-Window对象
var wrapper = guid + '_wrapper';
if (!target.Ext.get(wrapper)) {
target.X.util.appendFormNode('
');
} else {
target.Ext.get(wrapper).dom.innerHTML = '';
}
// Ext.apply 的第三个参数是default obejct
var config = Ext.apply({}, {
'renderTo': wrapper,
//'manager': target.X.x_window_manager,
'id': guid,
//'box_hide': null,
//'box_hide_refresh': null,
//'box_hide_postback': null,
// 'x_show': null,
// 在 X.wnd.getActiveWindow 中需要用到这个参数
//'box_property_frame_element_name': window.frameElement.name,
//'box_property_client_id': panel.getId(),
'x_property_window': window,
'x_property_ext_window': panel
}, panel.initialConfig);
// 在父页面中创建一个Ext-Window的幻影(拷贝)
// 在这个幻影中,通过“x_property_frame_element_name”属性标示这是一个幻影
// x_property_frame_element_name: 并且真正的Ext-Window在当前页面中的哪个IFrame中
// x_property_client_id: 并且真正的Ext-Window在所在页面中的客户端ID
target.X[guid] = target.Ext.create('Ext.window.Window', config);
}
panel = target.X[guid];
}
if (iframeUrl !== '') {
X.wnd.updateIFrameNode(panel, iframeUrl);
}
if (windowTitle != '') {
panel.setTitle(windowTitle);
}
var bodySize = target.window.Ext.getBody().getViewSize();
// // Update container's width and height
// var wrapperNode = _getWrapperNode(panel);
// wrapperNode.setWidth(bodySize.width).setHeight(bodySize.height);
//
// // 显示窗体之前,记着显示外部的容器
// wrapperNode.show();
Ext.get(hiddenHiddenFieldID).dom.value = 'false';
panel.show();
if (left !== '' && top !== '') {
panel.setPosition(parseInt(left, 10), parseInt(top, 10));
} else {
var panelSize = panel.getSize(), leftTop;
if (isGoldenSection) {
leftTop = _calculateGoldenPosition(bodySize, panelSize);
} else {
leftTop = _calculateCenterPosition(bodySize, panelSize);
//panel.alignTo(target.Ext.getBody(), "c-c");
}
panel.setPosition(leftTop.left, leftTop.top);
}
if (panel.maximizable) {
X.wnd.fixMaximize(panel);
// 改变浏览器大小可以自动调整窗体控件的大小(窗体控件最大化时)
target.Ext.EventManager.onWindowResize(function () {
X.wnd.fixMaximize(panel);
});
}
},
// 获取真正的Window实例
getRealWindow: function (panel, targetName, guid) {
var target = X.util.getTargetWindow(targetName);
if (window.frameElement && target !== window) {
// 从父页面中查找幻影Ext-Window对象
panel = target.X[guid];
}
return panel;
},
// 隐藏Ext-Window(比如用户点击了关闭按钮)
hide: function (panel, targetName, enableIFrame, hiddenHiddenFieldID, guid) {
var wnd = X.wnd.getRealWindow(panel, targetName, guid);
// 修改当前页面中记录弹出窗口弹出状态的隐藏表单字段
Ext.get(hiddenHiddenFieldID).dom.value = 'true';
// 如果启用IFrame,则清空IFrame的内容,防止下次打开时显示残影
if (enableIFrame) {
//wnd.body.query('iframe')[0].src = 'about:blank';
//wnd['x_iframe_url'] = 'about:blank';
wnd['x_iframe_loaded'] = false;
wnd.update("");
}
wnd.hide();
},
// 最大化
maximize: function (panel, targetName, guid) {
var wnd = X.wnd.getRealWindow(panel, targetName, guid);
wnd.maximize();
},
// 最小化
minimize: function (panel, targetName, guid) {
var wnd = X.wnd.getRealWindow(panel, targetName, guid);
wnd.minimize();
},
// 恢复窗体大小
restore: function (panel, targetName, guid) {
var wnd = X.wnd.getRealWindow(panel, targetName, guid);
wnd.restore();
},
// 这是 Extjs 的一个 bug,如果 Window 控件不是渲染在 document.body 中,则 maximize 函数并不能真正的最大化
// 现在的 Window 控件时渲染在 from 表单里面的一个 DIV 中的
fixMaximize: function (panel) {
if (panel.maximized) {
var target = X.util.getTargetWindow(panel['x_property_target']);
var bodySize = target.window.Ext.getBody().getViewSize();
panel.setSize(bodySize.width, bodySize.height);
// 不要忘记左上角坐标
panel.setPosition(0, 0);
}
},
// 创建或更新IFrame节点,同时更新panel实例中的自定义属性值
updateIFrameNode: function (panel, iframeUrl) {
var iframeUrlChanged = false;
// 如果此Panel中包含有IFrame
if (panel && panel['x_iframe']) {
if (iframeUrl && panel['x_iframe_url'] !== iframeUrl) {
panel['x_iframe_url'] = iframeUrl;
iframeUrlChanged = true;
}
// 如果此Panel中包含的IFrame还没有加载
if (!panel['x_iframe_loaded']) {
window.setTimeout(function () {
// 如果此Panel已经创建完毕,但有时Panel可能是延迟创建的(比如TabStrip中的Tab,只有点击这个Tab时才创建Tab的内容)
panel['x_iframe_loaded'] = true;
panel.update(_createIFrameHtml(panel['x_iframe_url'], panel['x_iframe_name']));
}, 0);
}
else {
if (iframeUrlChanged) {
panel.body.query('iframe')[0].src = panel['x_iframe_url'];
}
}
}
},
// 处理表单中有任何字段发生变化时,关闭当前窗口时的提示
confirmFormModified: function (closeFn) {
if (X.util.isPageStateChanged()) {
Ext.MessageBox.show({
title: X.wnd.formModifiedConfirmTitle,
msg: X.wnd.formModifiedConfirmMsg,
buttons: Ext.MessageBox.OKCANCEL,
icon: 'ext-mb-warning',
fn: function (btn) {
if (btn == 'cancel') {
return false;
} else {
closeFn.apply(window, arguments);
}
}
});
} else {
closeFn.apply(window, arguments);
}
},
// Ext-Window中IFrame里页面中的表单发生变化时弹出确认消息
extWindowIFrameFormModifiedConfirm: function (panel, closeFn) {
// 这个页面所在的Window对象
var pageWindow = X.wnd.getIFrameWindowObject(panel);
// 如果弹出的页面没能正常加载(比如说网络暂时连接中断)
// 则直接关闭弹出的Ext-Window,而不会去检查页面表单变化,因为页面对象不存在
if (pageWindow.X) {
pageWindow.X.wnd.confirmFormModified(closeFn);
}
else {
panel.x_hide();
}
},
// 取得panel的Iframe节点的window对象(可以是幻影Ext-Window中的页面window对象)
getIFrameWindowObject: function (panel) {
// 当前页面在IFrame中(也即时 window.frameElement 存在)
// 此Ext-Window需要在父窗口中弹出
if (window.frameElement && panel['x_property_show_in_parent']) {
panel = parent.X[panel['x_property_guid']];
}
var iframeNode = Ext.query('iframe', panel.body.dom);
if (iframeNode.length === 0) {
// 当前panel(Ext-Window)不包含iframe
return window;
}
else {
return iframeNode[0].contentWindow;
}
},
// 这是老方法,虽然也能正常工作,但是绕了一个弯 => 在幻影ExtWindow中保存当前IFrame的parent.window以及iframe name。
// 其实没必要,直接在幻影ExtWindow中保存真实的ExtWindow对象即可(只不过这个对象可能是在其他页面中)。
// 取得当前页面所在的Ext-Window实际的对象,返回[实际的Ext-Window对象,实际的Ext-Window对象所在的window对象]
// 注意
// 1. 如果是在当前页面弹出窗口的话,“实际的Ext-Window对象”存在于父页面(parent.box)中
// 2. 如果是在父页面弹出窗口的话,“实际的Ext-Window对象”存在于父页面(parent)下面的IFrame页面中
// 3. 通过判断当前的Ext-Window是否存在“box_property_frame_element_name”属性,可知当前的Ext-Window是否幻影(即时实际Ext-Window对象在父页面的一个拷贝),在X.wnd.show中设置的属性
/*
getActiveWindow: function () {
var activeWindow = parent.window;
var activeExtWindow = parent.X.x_window_manager.getActive();
if (activeExtWindow['box_property_frame_element_name']) {
var iframeParentWindow = activeExtWindow['box_property_parent_window'];
activeWindow = iframeParentWindow.Ext.query('iframe[name=' + activeExtWindow['box_property_frame_element_name'] + ']')[0].contentWindow;
activeExtWindow = activeWindow.Ext.getCmp(activeExtWindow['box_property_client_id']);
}
return [activeExtWindow, activeWindow];
},
*/
getActiveWindow: function () {
var activeWindow = parent.window;
var activeExtWindow = parent.Ext.WindowManager.getActive(); //parent.X.x_window_manager.getActive();
if (activeExtWindow['x_property_window']) {
activeWindow = activeExtWindow['x_property_window'];
activeExtWindow = activeExtWindow['x_property_ext_window'];
}
return [activeExtWindow, activeWindow];
},
// // 从url中提取box_parent_client_id参数的值
// window.box_getParentClientIdFromUrl = function() {
// var result = '';
// var url = window.location.href;
// var startIndex = url.indexOf('box_parent_client_id');
// if (startIndex >= 0) {
// result = url.substr(startIndex + 'box_parent_client_id'.length + 1);
// }
// return result;
// };
// // 取得当前页面所在窗口,返回数组[当前窗口对象,当前窗口所在的window对象]
// window.box_getActiveWindow = function() {
// var aw = null;
// var window2 = null;
// var parentClientID = box_getParentClientIdFromUrl();
// if (parentClientID) {
// window2 = parent.window;
// aw = parent.window.Ext.getCmp(parentClientID);
// if (aw.box_property_frame_element_name) {
// window2 = parent.Ext.query('iframe[name=' + aw.box_property_frame_element_name + ']')[0].contentWindow;
// aw = eval('window2.X.' + aw.id);
// }
// }
// if (aw) {
// return [aw, window2];
// }
// else {
// return null;
// }
// };
// 向弹出此Ext-Window的页面写入值
writeBackValue: function () {
var aw = X.wnd.getActiveWindow();
var controlIds = aw[0]['x_property_save_state_control_client_ids'];
var controlCount = Math.min(controlIds.length, arguments.length);
for (var i = 0; i < controlCount; i++) {
aw[1].Ext.getCmp(controlIds[i]).setValue(arguments[i]);
}
// var controlClientIds = (function() {
// if (aw) {
// return eval('aw[1].X.' + aw[0].id + '.box_string_state');
// }
// })();
// if (typeof (controlClientIds) == 'string') {
// aw[1].Ext.getCmp(controlClientIds).setValue("哈哈");
// } else {
// aw[1].Ext.getCmp(controlClientIds[0]).setValue("哈哈");
// var controlValues = ['哈哈 的值', '哈哈 的值2'];
// var controlCount = Math.min(controlClientIds.length - 1, controlValues.length);
// for (var i = 0; i < controlCount; i++) {
// aw[1].Ext.getCmp(controlClientIds[i + 1]).setValue(controlValues[i]);
// }
// }
// var aw = X.wnd.getActiveWindow();
// if (aw) {
// aw[0].box_hide();
// }
}
};
})();