/* * Copyright 2010 JBoss Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.guvnor.client.util; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import com.google.gwt.event.logical.shared.CloseHandler; import com.google.gwt.event.logical.shared.HasSelectionHandlers; import com.google.gwt.event.logical.shared.OpenEvent; import com.google.gwt.event.logical.shared.OpenHandler; import com.google.gwt.event.logical.shared.SelectionEvent; import com.google.gwt.event.logical.shared.SelectionHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; /** * The GWT StackPanel is not working as we want. So doing a custom one. * * @author rikkola * */ public class LazyStackPanel extends Composite implements HasSelectionHandlers<LazyStackPanelRow> { private FlexTable flexTable = new FlexTable(); private int rowIndex = 0; public LazyStackPanel() { initWidget(flexTable); flexTable.setStyleName("guvnor-lazyStackPanel"); addSelectionHandler(new SelectionHandler<LazyStackPanelRow>() { public void onSelection(SelectionEvent<LazyStackPanelRow> event) { LazyStackPanelRow row = event.getSelectedItem(); if (row.isExpanded()) { row.compress(); } else { row.expand(); } } }); } /** * Add a new (collapsed) element to the stack. * @param headerText * @param contentLoad */ public void add(String headerText, LoadContentCommand contentLoad) { this.add(headerText, contentLoad, false); } public void add(String headerText, LoadContentCommand contentLoad, boolean expanded) { LazyStackPanelHeader header = new LazyStackPanelHeader(headerText); add(header, contentLoad, expanded); } /** * Add a new (collapsed) element to the stack. * @param headerText * @param contentLoad */ public void add(AbstractLazyStackPanelHeader header, LoadContentCommand contentLoad) { this.add(header, contentLoad, false); } public void add(AbstractLazyStackPanelHeader header, LoadContentCommand contentLoad, boolean expanded) { final LazyStackPanelRow row = new LazyStackPanelRow(header, contentLoad); header.addOpenHandler(new OpenHandler<AbstractLazyStackPanelHeader>() { public void onOpen(OpenEvent<AbstractLazyStackPanelHeader> event) { selectRow(row); } }); header.addCloseHandler(new CloseHandler<AbstractLazyStackPanelHeader>() { public void onClose(com.google.gwt.event.logical.shared.CloseEvent<AbstractLazyStackPanelHeader> event) { selectRow(row); } }); addHeaderRow(row); addContentRow(row.getContentPanel()); if (expanded){ header.expand(); } } private void addHeaderRow(final LazyStackPanelRow row) { flexTable.setWidget(rowIndex, 0, row); flexTable.getFlexCellFormatter().setStyleName(rowIndex, 0, "guvnor-LazyStackPanel-row-header"); rowIndex++; } private void addContentRow(final SimplePanel panel) { flexTable.setWidget(rowIndex++, 0, panel); } private void selectRow(LazyStackPanelRow row) { SelectionEvent.fire(this, row); } public HandlerRegistration addSelectionHandler(SelectionHandler<LazyStackPanelRow> handler) { return addHandler(handler, SelectionEvent.getType()); } public void swap(int firstIndex, int secondIndex) { // Every list item is made of the header and content row. // So we have twice as many rows. firstIndex = firstIndex * 2; secondIndex = secondIndex * 2; Widget firstHeader = flexTable.getWidget(firstIndex, 0); Widget firstContent = flexTable.getWidget(firstIndex + 1, 0); Widget secondHeader = flexTable.getWidget(secondIndex, 0); Widget secondContent = flexTable.getWidget(secondIndex + 1, 0); flexTable.setWidget(firstIndex, 0, secondHeader); flexTable.setWidget(firstIndex + 1, 0, secondContent); flexTable.setWidget(secondIndex, 0, firstHeader); flexTable.setWidget(secondIndex + 1, 0, firstContent); } public Iterator<AbstractLazyStackPanelHeader> getHeaderIterator() { List<AbstractLazyStackPanelHeader> result = new ArrayList<AbstractLazyStackPanelHeader>(); Iterator<Widget> iterator = flexTable.iterator(); while (iterator.hasNext()) { Widget widget = (Widget) iterator.next(); if (widget instanceof LazyStackPanelRow) { result.add(((LazyStackPanelRow) widget).getHeader()); } } return result.iterator(); } public void remove(int index) { index = index * 2; flexTable.removeRow(index + 1); flexTable.removeRow(index); } }