/* * RHQ Management Platform * Copyright (C) 2005-2009 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, version 2, as * published by the Free Software Foundation, and/or the GNU Lesser * General Public License, version 2.1, also as published by the Free * Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License and the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU General Public License * and the GNU Lesser General Public License along with this program; * if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.rhq.coregui.client.dashboard; import java.util.Arrays; import com.google.gwt.user.client.rpc.AsyncCallback; import com.smartgwt.client.util.EventHandler; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.events.DragResizeStartEvent; import com.smartgwt.client.widgets.events.DragResizeStartHandler; import com.smartgwt.client.widgets.events.DropEvent; import com.smartgwt.client.widgets.events.DropHandler; import com.smartgwt.client.widgets.events.ResizedEvent; import com.smartgwt.client.widgets.events.ResizedHandler; import org.rhq.core.domain.dashboard.Dashboard; import org.rhq.core.domain.dashboard.DashboardPortlet; import org.rhq.coregui.client.util.Log; import org.rhq.coregui.client.util.enhanced.EnhancedHLayout; /** * @author Greg Hinkle * @author Jay Shaughnessy */ public class PortalLayout extends EnhancedHLayout { private DashboardView dashboardView; private Integer dragResizeColumnCount; /** * @param dashboardView * @param numColumns * @param columnWidths Currently only the first column width is set, others are ignored and share the remaining space * evenly. If null column 0 defaults to 30%. */ public PortalLayout(DashboardView dashboardView, int numColumns, String[] columnWidths) { super(); if (numColumns < 1) { throw new IllegalArgumentException("Invalid number of columns [" + numColumns + "]"); } if ((null != columnWidths && columnWidths.length > numColumns)) { throw new IllegalArgumentException("Invalid column widths (more widths than columns) " + Arrays.toString(columnWidths)); } this.dashboardView = dashboardView; this.setStyleName("portalLayout"); setMembersMargin(4); for (int i = 0; i < numColumns; i++) { final PortalColumn column = new PortalColumn(); if (null != columnWidths && i < columnWidths.length) { column.setWidth(columnWidths[i]); } else { column.setWidth("*"); } final int columnNumber = i; column.addDropHandler(new DropHandler() { public void onDrop(DropEvent dropEvent) { int dropPosition = column.getDropPosition(); int dropColumn = columnNumber; final PortletWindow target = (PortletWindow) EventHandler.getDragTarget(); target.getStoredPortlet().setIndex(dropPosition); target.getStoredPortlet().setColumn(dropColumn); int colNum = 0; for (Canvas pcc : getMembers()) { PortalColumn pc = (PortalColumn) pcc; int i = 0; for (Canvas c : pc.getMembers()) { if (colNum == dropColumn && i == dropPosition) { i++; } if (c instanceof PortletWindow) { DashboardPortlet dp = ((PortletWindow) c).getStoredPortlet(); dp.setIndex(i++); } } colNum++; } save(); Log.info("Rearranged column indexes"); } }); column.addDragResizeStartHandler(new DragResizeStartHandler() { @Override public void onDragResizeStart(DragResizeStartEvent event) { // When a drag resize starts activate a counter keeping track of the number of columns that // have been resized. A resize of one column will force a resize of all columns. After the // last column resize completes, persist the new column widths to the database. dragResizeColumnCount = 0; } }); // This handler is called when the resizing is complete (the DragResizeStopHandler is called // immediately on stop but before all resizing is complete.) column.addResizedHandler(new ResizedHandler() { @Override public void onResized(ResizedEvent event) { // ignore resizing not related to drag resize (presumable initial draw) if (null == dragResizeColumnCount) { return; } ++dragResizeColumnCount; Canvas[] members = getMembers(); // ignore resizing prior to all columns being resized as a result of the drag operation if (dragResizeColumnCount != members.length) { return; } // one drag operation results in a save for each column, as they all get resized // now that they are all resized, save the column widths (save updates these automatically) save(); // reset the flag dragResizeColumnCount = null; } }); addMember(column); } } public PortalColumn getPortalColumn(int column) { return ((PortalColumn) getMember(column)); } public PortalColumn addPortletWindow(PortletWindow portletWindow, int column) { PortalColumn portalColumn = (PortalColumn) getMember(column); portalColumn.addMember(portletWindow); return portalColumn; } public void save() { this.dashboardView.save(); } public void save(AsyncCallback<Dashboard> callback) { this.dashboardView.save(callback); } public void rebuild() { this.dashboardView.rebuild(); } public void resize() { for (Canvas c : getMembers()) { PortalColumn column = (PortalColumn) c; for (Canvas p : column.getMembers()) { if (p instanceof PortletWindow) { PortletWindow portlet = (PortletWindow) p; portlet.setWidth(column.getWidth()); } } } } }