package com.iambookmaster.client;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.EventListener;
import com.google.gwt.user.client.ui.StackPanel;
import com.iambookmaster.client.common.TrueStackPanelListener;
import com.iambookmaster.client.locale.AppLocale;
public class TrueStackPanel extends StackPanel {
private static final String HEADER_NORMAL_STYLE = "notes_panel_header";
private static final String HEADER_SELECTED_STYLE = "notes_panel_header_sel";
private static final String HEADER_HIGHLIGHT_STYLE = "notes_panel_header_highlight";
private TrueStackPanelListener listener;
public TrueStackPanel() {
setSize("100%", "100%");
}
//not the best solution...but Google does the same
public void onBrowserEvent(Event event) {
switch (DOM.eventGetType(event)) {
case Event.ONCLICK:
int oldIndex = getSelectedIndex();
try {
super.onBrowserEvent(event);
} catch (Exception e) {
//it causes NullPointerException on FF3.x
}
int newIndex = getSelectedIndex();
if (oldIndex != newIndex) {
selectHeader(oldIndex, false);
selectHeader(newIndex, true);
}
if (listener != null) {
listener.activate(newIndex);
}
case Event.ONMOUSEOVER:
hightlightHeader(event,true);
break;
case Event.ONMOUSEOUT:
hightlightHeader(event,false);
break;
}
}
public void setStackHeader(int row, String name, String icon_url, String title) {
setStackHeader(row,name,icon_url,title,null);
}
public void setStackHeader(int row, String name, String icon_url, String title,EventListener sortListener) {
StringBuffer buffer = new StringBuffer();
buffer.append("<div class=\"notes_panel_header_left\">");
buffer.append("<div class=\"notes_panel_header_right\" >");
buffer.append("<div class=\"notes_panel_header_inside\">");
buffer.append("<img src=\"");
buffer.append(icon_url);
buffer.append("\"/>");
buffer.append(name);
if (sortListener != null) {
buffer.append("<img src=\"");
buffer.append(Images.SORT);
buffer.append("\" title=\"");
buffer.append(AppLocale.getAppConstants().sort());
buffer.append("\"/>");
}
buffer.append("</div></div></div>");
setStackText(row, buffer.toString(), true);
Element wrapper = getHeaderWrapper(row);
if (sortListener != null) {
Element tdWrapper = DOM.getChild(wrapper, 0);
tdWrapper = DOM.getChild(tdWrapper,0);
tdWrapper = DOM.getChild(tdWrapper,0);
tdWrapper = DOM.getChild(tdWrapper,0);
tdWrapper = DOM.getChild(tdWrapper,1);
DOM.sinkEvents(tdWrapper,Event.ONCLICK);
DOM.setEventListener(tdWrapper, sortListener);
}
DOM.setStyleAttribute(wrapper, "height", "20px");
setTitle(row, title);
selectHeader(row, false);
}
private Element getHeaderElement(int index) {
Element tdWrapper = getHeaderWrapper(index);
return DOM.getFirstChild(tdWrapper);
}
private Element getHeaderWrapper(int index) {
Element element = DOM.getChild(getElement(),0);
return DOM.getChild(DOM.getChild(element, index * 2), 0);
}
// private Element getBodyWrapper(int index) {
// Element element = DOM.getChild(getElement(),0);
// return DOM.getChild(DOM.getChild(element, index * 2+1), 0);
// }
private void setHeaderStyle(int index,String style) {
Element header = getHeaderElement(index);
DOM.setElementProperty(header, "className",style);
}
private void hightlightHeader(Event event, boolean highlight) {
int index = findDividerIndex(DOM.eventGetTarget(event));
if (index >=0 && index != getSelectedIndex()) {
if (highlight) {
setHeaderStyle(index,HEADER_HIGHLIGHT_STYLE);
} else {
setHeaderStyle(index, HEADER_NORMAL_STYLE);
}
}
}
public void selectHeader(int index, boolean selected) {
if (selected) {
setHeaderStyle(index,HEADER_SELECTED_STYLE);
} else {
setHeaderStyle(index, HEADER_NORMAL_STYLE);
}
}
public void setTitle(int index,String title) {
Element header = getHeaderElement(index);
if (title == null || title.length() == 0) {
DOM.removeElementAttribute(header, "title");
} else {
DOM.setElementAttribute(header, "title", title);
}
}
/**
* This is a copy of private method in com.google.gwt.user.client.ui.StackPanel
* @param elem
* @return
*/
private int findDividerIndex(Element elem) {
while (elem != null && elem != getElement()) {
String expando = DOM.getElementProperty(elem, "__index");
if (expando != null) {
// Make sure it belongs to me!
int ownerHash = DOM.getElementPropertyInt(elem, "__owner");
if (ownerHash == hashCode()) {
// Yes, it's mine.
return Integer.parseInt(expando);
} else {
// It must belong to some nested StackPanel.
return -1;
}
}
elem = DOM.getParent(elem);
}
return -1;
}
public TrueStackPanelListener getListener() {
return listener;
}
public void setListener(TrueStackPanelListener listener) {
this.listener = listener;
}
}