// Copyright 2010 Google Inc. All Rights Reseved.
//
// 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 com.google.testing.testify.risk.frontend.client.view.widgets;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.event.logical.shared.OpenEvent;
import com.google.gwt.event.logical.shared.OpenHandler;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DisclosurePanel;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Widget;
import java.util.Iterator;
/**
* A disclosure panel that automatically switches the headers between a closed header and
* an open header for you.
*
* @author jimr@google.com (Jim Reardon)
*/
public class EasyDisclosurePanel extends Composite implements HasWidgets {
private final DisclosurePanel panel = new DisclosurePanel();
private final Widget openedHeader;
private final Widget closedHeader;
private final HorizontalPanel header = new HorizontalPanel();
private final Image expandedImage = new Image("images/expanded_12.png");
private final Image collapsedImage = new Image("images/collapsed_12.png");
/**
* Constructs an Easy Disclosure Panel with the same widget for the closed / opened
* header. Easy Disclosure Panel will automatically change the expanded/collapsed
* image.
*
* @param header widget to display along side the +/- zippy.
*/
public EasyDisclosurePanel(Widget header) {
this(header, null);
}
public EasyDisclosurePanel(Widget openedHeader, Widget closedHeader) {
this.openedHeader = openedHeader;
this.closedHeader = closedHeader;
header.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);
header.setStyleName("tty-DisclosurePanelHeader");
setHeaderOpened();
panel.setAnimationEnabled(true);
panel.addStyleName("tty-DisclosurePanel");
panel.setOpen(true);
panel.setHeader(header);
panel.addCloseHandler(new CloseHandler<DisclosurePanel>() {
@Override
public void onClose(CloseEvent<DisclosurePanel> event) {
setHeaderClosed();
}
});
panel.addOpenHandler(new OpenHandler<DisclosurePanel>() {
@Override
public void onOpen(OpenEvent<DisclosurePanel> event) {
setHeaderOpened();
}
});
initWidget(panel);
}
private void setHeaderClosed() {
header.clear();
header.add(collapsedImage);
header.setCellWidth(collapsedImage, "20px");
header.add(closedHeader != null ? closedHeader : openedHeader);
}
private void setHeaderOpened() {
header.clear();
header.add(expandedImage);
header.setCellWidth(expandedImage, "20px");
header.add(openedHeader);
}
public void setOpen(boolean open) {
panel.setOpen(open);
}
@Override
public void add(Widget w) {
panel.add(w);
}
@Override
public void clear() {
panel.clear();
}
@Override
public Iterator<Widget> iterator() {
return panel.iterator();
}
@Override
public boolean remove(Widget w) {
return panel.remove(w);
}
}