/*
- * Copyright 2012 GRNET S.A. All rights reserved.
+ * Copyright 2012-2013 GRNET S.A. All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
package gr.grnet.pithos.web.client;
-import gr.grnet.pithos.web.client.grouptree.GroupTreeView;
-import gr.grnet.pithos.web.client.grouptree.GroupTreeView.Templates;
-
-import com.google.gwt.dom.client.Style;
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.resources.client.ClientBundle;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.resources.client.ImageResource;
-import com.google.gwt.resources.client.CssResource.ImportedWithPrefix;
-import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
-import com.google.gwt.user.client.ui.AbstractImagePrototype;
-import com.google.gwt.user.client.ui.Composite;
-import com.google.gwt.user.client.ui.DisclosurePanel;
-import com.google.gwt.user.client.ui.HTML;
-import com.google.gwt.user.client.ui.IsWidget;
+import com.google.gwt.user.client.ui.*;
public class PithosDisclosurePanel extends Composite {
public interface Style extends CssResource {
String disclosurePanel();
+ String header();
+
+ String arrow();
+
String content();
}
@Source("downArrow.png")
ImageResource closed();
+
+ @Source("gr/grnet/pithos/resources/ajax-loader.gif")
+ ImageResource ajaxLoader();
}
- DisclosurePanel panel;
-
- Resources resources;
-
- public PithosDisclosurePanel(final Resources _resources, final String title, boolean open) {
- resources = _resources;
+ private final DisclosurePanel panel;
+ private final Resources resources;
+ private final String title;
+
+ public PithosDisclosurePanel(final Resources _resources, final String title, boolean ajaxLoader, boolean open) {
+ this.title = title;
+
+ this.resources = _resources;
resources.pithosDisclosurePanelCss().ensureInjected();
- panel = new DisclosurePanel();
+ this.panel = new DisclosurePanel();
panel.addStyleName(resources.pithosDisclosurePanelCss().disclosurePanel());
- panel.setHeader(createHeader(resources, title, open));
+ panel.setHeader(createHeader(resources, title, ajaxLoader, open));
panel.setOpen(open);
- panel.setAnimationEnabled(true);
- panel.addOpenHandler(new OpenHandler<DisclosurePanel>() {
-
- @Override
- public void onOpen(OpenEvent<DisclosurePanel> event) {
- panel.setHeader(createHeader(resources, title, true));
- }
- });
- panel.addCloseHandler(new CloseHandler<DisclosurePanel>() {
-
- @Override
- public void onClose(CloseEvent<DisclosurePanel> event) {
- panel.setHeader(createHeader(resources, title, false));
- }
- });
-
+
+ if(!ajaxLoader) {
+ addOpenCloseHandlers();
+ }
+
initWidget(panel);
}
+
+ private void addOpenCloseHandlers() {
+ panel.addOpenHandler(new OpenHandler<DisclosurePanel>() {
+ @Override
+ public void onOpen(OpenEvent<DisclosurePanel> event) {
+ panel.setHeader(createHeader(resources, title, false, true));
+ }
+ });
+ panel.addCloseHandler(new CloseHandler<DisclosurePanel>() {
+
+ @Override
+ public void onClose(CloseEvent<DisclosurePanel> event) {
+ panel.setHeader(createHeader(resources, title, false, false));
+ }
+ });
+ }
+
+ public void setLoaded(boolean open) {
+ this.panel.setHeader(createHeader(resources, title, false, open));
+ addOpenCloseHandlers();
+ }
- HTML createHeader(Resources resources, String title, boolean open) {
- SafeHtmlBuilder sb = new SafeHtmlBuilder();
- sb.appendHtmlConstant(AbstractImagePrototype.create(resources.icon()).getHTML());
- sb.append(Templates.INSTANCE.nameSpan(title));
- sb.appendHtmlConstant(AbstractImagePrototype.create(open ? resources.open() : resources.closed()).getHTML());
- return new HTML(sb.toSafeHtml());
+ Widget createHeader(Resources resources, String title, boolean ajaxLoader, boolean open) {
+ HorizontalPanel header = new HorizontalPanel();
+
+ Image img = new Image(resources.icon());
+ header.add(img);
+ header.setCellVerticalAlignment(img, HasVerticalAlignment.ALIGN_MIDDLE);
+ header.setCellWidth(img, "32px");
+ HTML titleHtml = new HTML(title);
+ header.add(titleHtml);
+ header.setCellVerticalAlignment(titleHtml, HasVerticalAlignment.ALIGN_MIDDLE);
+ Image arrow = new Image(ajaxLoader ? resources.ajaxLoader() : open ? resources.open() : resources.closed());
+ arrow.addStyleName(resources.pithosDisclosurePanelCss().arrow());
+ header.add(arrow);
+ header.setCellHorizontalAlignment(arrow, HasHorizontalAlignment.ALIGN_RIGHT);
+ header.setCellVerticalAlignment(arrow, HasVerticalAlignment.ALIGN_MIDDLE);
+
+ header.addStyleName(resources.pithosDisclosurePanelCss().header());
+ return header;
}
- public void add(IsWidget widget) {
- panel.add(widget);
+ public void setContent(Widget widget) {
+ panel.setContent(widget);
panel.getContent().removeStyleName("content");
panel.getContent().addStyleName(resources.pithosDisclosurePanelCss().content());
}