package com.gwt.ui.client.toolbar; import java.util.ArrayList; 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.ui.AbsolutePanel; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.Widget; import com.gwt.ui.client.resources.Images; public class ToolbarPanel extends AbsolutePanel { private ArrayList<Toolbar> elements = new ArrayList<Toolbar>(); private ArrayList<ToolbarSplitterInfo> splitters = new ArrayList<ToolbarSplitterInfo>(); private boolean dragged = false; private ToolbarSplitterInfo draggedToolbar; /** * A constructor for this class. */ public ToolbarPanel() { setStyleName("ToolbarPanel"); setWidth("100%"); sinkEvents(Event.MOUSEEVENTS); } /** * Add a toolbar to the panel. The toolbars are displayed in the order they are added. * * @param bar toolbar widget */ public void addToolbar(Toolbar bar) { if (elements.size() > 0) { Toolbar tb = elements.get(elements.size() - 1); createSplitter(tb); } add(bar); elements.add(bar); bar.redraw(); populate(); } private Image createSplitter(Toolbar toolbar) { Image splitter = createSplitter(); add(splitter); splitters.add(new ToolbarSplitterInfo(toolbar, splitter)); return splitter; } private Image createSplitter() { Image splitter = new Image(Images.IMAGES.spacerIcon()); splitter.setSize("4px", "16px"); splitter.setStyleName("ToolbarPanel-Splitter"); return splitter; } public void onBrowserEvent(Event event) { switch (DOM.eventGetType(event)) { case Event.ONMOUSEDOWN: { Element target = DOM.eventGetTarget(event); int size = splitters.size(); for (int i = 0; i < size; i++) { ToolbarSplitterInfo splitter = splitters.get(i); Image sp = splitter.getSplitter(); if (DOM.isOrHasChild(sp.getElement(), target)) { draggedToolbar = splitter; dragged = true; DOM.setCapture(getElement()); DOM.eventPreventDefault(event); return; } } dragged = false; break; } case Event.ONMOUSEUP: { DOM.releaseCapture(getElement()); dragged = false; break; } case Event.ONMOUSEMOVE: { if (dragged) { assert DOM.getCaptureElement() != null; Toolbar prev = draggedToolbar.getToobar(); int x = DOM.eventGetClientX(event); int pw = prev.getOffsetWidth(); int pend = prev.getAbsoluteLeft() + pw; int pchange = x - pend; int pnw = pw + pchange; if (pnw < 0) { pnw = 0; } int size = elements.size(); int[] widths = new int[size]; for (int i = 0; i < size; i++) { Toolbar tb = elements.get(i); if (tb == prev) { widths[i] = pnw; } else { widths[i] = tb.getOffsetWidth(); } } repopulate(widths); DOM.eventPreventDefault(event); } break; } } } private void repopulate(int[] widths) { int size = elements.size(); for (int i = 0; i < size; i++) { Toolbar tb = elements.get(i); tb.setWidth(widths[i] + "px"); } populate(); } /** * Redraw the panel. Sometimes when the size of the child toolbar changes, it is necessary to draw the panel. */ public void redraw() { int size = elements.size(); for (int i = 0; i < size; i++) { Toolbar bar = elements.get(i); bar.redraw(); } populate(); } private void populate() { int max = 0; int left = 2; int top = 5; int size = elements.size(); for (int i = 0; i < size; i++) { Widget w = elements.get(i); if (w.getOffsetHeight() > max) { max = w.getOffsetHeight(); } } for (int i = 0; i < size; i++) { Widget w = elements.get(i); setWidgetPosition(w, left, top); w.setHeight(max + "px"); left += w.getOffsetWidth(); if (i < size - 1) { Image split = splitters.get(i).getSplitter(); split.setHeight((max + top + top) + "px"); setWidgetPosition(split, left, 0); left += split.getOffsetWidth(); } left += 2; } setHeight((max + top + top) + "px"); } protected void onLoad() { super.onLoad(); redraw(); } public Toolbar createToolbar(){ Toolbar bar = new Toolbar(); bar.setHorizontalSpacing(10); this. addToolbar(bar); return bar; } }