You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
336 lines
10 KiB
336 lines
10 KiB
/* Copyright (c) Business Objects 2006. All rights reserved. */
|
|
|
|
/**
|
|
* ReportAlbum Constructor
|
|
*/
|
|
bobj.crv.newReportAlbum = function(kwArgs) {
|
|
var mb = MochiKit.Base;
|
|
var UPDATE = mb.update;
|
|
var BIND = mb.bind;
|
|
var ALBUM = bobj.crv.ReportAlbum;
|
|
|
|
kwArgs = UPDATE({
|
|
id: bobj.uniqueId(),
|
|
initTabIdx: 0, // Index of tab to select when initializing
|
|
width: 800,
|
|
height: 500,
|
|
displayDrilldownTab : true
|
|
}, kwArgs);
|
|
|
|
|
|
// Override TabbedZone's TabBarWidget
|
|
var tabbar = newNaviBarWidget(bobj.uniqueId(), _HorizTabTopWithClose, null, null, kwArgs.width, null, null, null, false, true, false);
|
|
var o = newTabbedZone(kwArgs.id, tabbar, kwArgs.width, kwArgs.height);
|
|
|
|
tabbar.cb = BIND(ALBUM._onSelectTab, o);
|
|
tabbar.closeTab = BIND(ALBUM._removeView, o, true);
|
|
bobj.fillIn(o, kwArgs);
|
|
o.widgetType = 'ReportAlbum';
|
|
o._views = [];
|
|
o._hideFrame = false;
|
|
|
|
// Attach member functions
|
|
o.selectOld = o.select;
|
|
UPDATE(o, ALBUM);
|
|
|
|
return o;
|
|
};
|
|
|
|
bobj.crv.ReportAlbum = {
|
|
getTabBarHeight : function() {
|
|
return this.tabs.getHeight ();
|
|
},
|
|
|
|
init : function() {
|
|
/*
|
|
* This is not nice... Copied super class' init code here so that select will be called only once.
|
|
*/
|
|
this.tzOldInit ();
|
|
this.tabs.init ();
|
|
this.showDrilldownTab (this.displayDrilldownTab);
|
|
|
|
var views = this._views;
|
|
if (views.length > 0) {
|
|
for ( var i = 0, len = views.length; i < len; i++) {
|
|
/* Since views are not initializing themself (as before through
|
|
adding bobj.crv.getInitHtml to their HTML)
|
|
it is report album's responsibility to initialize its children */
|
|
views[i].init ();
|
|
|
|
}
|
|
|
|
if (this.initTabIdx < 0 || this.initTabIdx >= views.length) {
|
|
this.initTabIdx = 0;
|
|
}
|
|
|
|
this.select (this.initTabIdx);
|
|
}
|
|
},
|
|
|
|
showDrilldownTab : function (isDisplay) {
|
|
this.displayDrilldownTab = isDisplay;
|
|
try
|
|
{
|
|
/* IE supports table-row since IE8. */
|
|
var displayStyle;
|
|
if (_ie && !_ie8Up)
|
|
displayStyle = "block";
|
|
else
|
|
displayStyle = "table-row";
|
|
this.tabs.layer.parentNode.parentNode.style.display = isDisplay ? displayStyle : "none";
|
|
}
|
|
catch(e){}
|
|
},
|
|
|
|
isDisplayDrilldownTab : function () {
|
|
return this.displayDrilldownTab;
|
|
},
|
|
|
|
setHideFrame : function(hide) {
|
|
this._hideFrame = hide;
|
|
var selectedView = this.getSelectedView ();
|
|
if (selectedView && this._hideFrame)
|
|
selectedView.hideFrame();
|
|
},
|
|
|
|
update : function(update) {
|
|
if (!update || update.cons !== "bobj.crv.newReportAlbum") {
|
|
return;
|
|
}
|
|
|
|
/* Updates all views */
|
|
for ( var i = 0, len = update.children.length; i < len; i++) {
|
|
var updateView = update.children[i];
|
|
var view = this._views[i];
|
|
if (view) {
|
|
view.update (updateView); /* updates current view */
|
|
}
|
|
}
|
|
|
|
var updateChildrenLength = update.children.length;
|
|
var currentViewsLength = this._views.length;
|
|
|
|
/* Adds any new view created by drill down action */
|
|
if (updateChildrenLength > currentViewsLength) {
|
|
for ( var i = currentViewsLength, len = updateChildrenLength; i < len; i++) {
|
|
this.delayedAddChild (bobj.crv.createWidget (update.children[i]));
|
|
}
|
|
}
|
|
/* Removes views that are have been removed from viewstate */
|
|
else if (updateChildrenLength < currentViewsLength) {
|
|
for ( var i = currentViewsLength -1, len = updateChildrenLength; i >= len; i--) {
|
|
this._removeView (false, i); /* removes non-existing views */
|
|
}
|
|
}
|
|
|
|
this.initTabIdx = update.args.initTabIdx;
|
|
this.select (this.initTabIdx);
|
|
},
|
|
|
|
/**
|
|
* @return index of the tab specified by viewstateid
|
|
*/
|
|
findTabNumber : function(viewStateId) {
|
|
var views = this._views;
|
|
for ( var i = 0, len = views.length; i < len; i++)
|
|
if (views[i].viewStateId == viewStateId)
|
|
return i;
|
|
|
|
return -1;
|
|
},
|
|
|
|
/**
|
|
* Adds view to its list of views. Since this method can be called after initialization time, its HTML
|
|
* is first added to report album, and then widget is intialized.
|
|
*/
|
|
delayedAddChild : function(view) {
|
|
this._views.push (view);
|
|
var tab = this.tabs.add(view.label, view.tooltip);
|
|
var tabHTML = this.getTabHTML (this._views.length - 1);
|
|
append (getLayer (this.id + "_container"), tabHTML);
|
|
view.init ();
|
|
},
|
|
|
|
addChild : function(view) {
|
|
if (view) {
|
|
this._views.push (view);
|
|
this.add (view.label, view.tooltip);
|
|
}
|
|
},
|
|
|
|
getHTML : function() {
|
|
var html = this.beginHTML ();
|
|
var children = this._views;
|
|
for ( var i = 0, len = children.length; i < len; ++i) {
|
|
html += this.getTabHTML (i);
|
|
}
|
|
|
|
html += this.endHTML ();
|
|
return html;
|
|
},
|
|
|
|
|
|
/**
|
|
* @param index,
|
|
* index of tab to create HTML for
|
|
* @return creates HTML for tab specified by index
|
|
*/
|
|
getTabHTML : function(index) {
|
|
var tab = this.tabs.items[index];
|
|
var view = this._views[index];
|
|
html = '';
|
|
|
|
if (tab && view) {
|
|
html += this.beginTabHTML (tab);
|
|
html += view.getHTML ();
|
|
html += this.endTabHTML ();
|
|
}
|
|
|
|
return html;
|
|
},
|
|
|
|
/**
|
|
* Resize the outer dimensions of the ReportAlbum. The standard resize method, inherited from TabbedZoneWidget, resizes the container. We
|
|
* can't override it without breaking things.
|
|
*/
|
|
resizeOuter : function(w, h) {
|
|
var tabHeight = 33;
|
|
var frameWidth = 10;
|
|
|
|
if(bobj.isNumber (h)) {
|
|
if(this.displayDrilldownTab)
|
|
h -= tabHeight;
|
|
h = Math.max(h, 0);
|
|
}
|
|
|
|
if(bobj.isNumber (w)) {
|
|
if(!this._hideFrame)
|
|
w -= frameWidth;
|
|
|
|
w = Math.max(w, 0);
|
|
}
|
|
|
|
|
|
this.resize (w, h);
|
|
this.tabs.resize (w);
|
|
|
|
var selectedView = this.getSelectedView ();
|
|
if (selectedView) {
|
|
selectedView.resize (); /* Notify ReportView of resize */
|
|
}
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
* @return Returns a suggested size for the widget as an object with width and height integer properties that specify the dimensions in
|
|
* pixels.
|
|
*/
|
|
getBestFitSize : function() {
|
|
var w = this._hideFrame ? 0 : 10;
|
|
var h = this.displayDrilldownTab ? 33 : 0;
|
|
var selectedView = this.getSelectedView ();
|
|
if (selectedView) {
|
|
var viewSize = selectedView.getBestFitSize ();
|
|
w += viewSize.width;
|
|
h += viewSize.height;
|
|
}
|
|
|
|
return {
|
|
width : w,
|
|
height : h
|
|
};
|
|
},
|
|
|
|
/**
|
|
* Overrides parent. Opens a tab with a positioned div. The positioning prevents
|
|
* the ReportView from disappearing in IE.
|
|
*/
|
|
beginTabHTML : function(tab) {
|
|
return bobj.html.openTag ('div', {
|
|
id : tab.zoneId,
|
|
style : {
|
|
display : 'none',
|
|
width : this.w + 'px',
|
|
height : this.h + 'px',
|
|
position : 'relative'
|
|
}
|
|
});
|
|
},
|
|
|
|
/**
|
|
* @return Returns the select ReportView or null if no view is selected
|
|
*/
|
|
getSelectedView : function() {
|
|
return this._views[this.oldIndex];
|
|
},
|
|
|
|
|
|
/**
|
|
* Overrides parent. Selects a report view to display.
|
|
*
|
|
* @param index [int] Index of the report view
|
|
*/
|
|
select : function(index) {
|
|
var partial = MochiKit.Base.partial;
|
|
|
|
if (index >= 0 && index < this._views.length && index != this.oldIndex) {
|
|
|
|
/* Disposes currently selected view */
|
|
var selectedView = this.getSelectedView ();
|
|
if (selectedView) {
|
|
selectedView.dispose ();
|
|
}
|
|
|
|
/* Creates new signals for newly selected view */
|
|
var selectedView = this._views[index];
|
|
|
|
/* Does the dirty DOM manipulation to actually change the view */
|
|
this.selectOld (index);
|
|
|
|
/*
|
|
* Notifies parameter controller that view has changes so it can enable/disable panel based on view's type
|
|
*/
|
|
MochiKit.Signal.signal (this, "viewChanged");
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Removes view specified by index from view list
|
|
*
|
|
* @param autoSelectNext
|
|
* [boolean] indicates whether another view should be auto selected after view specified by index is removed
|
|
* @param index
|
|
* [Number} index of view that would be removed
|
|
*/
|
|
_removeView : function(autoSelectNext, index) {
|
|
var removedView = this._views[index];
|
|
var removedTab = this.tabs.items[index];
|
|
|
|
autoSelectNext = (removedTab != null && removedTab.isSelected && autoSelectNext);
|
|
|
|
if (removedView) {
|
|
removedView.dispose ();
|
|
bobj.deleteWidget (removedView);
|
|
MochiKit.Signal.signal (this, 'removeView', removedView);
|
|
}
|
|
|
|
if (removedTab.isSelected) {
|
|
/* oldIndex (index of currently selected view) needs to be reset so when
|
|
response for the next selected view arrives
|
|
viewer think that view has changed */
|
|
this.oldIndex = -1;
|
|
}
|
|
|
|
arrayRemove (this, '_views', index);
|
|
this.tabs.remove (index, autoSelectNext);
|
|
bobj.deleteWidget (removedTab);
|
|
},
|
|
|
|
_onSelectTab : function(index) {
|
|
if(index != this.oldIndex)
|
|
MochiKit.Signal.signal (this, 'selectView', this._views[index]);
|
|
}
|
|
};
|
|
|