Viewer.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720
  1. /* Copyright (c) Business Objects 2006. All rights reserved. */
  2. if (typeof(bobj.crv.Viewer) == 'undefined') {
  3. bobj.crv.Viewer = {};
  4. }
  5. bobj.crv.Viewer.LayoutTypes = {
  6. FIXED: 'fixed',
  7. CLIENT: 'client',
  8. FITREPORT: 'fitreport'
  9. };
  10. bobj.crv.Viewer.PromptingTypes = {
  11. HTML: 'html',
  12. FLEX: 'flex'
  13. };
  14. /**
  15. * Viewer Constructor
  16. *
  17. * kwArgs.promptingType [String] Tells the viewer how to prompt in the advanced case for i params.
  18. * can be "html" if using the prompting engine or "flex" if using the JRC.
  19. * kwArgs.layoutType [String] Tells the viewer how to size itself. Can be
  20. * "client" (fill window), "fitReport", or "fixed"
  21. * kwArgs.width [Int] Width in pixels when layoutType=fixed
  22. * kwArgs.height [Int] Height in pixels when layoutType=fixed
  23. */
  24. bobj.crv.newViewer = function(kwArgs) {
  25. kwArgs = MochiKit.Base.update({
  26. id: bobj.uniqueId(),
  27. promptingType : bobj.crv.Viewer.LayoutTypes.HTML,
  28. layoutType : bobj.crv.Viewer.LayoutTypes.FIXED,
  29. visualStyle : {
  30. className : null,
  31. backgroundColor : null,
  32. borderWidth : null,
  33. borderStyle : null,
  34. borderColor : null,
  35. fontFamily : null,
  36. fontWeight : null,
  37. textDecoration : null,
  38. color : null,
  39. width : '800px',
  40. height : '600px',
  41. fontStyle : null,
  42. fontSize : null,
  43. top : "0px", /* passed by Java DHTML viewer */
  44. left : "0px" /* passed by Java DHTML viewer */
  45. }
  46. }, kwArgs);
  47. var o = newWidget(kwArgs.id);
  48. bobj.fillIn(o, kwArgs);
  49. o.widgetType = 'Viewer';
  50. o._topToolbar = null;
  51. o._botToolbar = null;
  52. o._reportAlbum = null;
  53. o._separator = null;
  54. o._print = null;
  55. o._export = null;
  56. o._promptDlg = null;
  57. o._reportProcessing = null;
  58. o._eventListeners = [];
  59. // Attach member functions
  60. o.initOld = o.init;
  61. o.boundaryControl = new bobj.crv.BoundaryControl(kwArgs.id + "_bc");
  62. MochiKit.Base.update(o, bobj.crv.Viewer);
  63. return o;
  64. };
  65. bobj.crv.Viewer.addChild = function(widget) {
  66. if (widget.widgetType == 'ReportAlbum') {
  67. this._reportAlbum = widget;
  68. }
  69. else if (widget.widgetType == 'Toolbar') {
  70. if (widget.layoutAlign == 'bottom') {
  71. this._botToolbar = widget;
  72. }
  73. else {
  74. this._topToolbar = widget;
  75. this._separator = bobj.crv.newSeparator();
  76. }
  77. }
  78. else if (widget.widgetType == 'PrintUI') {
  79. this._print = widget;
  80. }
  81. else if (widget.widgetType == 'ExportUI') {
  82. this._export = widget;
  83. }
  84. else if (widget.widgetType == 'ReportProcessingUI') {
  85. this._reportProcessing = widget;
  86. }
  87. };
  88. /**
  89. * This function will remove flash activation boxes displayed by IE
  90. * by replacing each flash object by its clone.
  91. */
  92. bobj.crv.Viewer.removeFlashActivations = function() {
  93. if(_ie && this.layer && this.layer.getElementsByTagName) {
  94. var flashObjects = this.layer.getElementsByTagName("object");
  95. for(var i = 0 ; i < flashObjects.length; i++) {
  96. var flashObject = flashObjects[i];
  97. var flashObjectClone = flashObject.cloneNode(true);
  98. var flashObjectParent = flashObject.parentNode;
  99. var flashObjectSibling = flashObject.nextSibling;
  100. if(flashObjectParent && flashObjectClone) {
  101. flashObjectParent.removeChild(flashObject);
  102. flashObjectParent.insertBefore(flashObjectClone, flashObjectSibling);
  103. flashObjectClone.outerHTML = flashObjectClone.outerHTML;
  104. }
  105. }
  106. }
  107. };
  108. bobj.crv.Viewer.getHTML = function() {
  109. var h = bobj.html;
  110. var layerStyle = {
  111. overflow: 'hidden',
  112. position: 'relative',
  113. left : this.visualStyle.left,
  114. top : this.visualStyle.top
  115. };
  116. var html = h.DIV({dir: 'ltr', id:this.id, style:layerStyle, 'class':'dialogzone'},
  117. this._topToolbar ? this._topToolbar.getHTML() : '',
  118. this._separator ? this._separator.getHTML() : '',
  119. this._reportAlbum ? this._reportAlbum.getHTML() : '',
  120. this._botToolbar ? this._botToolbar.getHTML() : '');
  121. return html + bobj.crv.getInitHTML(this.widx);
  122. };
  123. bobj.crv.Viewer._onWindowResize = function() {
  124. if(this._currWinSize.w != winWidth() || this._currWinSize.h != winHeight()) {
  125. this._doLayout();
  126. this._currWinSize.w = winWidth();
  127. this._currWinSize.h = winHeight();
  128. }
  129. };
  130. bobj.crv.Viewer.init = function() {
  131. this.initOld();
  132. bobj.setVisualStyle(this.layer, this.visualStyle);
  133. this._currWinSize = {w: winWidth(), h: winHeight()};
  134. var connect = MochiKit.Signal.connect;
  135. var signal = MochiKit.Signal.signal;
  136. var partial = MochiKit.Base.partial;
  137. if (this.layoutType.toLowerCase() == bobj.crv.Viewer.LayoutTypes.CLIENT) {
  138. connect(window, 'onresize', this, '_onWindowResize');
  139. }
  140. if(this.layer && _ie && bobj.checkParent(this.layer,"TABLE")) {
  141. connect(window, 'onload', this, '_doLayoutOnLoad'); //delays the call to doLayout to ensure all dom elemment's width and height are set beforehand.
  142. this._oldCssVisibility = this.css.visibility;
  143. this.css.visibility = "hidden";
  144. }
  145. else {
  146. this._doLayout();
  147. }
  148. if (this._topToolbar) { // TODO do for each toolbar
  149. connect(this._topToolbar, 'showGroupTree', this, '_onShowGroupTreeClick');
  150. connect(this._topToolbar, 'showParamPanel', this, '_onShowParamPanelClick');
  151. connect(this._topToolbar, 'zoom', partial(signal, this, 'zoom'));
  152. connect(this._topToolbar, 'drillUp', partial(signal, this, 'drillUp'));
  153. // Page Navigation events
  154. connect(this._topToolbar, 'firstPage', partial(signal, this, 'firstPage'));
  155. connect(this._topToolbar, 'prevPage', partial(signal, this, 'prevPage'));
  156. connect(this._topToolbar, 'nextPage', partial(signal, this, 'nextPage'));
  157. connect(this._topToolbar, 'lastPage', partial(signal, this, 'lastPage'));
  158. connect(this._topToolbar, 'selectPage', partial(signal, this, 'selectPage'));
  159. connect(this._topToolbar, 'refresh', partial(signal, this, 'refresh'));
  160. connect(this._topToolbar, 'search', partial(signal, this, 'search'));
  161. connect(this._topToolbar, 'export', partial(signal, this, 'export'));
  162. connect(this._topToolbar, 'print', partial(signal, this, 'print'));
  163. }
  164. if (this._reportAlbum) {
  165. connect(this._reportAlbum, 'resizeToolPanel', partial(signal, this, 'resizeToolPanel'));
  166. connect(this._reportAlbum, 'selectView', this, '_onSelectView');
  167. connect(this._reportAlbum, 'removeView', this, '_onRemoveView');
  168. connect(this._reportAlbum, 'grpDrilldown', partial(signal, this, 'grpDrilldown'));
  169. connect(this._reportAlbum, 'grpNodeRetrieveChildren', partial(signal, this, 'grpNodeRetrieveChildren'));
  170. connect(this._reportAlbum, 'grpNodeCollapse', partial(signal, this, 'grpNodeCollapse'));
  171. connect(this._reportAlbum, 'grpNodeExpand', partial(signal, this, 'grpNodeExpand'));
  172. if (this._topToolbar) {
  173. var panelType = this._reportAlbum._curView.toolPanel.initialViewType;
  174. this._topToolbar.updateToolPanelButtons(panelType);
  175. }
  176. }
  177. if (this._print) {
  178. connect(this._print, 'printSubmitted', partial(signal, this, 'printSubmitted'));
  179. }
  180. if (this._export) {
  181. connect(this._export, 'exportSubmitted', partial(signal, this, 'exportSubmitted'));
  182. }
  183. this._updateRefreshButton();
  184. this._loadReportPageContent();
  185. this.scrollToHighlighted();
  186. connect(window, 'onload', this, 'removeFlashActivations');
  187. signal(this, 'initialized');
  188. };
  189. bobj.crv.Viewer._updateRefreshButton = function() {
  190. if(this._reportAlbum) {
  191. var currentView = this._reportAlbum.getSelectedView();
  192. if(currentView) {
  193. if(!currentView.isMainReport()) {
  194. this.disableRefreshButton(true);
  195. }
  196. }
  197. }
  198. };
  199. bobj.crv.Viewer._loadReportPageContent = function() {
  200. var reportPage = this.getReportPage();
  201. if(reportPage) {
  202. reportPage.loadContent();
  203. }
  204. };
  205. bobj.crv.Viewer._doLayoutOnLoad = function() {
  206. this.css.visibility = this._oldCssVisibility;
  207. this._doLayout();
  208. };
  209. bobj.crv.Viewer._doLayout = function() {
  210. var topToolbarH = this._topToolbar ? this._topToolbar.getHeight() : 0;
  211. var topToolbarW = this._topToolbar ? this._topToolbar.getWidth() : 0;
  212. var botToolbarH = this._botToolbar ? this._botToolbar.getHeight() : 0;
  213. var separatorH = this._separator ? this._separator.getHeight() : 0;
  214. var layout = this.layoutType.toLowerCase();
  215. if (bobj.crv.Viewer.LayoutTypes.CLIENT == layout) {
  216. this.css.width = '100%';
  217. this.css.height = '100%';
  218. }
  219. else if (bobj.crv.Viewer.LayoutTypes.FITREPORT == layout) {
  220. var albumSize = this._reportAlbum.getBestFitSize();
  221. var viewerWidth = (albumSize.width < topToolbarW) ? topToolbarW : albumSize.width;
  222. var viewerHeight = (albumSize.height + topToolbarH + botToolbarH + separatorH);
  223. this.css.height = viewerHeight + 'px';
  224. this.css.width = viewerWidth + 'px';
  225. }
  226. else { // fixed layout
  227. this.css.width = this.visualStyle.width;
  228. this.css.height = this.visualStyle.height;
  229. }
  230. var innerW = this.getWidth();
  231. var innerH = this.getHeight();
  232. var albumH = Math.max(0, innerH - topToolbarH - botToolbarH - separatorH);
  233. if (this._reportAlbum) {
  234. this._reportAlbum.resizeOuter(innerW, albumH);
  235. }
  236. if (this._botToolbar) {
  237. this._botToolbar.move(0, topToolbarH + separatorH + albumH);
  238. }
  239. if (this._print && this._print.layer) {
  240. this._print.center();
  241. }
  242. if (this._export && this._export.layer) {
  243. this._export.center();
  244. }
  245. if (this._reportProcessing && this._reportProcessing.layer) {
  246. this._reportProcessing.center();
  247. }
  248. var viewerP = MochiKit.Style.getElementPosition(this.layer);
  249. var viewerD = MochiKit.Style.getElementDimensions(this.layer);
  250. if (this._modalBackground)
  251. {
  252. var MODAL_STYLE = this._modalBackground.style;
  253. MODAL_STYLE.top = viewerP.y + "px";
  254. MODAL_STYLE.left = viewerP.x + "px";
  255. MODAL_STYLE.width = viewerD.w + "px";
  256. MODAL_STYLE.height = viewerD.h + "px";
  257. }
  258. var bodyD = bobj.getBodyScrollDimension();
  259. var isViewerCutOff = ((viewerP.x + viewerD.w) >= bodyD.w) || ((viewerP.y + viewerD.h) >= bodyD.h);
  260. if(isViewerCutOff && (layout != bobj.crv.Viewer.LayoutTypes.CLIENT)) {
  261. /* BoundaryControl adds a hidden div with the same dimension and position as current viewer to body
  262. to fix the problem of IE regarding scrollbar that are hidden when left + viewer's width > body's width
  263. */
  264. this.boundaryControl.updateBoundary(viewerD.w, viewerD.h, viewerP.x, viewerP.y);
  265. }
  266. else {
  267. this.boundaryControl.updateBoundary(0, 0, 0, 0);
  268. }
  269. this._adjustWindowScrollBars();
  270. };
  271. bobj.crv.Viewer._onShowGroupTreeClick = function(isChecked) {
  272. // translate checked==false to panelType==none
  273. var panelType = isChecked ? bobj.crv.ToolPanelType.GroupTree : bobj.crv.ToolPanelType.None;
  274. this.selectToolPanel(panelType);
  275. };
  276. bobj.crv.Viewer._onShowParamPanelClick = function(isChecked) {
  277. // translate checked==false to panelType==none
  278. var panelType = isChecked ? bobj.crv.ToolPanelType.ParameterPanel : bobj.crv.ToolPanelType.None;
  279. this.selectToolPanel(panelType);
  280. };
  281. bobj.crv.Viewer.selectToolPanel = function(panelType) {
  282. var Type = bobj.crv.ToolPanelType;
  283. if (this._reportAlbum) {
  284. this._reportAlbum._curView.toolPanel.setView (panelType);
  285. this._reportAlbum._curView.setDisplayToolPanel(Type.None !== panelType);
  286. }
  287. if (Type.GroupTree == panelType) {
  288. MochiKit.Signal.signal(this, 'showGroupTree');
  289. }
  290. else if (Type.ParameterPanel == panelType) {
  291. MochiKit.Signal.signal(this, 'showParamPanel');
  292. }
  293. else if (Type.None == panelType) {
  294. MochiKit.Signal.signal(this, 'hideToolPanel');
  295. }
  296. };
  297. bobj.crv.Viewer._onSelectView = function(view) {
  298. MochiKit.Signal.signal(this, 'selectView', view);
  299. };
  300. bobj.crv.Viewer._onRemoveView = function(view) {
  301. MochiKit.Signal.signal(this, 'removeView', view);
  302. };
  303. bobj.crv.Viewer.resize = function(w, h) {
  304. if (bobj.isNumber(w)) {
  305. w = w + 'px';
  306. }
  307. if (bobj.isNumber(h)) {
  308. h = h + 'px';
  309. }
  310. this.visualStyle.width = w;
  311. this.visualStyle.height = h;
  312. this._doLayout();
  313. };
  314. bobj.crv.Viewer.disableRefreshButton = function(isDisabled) {
  315. if (this._topToolbar) {
  316. var refreshButton = this._topToolbar.refreshButton;
  317. if(refreshButton) {
  318. refreshButton.setDisabled(isDisabled);
  319. }
  320. }
  321. if (this._botToolbar) {
  322. var refreshButton = this._botToolbar.refreshButton;
  323. if(refreshButton) {
  324. refreshButton.setDisabled(isDisabled);
  325. }
  326. }
  327. };
  328. /**
  329. * Set the page number. Updates toolbars with current page and number of pages
  330. * info.
  331. *
  332. * @param curPageNum [String]
  333. * @param numPages [String] (eg. "1" or "1+");
  334. */
  335. bobj.crv.Viewer.setPageNumber = function(curPageNum, numPages) {
  336. if (this._topToolbar) {
  337. this._topToolbar.setPageNumber(curPageNum, numPages);
  338. }
  339. if (this._botToolbar) {
  340. this._botToolbar.setPageNumber(curPageNum, numPages);
  341. }
  342. };
  343. /**
  344. * Display the prompt dialog.
  345. *
  346. * @param html [string] HTML fragment to display inside the dialog's form.
  347. */
  348. bobj.crv.Viewer.showPromptDialog = function(html) {
  349. html = html || '';
  350. if (!this._promptDlg) {
  351. var promptDialog_ShowCB = MochiKit.Base.bind(this._onShowPromptDialog, this);
  352. var promptDialog_HideCB = MochiKit.Base.bind(this._onHidePromptDialog, this);
  353. this._promptDlg = bobj.crv.params.newParameterDialog({id: this.id + '_promptDlg', showCB : promptDialog_ShowCB, hideCB : promptDialog_HideCB});
  354. }
  355. if(this._promptDlg.isVisible()) {
  356. this.hidePromptDialog(); // Must close the current dialog before changing the html
  357. }
  358. //The reason for saving document.onkeypress is that prompt dialog steals the document.onkeypress and never sets it back
  359. this._originalDocumentOnKeyPress = document.onkeypress; // Must be set before .setPromptHTML(html) as this function call modifies document.onkeypress;
  360. this._promptDlg.setPromptHTML(html);
  361. setTimeout(MochiKit.Base.bind(this._promptDlg.show,this._promptDlg,true),1);
  362. };
  363. bobj.crv.Viewer.getPromptingType = function() {
  364. return this.promptingType;
  365. };
  366. bobj.crv.Viewer.showFlexPromptDialog = function(paramCtrl, param, servletURL) {
  367. var FLEXUI = bobj.crv.params.FlexParameterUI;
  368. if (!FLEXUI.checkFlashPlayer()){
  369. var msg = L_bobj_crv_FlashRequired;
  370. this.showError(msg.substr(0, msg.indexOf('{0}')), FLEXUI.getInstallHTML());
  371. return;
  372. }
  373. FLEXUI.setCurrentIParamInfo(this.id, paramCtrl, param);
  374. FLEXUI.setViewerLayoutType(this.id, this.layoutType);
  375. FLEXUI.setCloseDialogCallBack(this.id, MochiKit.Base.bind(this.hideFlexPromptDialog, this));
  376. if (!this._promptDlg) {
  377. this._modalBackground = document.createElement('div');
  378. this._modalBackground.id = bobj.uniqueId();
  379. var vPos = MochiKit.Style.getElementPosition(this.layer);
  380. var vDim = MochiKit.Style.getElementDimensions(this.layer);
  381. var MODAL_STYLE = this._modalBackground.style;
  382. MODAL_STYLE.top = vPos.y;
  383. MODAL_STYLE.left = vPos.x;
  384. MODAL_STYLE.width = vDim.w;
  385. MODAL_STYLE.height = vDim.h;
  386. MODAL_STYLE.backgroundColor = '#888888';
  387. MODAL_STYLE.position = 'absolute';
  388. MODAL_STYLE.opacity = 0.30;
  389. MODAL_STYLE.filter = 'alpha(opacity=30)';
  390. MODAL_STYLE.zIndex = bobj.constants.modalLayerIndex - 2;
  391. document.body.appendChild(this._modalBackground);
  392. this._promptDlg = document.createElement('div');
  393. this._promptDlg.id = this.id + '_promptDlg';
  394. var PROMPT_STYLE = this._promptDlg.style;
  395. PROMPT_STYLE.border = '1px';
  396. PROMPT_STYLE.borderStyle = 'solid';
  397. PROMPT_STYLE.borderColor = '#000000';
  398. PROMPT_STYLE.position = 'absolute';
  399. PROMPT_STYLE.zIndex = bobj.constants.modalLayerIndex;
  400. var divID = bobj.uniqueId();
  401. this._promptDlg.innerHTML = "<div id=\"" + divID + "\" name=\"" + divID + "\"></div>";
  402. document.body.appendChild(this._promptDlg);
  403. FLEXUI.createSWF(this.id, divID, servletURL, true);
  404. }
  405. else
  406. {
  407. this._promptDlg.style.display = '';
  408. FLEXUI.init(this.id);
  409. }
  410. this._modalBackground.style.visibility = 'visible';
  411. };
  412. bobj.crv.Viewer._onShowPromptDialog = function() {
  413. this._adjustWindowScrollBars();
  414. };
  415. bobj.crv.Viewer._onHidePromptDialog = function() {
  416. this._adjustWindowScrollBars();
  417. document.onkeypress = this._originalDocumentOnKeyPress;
  418. };
  419. /**
  420. * Hide the prompt dialog
  421. */
  422. bobj.crv.Viewer.hidePromptDialog = function() {
  423. if (this._promptDlg && this._promptDlg.isVisible()) {
  424. this._promptDlg.show(false);
  425. }
  426. };
  427. /**
  428. * Hide the flex prompt dialog
  429. */
  430. bobj.crv.Viewer.hideFlexPromptDialog = function() {
  431. if (this._promptDlg) {
  432. if (_ie)
  433. {
  434. // IE has an issue where if a user calls back from a swf
  435. // and closes the containing div then when the div is shown
  436. // again the swf will lose any external interface calls. To get around
  437. // this we must set the focus to something other than the swf first
  438. // before hiding the window.
  439. this._promptDlg.focus();
  440. }
  441. this._promptDlg.style.visibility = 'hidden';
  442. this._promptDlg.style.display = 'none';
  443. this._modalBackground.style.visibility = 'hidden';
  444. }
  445. };
  446. bobj.crv.Viewer._adjustWindowScrollBars = function() {
  447. if(_ie && this.layoutType == bobj.crv.Viewer.LayoutTypes.CLIENT &&
  448. this._promptDlg && this._promptDlg.layer && MochiKit.DOM.currentDocument().body) {
  449. var bodyOverFlow, pageOverFlow;
  450. var body = MochiKit.DOM.currentDocument().body;
  451. var promptDlgLayer = this._promptDlg.layer;
  452. if(this.getReportPage() && this.getReportPage().layer) {
  453. var reportPageLayer= this.getReportPage().layer;
  454. }
  455. if(!window["bodyOverFlow"]) {
  456. window["bodyOverFlow"] = MochiKit.DOM.getStyle(body,'overflow');
  457. }
  458. if(body.offsetHeight < (promptDlgLayer.offsetTop + promptDlgLayer.offsetHeight)) {
  459. if(window["bodyOverFlow"] == "hidden") {
  460. bodyOverFlow = "scroll";
  461. }
  462. pageOverFlow = "hidden";
  463. }
  464. else {
  465. bodyOverFlow = window["bodyOverFlow"];
  466. pageOverFlow = "auto";
  467. }
  468. body.style.overflow = bodyOverFlow;
  469. if(reportPageLayer) {
  470. reportPageLayer.style.overflow = pageOverFlow;
  471. }
  472. }
  473. };
  474. /**
  475. * Display an error message dialog.
  476. *
  477. * @param text [String] Short, user-friendly error message
  478. * @param details [String] Technical info that's hidden unless the user chooses to see it
  479. */
  480. bobj.crv.Viewer.showError = function(text, details) {
  481. var dlg = bobj.crv.ErrorDialog.getInstance();
  482. dlg.setText(text, details);
  483. dlg.setTitle(L_bobj_crv_Error);
  484. dlg.show(true);
  485. };
  486. /**
  487. * Update the UI using the given properties
  488. *
  489. * @param update [Object] Component properties
  490. */
  491. bobj.crv.Viewer.update = function(update , updatePack) {
  492. if (!update) {
  493. return;
  494. }
  495. for(var childNum in update.children) {
  496. var child = update.children[childNum];
  497. if(child) {
  498. switch(child.cons) {
  499. case "bobj.crv.newReportAlbum":
  500. if (this._reportAlbum && updatePack.updateReportAlbum()) {
  501. this._reportAlbum.update(child, updatePack);
  502. }
  503. break;
  504. case "bobj.crv.newToolbar":
  505. if (this._topToolbar && updatePack.updateToolbar()) {
  506. this._topToolbar.update(child, updatePack);
  507. }
  508. break;
  509. }
  510. }
  511. }
  512. if(updatePack.refreshLayout()) {
  513. this._doLayout();
  514. }
  515. if(updatePack.requiresScrolling()) {
  516. this.scrollToHighlighted();
  517. }
  518. };
  519. bobj.crv.Viewer.getParameterPanel = function() {
  520. if (this._reportAlbum) {
  521. var view = this._reportAlbum.getSelectedView();
  522. if (view && view.toolPanel) {
  523. return view.toolPanel.getParameterPanel();
  524. }
  525. }
  526. };
  527. bobj.crv.Viewer.getReportPage = function() {
  528. if (this._reportAlbum) {
  529. var view = this._reportAlbum.getSelectedView();
  530. if (view && view.toolPanel) {
  531. return view.reportPage;
  532. }
  533. }
  534. };
  535. bobj.crv.Viewer.scrollToHighlighted = function() {
  536. var currentView = this._reportAlbum.getSelectedView();
  537. var reportPage = getLayer(currentView.reportPage.id);
  538. var crystalHighlighted = getLayer("CrystalHighLighted");
  539. if(!crystalHighlighted || !reportPage) {
  540. return;
  541. }
  542. if(MochiKit.DOM.isParent(crystalHighlighted,reportPage)) {
  543. var layoutType = this.layoutType.toLowerCase();
  544. var position;
  545. if(layoutType == bobj.crv.Viewer.LayoutTypes.FITREPORT) {
  546. position = MochiKit.Style.getElementPosition(crystalHighlighted);
  547. window.scrollTo(position.x,position.y);
  548. }
  549. else {
  550. position = MochiKit.Style.getElementPosition(crystalHighlighted,reportPage);
  551. reportPage.scrollLeft = position.x;
  552. reportPage.scrollTop = position.y;
  553. }
  554. }
  555. };
  556. bobj.crv.Viewer.addViewerEventListener = function (e, l) {
  557. var ls = this._eventListeners[e];
  558. if (!ls) {
  559. this._eventListeners[e] = [l];
  560. return;
  561. }
  562. ls[ls.length] = l;
  563. };
  564. bobj.crv.Viewer.removeViewerEventListener = function (e, l) {
  565. var ls = this._eventListeners[e];
  566. if (ls) {
  567. for (var i = 0, lsLen = ls.length; i < lsLen; i++) {
  568. if (ls[i] == l){
  569. ls.splice(i, 1);
  570. return;
  571. }
  572. }
  573. }
  574. };
  575. bobj.crv.Viewer.getEventListeners = function (e) {
  576. return this._eventListeners[e];
  577. };
  578. bobj.crv.BoundaryControl = function(id) {
  579. this.id = id;
  580. return this;
  581. };
  582. bobj.crv.BoundaryControl.prototype = {
  583. updateBoundary : function(width,height,left,top) {
  584. if(!this.layer) {
  585. this._init();
  586. }
  587. if(this.layer) {
  588. this.layer.style.width = width;
  589. this.layer.style.height = height;
  590. this.layer.style.left = left;
  591. this.layer.style.top = top;
  592. }
  593. },
  594. _init: function() {
  595. var style= {
  596. display:'block',
  597. visibility:'hidden',
  598. position:'absolute'
  599. };
  600. if(!this.layer){
  601. var html = bobj.html.DIV({id : this.id, style : style});
  602. append2(_curDoc.body,html);
  603. this.layer = getLayer(this.id);
  604. }
  605. }
  606. }