ItEr49S17CUAsignacionGrupoRecursosAPlanificacionItEr47S16: Added pagination in advanced assignment window

This commit is contained in:
Lorenzo Tilve 2010-03-05 22:19:13 +01:00 committed by Javier Moran Rua
parent a04c1d2d28
commit 60f46963d3
14 changed files with 367 additions and 114 deletions

View file

@ -51,6 +51,7 @@ public class TimeTrackedTableWithLeftPane<A, B> {
timeTrackedTable = new TimeTrackedTable<B>(
dataForTimeTracker(dataSource), cellRendererForTimeTracker,
timeTracker);
timeTrackedTable.setSclass("inner-timetracked-table");
leftPane = new Grid();
zoomLevelListener = new IZoomLevelChangedListener() {
@Override
@ -133,4 +134,8 @@ public class TimeTrackedTableWithLeftPane<A, B> {
return leftPane;
}
public void reload() {
timeTrackedTable.recreate();
}
}

View file

@ -47,6 +47,16 @@ import org.zkoss.zk.ui.Component;
public class TimeTracker {
public interface IDetailItemFilter {
public Collection<DetailItem> selectsFirstLevel(
Collection<DetailItem> firstLevelDetails);
public Collection<DetailItem> selectsSecondLevel(
Collection<DetailItem> secondLevelDetails);
}
private ZoomLevel detailLevel = ZoomLevel.DETAIL_ONE;
private WeakReferencedListeners<IZoomLevelChangedListener> zoomListeners = WeakReferencedListeners
@ -68,6 +78,8 @@ public class TimeTracker {
private boolean registeredFirstTask = false;
private IDetailItemFilter filter = null;
public TimeTracker(Interval interval, ZoomLevel zoomLevel, Component parent) {
this(interval, zoomLevel, SeveralModificators.empty(),
SeveralModificators.empty(), parent);
@ -101,6 +113,10 @@ public class TimeTracker {
detailLevel = zoomLevel;
}
public void setFilter(IDetailItemFilter filter) {
this.filter = filter;
}
public ZoomLevel getDetailLevel() {
return detailLevel;
}
@ -114,7 +130,15 @@ public class TimeTracker {
detailsFirstLevelCached = getTimeTrackerState()
.getFirstLevelDetails(interval);
}
return detailsFirstLevelCached;
return filterFirstLevel(detailsFirstLevelCached);
}
private Collection<DetailItem> filterFirstLevel(
Collection<DetailItem> firstLevelDetails) {
if (filter == null) {
return firstLevelDetails;
}
return filter.selectsFirstLevel(firstLevelDetails);
}
public Collection<DetailItem> getDetailsSecondLevel() {
@ -122,7 +146,15 @@ public class TimeTracker {
detailsSecondLevelCached = getTimeTrackerState()
.getSecondLevelDetails(interval);
}
return detailsSecondLevelCached;
return filterSecondLevel(detailsSecondLevelCached);
}
private Collection<DetailItem> filterSecondLevel(
Collection<DetailItem> secondLevelDetails) {
if (filter == null) {
return secondLevelDetails;
}
return filter.selectsSecondLevel(secondLevelDetails);
}
private Interval realIntervalCached;

View file

@ -53,7 +53,8 @@ public class DetailFiveTimeTrackerState extends TimeTrackerStateUsingJodaTime {
public DetailItem create(DateTime dateTime) {
return new DetailItem(FIRST_LEVEL_SIZE, dateTime
.getWeekOfWeekyear()
+ dateTime.toString(", MMM YYYY"));
+ dateTime.toString(", MMM YYYY"), dateTime, dateTime
.plusDays(7));
}
};
}

View file

@ -56,7 +56,8 @@ public class DetailFourTimeTrackerState extends TimeTrackerStateUsingJodaTime {
@Override
public DetailItem create(DateTime dateTime) {
return new DetailItem(FIRST_LEVEL_SIZE, dateTime
.toString("MMMM,YYYY"));
.toString("MMMM,YYYY"), dateTime, dateTime
.plusMonths(1));
}
};
}

View file

@ -52,7 +52,8 @@ public class DetailOneTimeTrackerState extends TimeTrackerState {
for (int i = initialYear; i <= endYear; i++) {
DetailItem d = new DetailItem(FIRST_LEVEL_ITEM_SIZE, String
.valueOf(i));
.valueOf(i), new DateTime(i, 1, 1, 0, 0, 0, 0),
new DateTime(i, 12, 31, 0, 0, 0, 0));
detailsVector.add(d);
}

View file

@ -103,7 +103,8 @@ public class DetailThreeTimeTrackerState extends TimeTrackerStateUsingJodaTime {
@Override
public DetailItem create(DateTime dateTime) {
return new DetailItem(FIRST_LEVEL_SIZE,
getYearWithSemesterString(dateTime));
getYearWithSemesterString(dateTime), dateTime, dateTime
.plusMonths(6));
}
};
}

View file

@ -82,11 +82,14 @@ public class DetailTwoTimeTrackerState extends TimeTrackerState {
int quarter = calculateInQuarterPeriodDateInYear(initialDate,
initialYear);
detailsVector.add(new DetailItem((4 - (quarter - 1))
* FIRST_LEVEL_ITEM_SIZE / 4, String.valueOf(initialYear)));
* FIRST_LEVEL_ITEM_SIZE / 4, String.valueOf(initialYear),
new DateTime(initialYear, 1, 1, 0, 0, 0, 0), new DateTime(
initialYear, 1, 1, 0, 0, 0, 0)));
for (int i = (initialYear + 1); i < endYear; i++) {
DetailItem d = new DetailItem(FIRST_LEVEL_ITEM_SIZE, String
.valueOf(i));
.valueOf(i), new DateTime(i, 1, 1, 0, 0, 0, 0),
new DateTime(i, 12, 31, 0, 0, 0, 0));
detailsVector.add(d);
}

View file

@ -39,6 +39,7 @@ import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.joda.time.Period;
import org.navalplanner.business.planner.entities.AggregateOfResourceAllocations;
import org.navalplanner.business.planner.entities.AssignmentFunction;
import org.navalplanner.business.planner.entities.CalculatedValue;
@ -60,6 +61,7 @@ import org.zkoss.ganttz.timetracker.TimeTrackedTable;
import org.zkoss.ganttz.timetracker.TimeTrackedTableWithLeftPane;
import org.zkoss.ganttz.timetracker.TimeTracker;
import org.zkoss.ganttz.timetracker.TimeTrackerComponentWithoutColumns;
import org.zkoss.ganttz.timetracker.TimeTracker.IDetailItemFilter;
import org.zkoss.ganttz.timetracker.zoom.DetailItem;
import org.zkoss.ganttz.timetracker.zoom.IZoomLevelChangedListener;
import org.zkoss.ganttz.timetracker.zoom.ZoomLevel;
@ -152,6 +154,7 @@ public class AdvancedAllocationController extends GenericForwardComposer {
return end;
}
private static ArrayList<ResourceAllocation<?>> reverse(
List<ResourceAllocation<?>> all) {
ArrayList<ResourceAllocation<?>> reversed = new ArrayList<ResourceAllocation<?>>(
@ -370,8 +373,13 @@ public class AdvancedAllocationController extends GenericForwardComposer {
private Div insertionPointLeftPanel;
private Div insertionPointRightPanel;
private Button paginationDownButton;
private Button paginationUpButton;
private TimeTracker timeTracker;
private PaginatorFilter paginatorFilter;
private TimeTrackerComponentWithoutColumns timeTrackerComponent;
private Grid leftPane;
private TimeTrackedTable<Row> table;
@ -405,6 +413,7 @@ public class AdvancedAllocationController extends GenericForwardComposer {
onlyOneVisible = new OnlyOneVisible(normalLayout, noDataLayout);
this.associatedComponent = comp;
loadAndInitializeComponents();
Clients.evalJavaScript("ADVANCE_ALLOCATIONS.listenToScroll();");
}
@ -422,24 +431,171 @@ public class AdvancedAllocationController extends GenericForwardComposer {
}
}
private class PaginatorFilter implements IDetailItemFilter {
private DateTime intervalStart;
private DateTime intervalEnd;
private DateTime paginatorStart;
private DateTime paginatorEnd;
private ZoomLevel zoomLevel = ZoomLevel.DETAIL_ONE;
private Period intervalIncrease() {
switch (zoomLevel) {
case DETAIL_ONE:
return Period.years(5);
case DETAIL_TWO:
return Period.years(3);
case DETAIL_THREE:
return Period.years(2);
case DETAIL_FOUR:
return Period.months(6);
case DETAIL_FIVE:
return Period.months(2);
}
return Period.years(5);
}
@Override
public Collection<DetailItem> selectsFirstLevel(
Collection<DetailItem> firstLevelDetails) {
ArrayList<DetailItem> result = new ArrayList<DetailItem>();
for (DetailItem each : firstLevelDetails) {
if ((each.getStartDate() == null)
|| !(each.getStartDate().isBefore(paginatorStart))
&& (each.getStartDate().isBefore(paginatorEnd))) {
result.add(each);
}
}
return result;
}
@Override
public Collection<DetailItem> selectsSecondLevel(
Collection<DetailItem> secondLevelDetails) {
ArrayList<DetailItem> result = new ArrayList<DetailItem>();
for (DetailItem each : secondLevelDetails) {
if ((each.getStartDate() == null)
|| !(each.getStartDate().isBefore(paginatorStart))
&& (each.getStartDate().isBefore(paginatorEnd))) {
result.add(each);
}
}
return result;
}
public void next() {
paginatorStart = paginatorStart.plus(intervalIncrease());
paginatorEnd = paginatorEnd.plus(intervalIncrease());
// Avoid reduced last intervals
if ((paginatorEnd.plus(intervalIncrease()).isAfter(intervalEnd))) {
paginatorEnd = paginatorEnd.plus(intervalIncrease());
}
updatePaginationButtons();
}
public void previous() {
paginatorStart = paginatorStart.minus(intervalIncrease());
paginatorEnd = paginatorEnd.minus(intervalIncrease());
updatePaginationButtons();
}
private void updatePaginationButtons() {
paginationDownButton.setDisabled(isFirstPage());
paginationUpButton.setDisabled(isLastPage());
}
public boolean isFirstPage() {
return !(paginatorStart.isAfter(intervalStart));
}
public boolean isLastPage() {
return ((paginatorEnd.isAfter(intervalEnd)) || (paginatorEnd
.isEqual(intervalEnd)));
}
public void setZoomLevel(ZoomLevel detailLevel) {
zoomLevel = detailLevel;
}
public void setInterval(Interval realInterval) {
intervalStart = new DateTime(realInterval.getStart());
intervalEnd = new DateTime(realInterval.getFinish());
paginatorStart = intervalStart;
paginatorEnd = intervalStart.plus(intervalIncrease());
if ((paginatorEnd.plus(intervalIncrease()).isAfter(intervalEnd))) {
paginatorEnd = intervalEnd;
}
updatePaginationButtons();
}
}
private void createComponents() {
timeTracker = new TimeTracker(addMarginTointerval(), self);
timeTrackerComponent = new TimeTrackerComponentWithoutColumns(
timeTracker, "timeTracker");
TimeTrackedTableWithLeftPane<Row, Row> timeTrackedTableWithLeftPane = new TimeTrackedTableWithLeftPane<Row, Row>(
getDataSource(), getColumnsForLeft(), getLeftRenderer(),
getRightRenderer(), timeTracker);
Clients.evalJavaScript("ADVANCE_ALLOCATIONS.listenToScroll();");
paginatorFilter = new PaginatorFilter();
paginatorFilter.setZoomLevel(timeTracker.getDetailLevel());
paginatorFilter.setInterval(timeTracker.getRealInterval());
paginationUpButton.setDisabled(isLastPage());
timeTracker.setFilter(paginatorFilter);
timeTracker.addZoomListener(new IZoomLevelChangedListener() {
@Override
public void zoomLevelChanged(ZoomLevel detailLevel) {
Clients.evalJavaScript("ADVANCE_ALLOCATIONS.listenToScroll();");
paginatorFilter.setZoomLevel(detailLevel);
paginatorFilter.setInterval(timeTracker.getRealInterval());
timeTracker.setFilter(paginatorFilter);
Clients
.evalJavaScript("ADVANCE_ALLOCATIONS.listenToHorizontalScroll();");
}
});
timeTrackerComponent = new TimeTrackerComponentWithoutColumns(
timeTracker, "timeTracker");
timeTrackedTableWithLeftPane = new TimeTrackedTableWithLeftPane<Row, Row>(
getDataSource(), getColumnsForLeft(), getLeftRenderer(),
getRightRenderer(), timeTracker);
table = timeTrackedTableWithLeftPane.getRightPane();
table.setSclass("timeTrackedTableWithLeftPane");
leftPane = timeTrackedTableWithLeftPane.getLeftPane();
leftPane.setFixedLayout(true);
Clients.evalJavaScript("ADVANCE_ALLOCATIONS.listenToScroll();");
Clients
.evalJavaScript("ADVANCE_ALLOCATIONS.listenToHorizontalScroll();");
}
public void paginationDown() {
paginatorFilter.previous();
reloadComponent();
}
public void paginationUp() {
paginatorFilter.next();
reloadComponent();
}
private void reloadComponent() {
timeTrackedTableWithLeftPane.reload();
timeTrackerComponent.recreate();
// Reattach listener for zoomLevel changes. May be optimized
timeTracker.addZoomListener(new IZoomLevelChangedListener() {
@Override
public void zoomLevelChanged(ZoomLevel detailLevel) {
paginatorFilter.setZoomLevel(detailLevel);
paginatorFilter.setInterval(timeTracker.getRealInterval());
timeTracker.setFilter(paginatorFilter);
Clients
.evalJavaScript("ADVANCE_ALLOCATIONS.listenToHorizontalScroll();");
}
});
Clients
.evalJavaScript("ADVANCE_ALLOCATIONS.listenToHorizontalScroll();");
}
public boolean isFirstPage() {
return paginatorFilter.isFirstPage();
}
public boolean isLastPage() {
return paginatorFilter.isLastPage();
}
private void insertComponentsInLayout() {
@ -497,6 +653,7 @@ public class AdvancedAllocationController extends GenericForwardComposer {
private OnlyOneVisible onlyOneVisible;
private Component normalLayout;
private Component noDataLayout;
private TimeTrackedTableWithLeftPane<Row, Row> timeTrackedTableWithLeftPane;
private List<Row> getRows() {
if (rowsCached != null) {

View file

@ -171,12 +171,16 @@ button.z-button {
.z-button-cm:active {
background-color: #A1D586; /* green2 (active background)*/
border-right: 1px solid #439e32;
border-right: 0 solid #439e32;
border-bottom: 1px solid #439e32;
border-top: 2px solid #3f5917;
border-left: 2px solid #3f5917;
}
.z-button.z-button-disd .z-button-cm:active {
border: inherit;
}
.z-button.z-button-disd .z-button-cm {
background-color: #EAEAEA;
color: #A0A0A0;
@ -900,7 +904,7 @@ span.z-dottree-line {
}
/* --- START -- menubar --
/* --- START -- menus and toolbar --
=================================================== */
.z-menubar-hor, .z-menubar-ver {
@ -1050,8 +1054,63 @@ span.z-dottree-line {
background-image: url(../img/ico_advanced-allocation.png);
}
.perspectives-column {
display:none;
}
/* End perspectives */
/* ---- Toolbar ------ */
.toolbar-box .z-button-cm {
height: 24px;
}
.toolbar-box .z-label {
color:#0068B1;
padding-left:4px;
}
.toolbar-box span.z-button {
margin: 0 0 0 0;
}
.toolbar-box .planner-icon,
.toolbar-box .planner-command {
padding-top: 1px;
padding-right: 1px;
}
.toolbar-box .z-button-cm {
background-color: transparent;
border-color:transparent;
}
.toolbar-box .z-button-cm:hover {
background-color: #E6F2F9;
border-color:#006699 #DFF5FE #DFF5FE #006699;
}
.toolbar-box .z-button.z-button-disd .z-button-cm {
background-color: transparent;
border-color: transparent;
}
.toolbar-box {
background:transparent url(../img/toolbar-hm.png) repeat-x scroll 0 0;
border-bottom:1px solid #9ECAD8;
font-size:11px;
}
.toolbar-box table.z-button-disd:active {
margin-top: 1px;
margin-right: 1px;
border-top: 0;
border-left: 0;
padding-left: 2px;
}
/* =================================================== */
.vertical-separator {
display:none;
@ -1109,31 +1168,6 @@ tr.z-tree-row-seld, tr.z-list-item-seld,
padding: 10px;
}
.perspectives-column {
display:none;
}
.toolbar-box .z-button-cm {
height: 24px;
}
.toolbar-box .z-label {
color:#0068B1;
padding-left:4px;
}
.toolbar-box span.z-button {
margin: 0 0 0 0;
}
.toolbar-box .planner-icon,
.toolbar-box .planner-command {
padding-top: 1px;
padding-right: 1px;
}
.z-tab-accordion-hm, .z-tab-accordion-hr, .z-tab-accordion-hl {
-moz-background-clip:border;
@ -1189,21 +1223,29 @@ tr.z-tree-row-seld, tr.z-list-item-seld,
cursor: help;
}
.toolbar-box .z-button-cm {
background-color: transparent;
border-color:transparent;
.timeTrackedTableWithLeftPane input[value="0"] {
color: #DDDDDD;
}
.toolbar-box .z-button-cm:hover {
background-color: #E6F2F9;
border-color:#006699 #DFF5FE #DFF5FE #006699;
/* for horizontal scrolling */
.timeTrackedTableWithLeftPane .z-grid-body table {
position:relative;
}
.toolbar-box {
background:transparent url(/navalplanner-webapp/zkau/web/zkex/zul/img/layout/borderlayout-hm.png) repeat-x scroll 0 0;
border-bottom:1px solid #9ECAD8;
font-size:11px;
/* Test*/
.timeTrackedTableWithLeftPane div.z-grid-body {
overflow: hidden;
}
.advancedallocationlayout #timeTracker .z-vbox {
position:relative;
}
.z-button-disd {
opacity:0.3;
}
.advancedallocationlayout #timeTracker {
background-color: #CDE6F5;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 647 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 664 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 986 B

View file

@ -22,20 +22,30 @@
ADVANCE_ALLOCATIONS = {};
ADVANCE_ALLOCATIONS.listenToScroll = function() {
var timetrackergap_ = YAHOO.util.Selector.query('.timetrackergap')[0];
var taskspanel_ = YAHOO.util.Selector.query('.rightpanellayout .z-grid-body')[0];
// var timetrackergap_ = YAHOO.util.Selector.query('#timeTracker .z-vbox')[0];
// var taskspanel_ = YAHOO.util.Selector.query('.rightpanellayout .z-grid-body')[0];
var taskdetails_ = YAHOO.util.Selector.query('.advancedassignmentdetails .z-grid-body')[0];
var taskspanelcenter_ = YAHOO.util.Selector.query('.rightpanellayout .z-center-body')[0];
var onScroll = function() {
timetrackergap_.style["left"] = "-" + taskspanel_.scrollLeft + "px";
};
taskspanel_.onscroll = onScroll;
var taskspanelcenter_ = YAHOO.util.Selector.query('.rightpanellayout')[0];
var onVerticalScroll = function() {
taskdetails_.style["top"] = "-" + taskspanelcenter_.scrollTop + "px";
};
taskspanelcenter_.onscroll = onVerticalScroll;
};
ADVANCE_ALLOCATIONS.listenToHorizontalScroll = function() {
var horizontalScroll_ = YAHOO.util.Selector.query('.horizontalscroller')[0];
var timeTrackedTable_ = YAHOO.util.Selector.query('.timeTrackedTableWithLeftPane .z-grid-body table')[0];
var timetrackergap_ = YAHOO.util.Selector.query('#timeTracker .z-vbox')[0];
var innerScroll_ = YAHOO.util.Selector.query('#horizontalScrollContainer')[0];
var onHorizontalScroll = function() {
timeTrackedTable_.style["left"] = "-" + horizontalScroll_.scrollLeft + "px";
timetrackergap_.style["left"] = "-" + horizontalScroll_.scrollLeft + "px";
};
innerScroll_.style["width"] = (timeTrackedTable_.clientWidth + 10 ) +"px";
horizontalScroll_.scrollLeft = "0";
horizontalScroll_.onscroll = onHorizontalScroll;
};

View file

@ -18,7 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<?page title="${i18n:_('Navalpro: Scheduling')}"?>
<?page title="${i18n:_('NavalPlan: Advanced allocation')}"?>
<?taglib uri="/WEB-INF/tld/i18n.tld" prefix="i18n"?>
<zk xmlns:n="http://www.zkoss.org/2005/zk/native">
@ -26,55 +26,55 @@
advancedAllocationController = arg.get("advancedAllocationController");
]]>
</zscript>
<div>
<div id="noDataLayout">
<n:h4 class="message_WARNING">${i18n:_('No Allocations have been done')}</n:h4>
</div>
<borderlayout id="normalLayout" width="auto" apply="${advancedAllocationController}" class="advancedallocationlayout">
<north height="30px" border="0" sclass="toolbar-box">
<hbox align="center">
<button label="${i18n:_('Accept')}" id="acceptButton" class="save-button global-action"
if="${advancedAllocationController.advancedAllocationOfSingleTask}" />
<button label="${i18n:_('Cancel')}" id="cancelButton" class="cancel-button global-action"
if="${advancedAllocationController.advancedAllocationOfSingleTask}" />
<button image="/common/img/ico_save.png" tooltiptext="${i18n:_('Accept')}" id="acceptButton" class="planner-command"
if="${!(advancedAllocationController.advancedAllocationOfSingleTask)}" />
<separator/>
<label>${i18n:_('Zoom level')}:</label>
<listbox mold="select" rows="1"
model="${advancedAllocationController.zoomLevels}"
onSelect="advancedAllocationController.setZoomLevel(self.selectedItem.value);" >
</listbox>
<separator/>
<div id="messages" />
</hbox>
</north>
<center border="0">
<borderlayout sclass="resourcesload">
<west size="400px" flex="true" collapsible="true"
splittable="true" autoscroll="true">
<borderlayout >
<north border="0" height="0px" flex="true" collapsible="true" autoscroll="true">
</north>
<center border="0" sclass="advancedassignmentdetails">
<div sclass="leftpanelgap" id="insertionPointLeftPanel"></div>
</center>
</borderlayout>
</west>
<center sclass="taskspanel">
<borderlayout>
<north border="0"><div sclass="timetrackergap" height="31px" id="insertionPointTimetracker"></div></north>
<center autoscroll="true" border="0" sclass="rightpanellayout">
<div id="insertionPointRightPanel" sclass="taskspanelgap"></div>
</center>
</borderlayout>
</center>
</borderlayout>
</center>
</borderlayout>
<n:div>
<div id="noDataLayout">
<n:h4 class="message_WARNING">${i18n:_('No Allocations have been done')}</n:h4>
</div>
<borderlayout id="normalLayout" width="auto" apply="${advancedAllocationController}" class="advancedallocationlayout">
<north height="30px" border="0" sclass="toolbar-box">
<hbox align="center">
<button label="${i18n:_('Accept')}" id="acceptButton" class="save-button global-action"
if="${advancedAllocationController.advancedAllocationOfSingleTask}" />
<button label="${i18n:_('Cancel')}" id="cancelButton" class="cancel-button global-action"
if="${advancedAllocationController.advancedAllocationOfSingleTask}" />
<button image="/common/img/ico_save.png" tooltiptext="${i18n:_('Accept')}" id="acceptButton" class="planner-command"
if="${!(advancedAllocationController.advancedAllocationOfSingleTask)}" />
<separator/>
<button tooltiptext="Page down" image="/common/img/ico_left.png" id="paginationDownButton"
onClick="advancedAllocationController.paginationDown();" disabled="true" />
<label>${i18n:_('Zoom level')}:</label>
<listbox mold="select" rows="1"
model="${advancedAllocationController.zoomLevels}"
onSelect="advancedAllocationController.setZoomLevel(self.selectedItem.value);" >
</listbox>
<button tooltiptext="Page up" image="/common/img/ico_right.png" id="paginationUpButton" onClick="advancedAllocationController.paginationUp();" />
<separator/>
<div id="messages" />
</hbox>
</north>
<center border="0">
<borderlayout sclass="resourcesload">
<west size="400px" flex="true" collapsible="true"
splittable="true" sclass="advancedassignmentdetails">
<div sclass="leftpanelgap" id="insertionPointLeftPanel"></div>
</west>
<center sclass="taskspanel">
<borderlayout>
<north border="0"><div sclass="timetrackergap" height="31px" id="insertionPointTimetracker"></div></north>
<center style="overflow-y:auto;overflow-x:hidden;" border="0" sclass="rightpanellayout">
<div id="insertionPointRightPanel" sclass="taskspanelgap"></div>
</center>
<south border="0" sclass="horizontalscroller" height="16px" style="overflow-x:auto;overflow-y:hidden;">
<n:div id="horizontalScrollContainer" style="height:10px;" />
</south>
</borderlayout>
</center>
</borderlayout>
</center>
</borderlayout>
</n:div>
</zk>