Statistics
| Branch: | Tag: | Revision:

root / src / gr / grnet / pithos / web / client / PithosDisclosurePanel.java @ 67d30f02

History | View | Annotate | Download (5.2 kB)

1
/*
2
 * Copyright 2012-2013 GRNET S.A. All rights reserved.
3
 *
4
 * Redistribution and use in source and binary forms, with or
5
 * without modification, are permitted provided that the following
6
 * conditions are met:
7
 *
8
 *   1. Redistributions of source code must retain the above
9
 *      copyright notice, this list of conditions and the following
10
 *      disclaimer.
11
 *
12
 *   2. Redistributions in binary form must reproduce the above
13
 *      copyright notice, this list of conditions and the following
14
 *      disclaimer in the documentation and/or other materials
15
 *      provided with the distribution.
16
 *
17
 * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
18
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
21
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
24
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
27
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28
 * POSSIBILITY OF SUCH DAMAGE.
29
 *
30
 * The views and conclusions contained in the software and
31
 * documentation are those of the authors and should not be
32
 * interpreted as representing official policies, either expressed
33
 * or implied, of GRNET S.A.
34
 */
35

    
36
package gr.grnet.pithos.web.client;
37

    
38
import com.google.gwt.event.logical.shared.CloseEvent;
39
import com.google.gwt.event.logical.shared.CloseHandler;
40
import com.google.gwt.event.logical.shared.OpenEvent;
41
import com.google.gwt.event.logical.shared.OpenHandler;
42
import com.google.gwt.resources.client.ClientBundle;
43
import com.google.gwt.resources.client.CssResource;
44
import com.google.gwt.resources.client.ImageResource;
45
import com.google.gwt.user.client.ui.*;
46

    
47
public class PithosDisclosurePanel extends Composite {
48

    
49
        public interface Style extends CssResource {
50
                String disclosurePanel();
51
                
52
                String header();
53
                
54
                String arrow();
55
                
56
                String content();
57
        }
58
        
59
        public interface Resources extends ClientBundle {
60
                @Source("PithosDisclosurePanel.css")
61
                Style pithosDisclosurePanelCss();
62
                
63
                @Source("upArrow.png")
64
                ImageResource icon();
65
                
66
                @Source("upArrow.png")
67
                ImageResource open();
68
                
69
                @Source("downArrow.png")
70
                ImageResource closed();
71

    
72
        @Source("gr/grnet/pithos/resources/ajax-loader.gif")
73
        ImageResource ajaxLoader();
74
        }
75
        
76
        private final DisclosurePanel panel;
77
    private final Resources resources;
78
    private final String title;
79

    
80
    public PithosDisclosurePanel(final Resources _resources, final String title, boolean open) {
81
        this(_resources, title, false, open);
82
    }
83

    
84
        public PithosDisclosurePanel(final Resources _resources, final String title, boolean ajaxLoader, boolean open) {
85
        this.title = title;
86

    
87
                this.resources = _resources;
88
                resources.pithosDisclosurePanelCss().ensureInjected();
89
                this.panel = new DisclosurePanel();
90
                panel.addStyleName(resources.pithosDisclosurePanelCss().disclosurePanel());
91
                panel.setHeader(createHeader(resources, title, ajaxLoader, open));
92
                panel.setOpen(open);
93

    
94
        if(!ajaxLoader) {
95
            addOpenCloseHandlers();
96
        }
97

    
98
                initWidget(panel);
99
        }
100

    
101
    private void addOpenCloseHandlers() {
102
        panel.addOpenHandler(new OpenHandler<DisclosurePanel>() {
103
            @Override
104
            public void onOpen(OpenEvent<DisclosurePanel> event) {
105
                panel.setHeader(createHeader(resources, title, false, true));
106
            }
107
        });
108
        panel.addCloseHandler(new CloseHandler<DisclosurePanel>() {
109

    
110
            @Override
111
            public void onClose(CloseEvent<DisclosurePanel> event) {
112
                panel.setHeader(createHeader(resources, title, false, false));
113
            }
114
        });
115
    }
116

    
117
    public void setLoaded(boolean open) {
118
        this.panel.setHeader(createHeader(resources, title, false, open));
119
        addOpenCloseHandlers();
120
    }
121
        
122
        Widget createHeader(Resources resources, String title, boolean ajaxLoader, boolean open) {
123
                HorizontalPanel header = new HorizontalPanel();
124
        
125
                Image img = new Image(resources.icon());
126
                header.add(img);
127
                header.setCellVerticalAlignment(img, HasVerticalAlignment.ALIGN_MIDDLE);
128
                header.setCellWidth(img, "32px");
129
                HTML titleHtml = new HTML(title);
130
                header.add(titleHtml);
131
                header.setCellVerticalAlignment(titleHtml, HasVerticalAlignment.ALIGN_MIDDLE);
132
                Image arrow = new Image(ajaxLoader ? resources.ajaxLoader() : open ? resources.open() : resources.closed());
133
                arrow.addStyleName(resources.pithosDisclosurePanelCss().arrow());
134
                header.add(arrow);
135
                header.setCellHorizontalAlignment(arrow, HasHorizontalAlignment.ALIGN_RIGHT);
136
                header.setCellVerticalAlignment(arrow, HasVerticalAlignment.ALIGN_MIDDLE);
137
                
138
                header.addStyleName(resources.pithosDisclosurePanelCss().header());
139
                return header;
140
        }
141
        
142
        public void setContent(Widget widget) {
143
                panel.setContent(widget);
144
                panel.getContent().removeStyleName("content");
145
                panel.getContent().addStyleName(resources.pithosDisclosurePanelCss().content());
146
        }
147
}