/*******************************************************************************
*
* Copyright 2011-2014 Spiffy UI Team
*
* 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.spiffyui.client.widgets;
import java.util.ArrayList;
import java.util.List;
import org.spiffyui.client.JSUtil;
import org.spiffyui.client.i18n.SpiffyUIStrings;
import org.spiffyui.client.widgets.listener.SlideDownPrefsPanelToggleListener;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.Panel;
/**
* The SlideDownPrefsPanel shows a tab that sticks to the bottom of the
* header of the page. It slides down when clicked to reveal a preferences
* panel for the current page. It will also fire event and notify
* SlideDownPrefsPanelToggleListeners when the panel is toggled (expanded or collapsed)
*/
public class SlideDownPrefsPanel extends HTMLPanel
{
private Panel m_panel;
private Anchor m_anchor;
private boolean m_visible = false;
private static final SpiffyUIStrings STRINGS = (SpiffyUIStrings) GWT.create(SpiffyUIStrings.class);
/**
* List of listeners for the dropsownselection change widget specific event
*/
private final List<SlideDownPrefsPanelToggleListener> m_listeners = new ArrayList<SlideDownPrefsPanelToggleListener>();
/**
* Creates a new panel with a randomly generated ID
*
*/
public SlideDownPrefsPanel()
{
this(HTMLPanel.createUniqueId(), null);
}
/**
* Creates a new panel
* @param id - String the id of the panel
*/
public SlideDownPrefsPanel(String id)
{
this(id, null);
}
/**
* Create a new panel
*
* @param id - String the id of the panel
* @param headerText - String the title of the panel and the label on the pull down tab, if null will use the default.
*/
public SlideDownPrefsPanel(String id, String headerText)
{
super("div", "<div style=\"display: none;\" id=\"" + id + "-panel\" class=\"prefspaneltab\">" +
"<h3>" + (headerText == null ? STRINGS.displayOptions() : headerText) + "</h3>" +
"</div>" +
"<div id=\"" + id + "-tab\" class=\"prefspulltab\">" +
"<div id=\"" + id + "-link\"></div>" +
"</div>");
getElement().setId(id);
getElement().setClassName("pulldownprefspanel");
m_anchor = new Anchor(headerText == null ? STRINGS.displayOptions() : headerText);
m_anchor.addClickHandler(new ClickHandler()
{
@Override
public void onClick(ClickEvent event)
{
event.preventDefault();
toggle();
}
});
add(m_anchor, id + "-link");
}
@Override
public void setTitle(String title)
{
m_anchor.setTitle(title);
}
@Override
public String getTitle()
{
return m_anchor.getTitle();
}
private void toggle()
{
JSUtil.toggleSlide(SlideDownPrefsPanel.this.getElement().getId() + "-panel", "");
m_visible = !m_visible;
if (m_visible) {
getElementById(SlideDownPrefsPanel.this.getElement().getId() + "-link").addClassName("prefspulltabexpanded");
fireSlideDownPrefsPanelToggleEvent(true);
} else {
getElementById(SlideDownPrefsPanel.this.getElement().getId() + "-link").removeClassName("prefspulltabexpanded");
fireSlideDownPrefsPanelToggleEvent(false);
}
}
/**
* Set the panel displayed when this panel is expanded
*
* @param panel the panel to display
*/
public void setPanel(Panel panel)
{
m_panel = panel;
add(panel, getElement().getId() + "-panel");
}
/**
* get the panel displayed when this panel is expanded
*
* @return the panel
*/
public Panel getPanel()
{
return m_panel;
}
/**
* Toggle the panel visible or Invisible
*/
public void togglePanel()
{
toggle();
}
/**
* Adds a SlideDownPrefsPanelToggleListener to the list of listeners
*
* @param listener - the listener to add
*/
public void addListener(SlideDownPrefsPanelToggleListener listener)
{
m_listeners.add(listener);
}
/**
* Removes a SlideDownPrefsPanelToggleListener from the list of listeners
*
* @param listener the listener to remove
*/
public void removeListener(SlideDownPrefsPanelToggleListener listener)
{
m_listeners.remove(listener);
}
/**
* Fires SlideDownPrefsPanelToggle event, and invokes onSlideDownPrefsPanelToggle on all listeners
*
* @param expand - boolean flag indicating whether the panel is being expanded or collapsed
*/
public void fireSlideDownPrefsPanelToggleEvent(boolean expand)
{
for (SlideDownPrefsPanelToggleListener listener : m_listeners) {
listener.onSlideDownPrefsPanelToggle(expand);
}
}
}