package ilarkesto.gwt.client;
import ilarkesto.core.logging.Log;
import ilarkesto.core.menu.MenuItem;
import ilarkesto.core.menu.StaticMenu;
import ilarkesto.core.menu.StaticMenuItem;
import ilarkesto.core.menu.Submenu;
import ilarkesto.gwt.client.animation.AnimatingFlowPanel;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;
public class NavigatorWidget<K extends Object> extends AWidget {
private static final Log log = Log.get(NavigatorWidget.class);
private FlowPanel panel;
StaticMenu menu;
private MenuItem lastAnimatedItem;
private long lastUpdateTime;
@Override
protected Widget onInitialization() {
if (menu == null) menu = new StaticMenu();
panel = new FlowPanel();
panel.setStyleName("NavigatorWidget");
return panel;
}
@Override
protected void onUpdate() {
if (!menu.getChangeIndicator().hasChangedSince(lastUpdateTime)) return;
panel.clear();
panel.add(Gwt.createEmptyDiv("NavigatorWidget-head"));
for (StaticMenuItem item : menu.getItems()) {
panel.add(createItemWidget(item));
}
super.onUpdate();
lastUpdateTime = System.currentTimeMillis();
}
private Widget createItemWidget(final MenuItem item) {
ImageAnchor a = new ImageAnchor(null, item.getLabel());
a.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
log.debug("Item clicked:", item.getLabel());
event.stopPropagation();
item.select();
update();
}
});
FlowPanel itemPanel = new FlowPanel();
itemPanel.setStyleName("NavigatorWidget-item");
SimplePanel itemLink = Gwt.createDiv("NavigatorWidget-item-link", a);
itemPanel.add(itemLink);
if (item.isSelected()) {
if (item instanceof Submenu) {
boolean animate = lastAnimatedItem != item;
// log.debug("---------- animate:", animate);
Widget submenuPanel = animate ? new AnimatingFlowPanel(0.5) : new FlowPanel();
if (animate) lastAnimatedItem = item;
submenuPanel.setStyleName("NavigatorWidget-submenu");
itemPanel.add(submenuPanel);
Submenu<MenuItem> submenu = (Submenu) item;
for (MenuItem subItem : submenu.getMenu().getItems()) {
((HasWidgets) submenuPanel).add(createItemWidget(subItem));
}
} else {
itemLink.addStyleDependentName("selected");
}
}
return itemPanel;
}
public void addItem(String label, K key, Runnable selecionListener) {
initialize();
boolean menuEmpty = menu.getItems().isEmpty();
StaticMenuItem item = menu.addItem(new StaticMenuItem(label));
if (menuEmpty) item.select();
item.setPayload(key);
item.setOnSelect(selecionListener);
}
public void select(K key) {
StaticMenuItem item = menu.getItemByPayload(key);
if (item == null) return;
item.select();
update();
}
public void setMenu(StaticMenu menu) {
this.menu = menu;
}
@Override
public String toString() {
return "NavigatorWidget(" + menu + ")";
}
}