/* * Copyright 2009 Google Inc. * * 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 com.google.appengine.demos.taskengine.client; import com.google.gwt.dom.client.DivElement; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.Element; import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; import com.google.gwt.resources.client.ImageResource; import com.google.gwt.resources.client.ImageResource.ImageOptions; import com.google.gwt.resources.client.ImageResource.RepeatStyle; import com.google.gwt.user.client.EventListener; import java.util.ArrayList; import java.util.List; /** * This is a UI component that corresponds to the bar at the top of the * Application with the logo and some controls. */ public class ControlBar extends Widget { /** * The set of buttons/controls that are added to the ControlBar. */ public static class Controls { private final ControlBar.Resources resources; List<DivElement> controls = new ArrayList<DivElement>(); public Controls(ControlBar.Resources resources) { this.resources = resources; } /** * Creates a control styled by a specified CSS class selector name. Performs * the inputed action on click. * * @param cssClassName * @param action */ public void addControl(String cssClassName, EventListener action) { DivElement control = Document.get().createDivElement(); control.setClassName(resources.controlBarCss().control() + " " + cssClassName); DomUtils.addEventListener("click", control, action); controls.add(control); } public void hideControls() { for (int i = 0, n = controls.size(); i < n; i++) { controls.get(i).getStyle().setProperty("display", "none"); } } public void showControls() { for (int i = 0, n = controls.size(); i < n; i++) { controls.get(i).getStyle().setProperty("display", ""); } } private void attach(ControlBar controlBar) { Element controlBarElement = controlBar.getElement(); for (int i = 0, n = controls.size(); i < n; i++) { controlBarElement.appendChild(controls.get(i)); } } } /** * Class selectors for parts we want to style. */ public interface Css extends CssResource { String control(); String controlBar(); String logo(); } /** * Images and CssResources for the ControlBar. */ public interface Resources extends ClientBundle { @Source("resources/ControlBar.css") Css controlBarCss(); @Source("resources/logo.png") ImageResource logo(); @Source("resources/topBarBg.png") @ImageOptions(repeatStyle = RepeatStyle.Horizontal) ImageResource topBarBg(); } private final Controls controls; /** * Constructor that enforces "must know parent at construction time" rule. * * @param parentElement the DOM element we want to attach to * @param controls the controls we want to include */ public ControlBar(Element parentElement, ControlBar.Resources resources, Controls controls) { super(parentElement); this.controls = controls; Element myBaseElem = getElement(); // Set the CSS styles for our root Element. myBaseElem.setClassName(resources.controlBarCss().controlBar()); // Add the logo. DivElement logo = Document.get().createDivElement(); logo.setClassName(resources.controlBarCss().logo()); getElement().appendChild(logo); // Attach to the parent element parentElement.appendChild(myBaseElem); // Attach the controls to us controls.attach(this); } public void enableControls() { controls.showControls(); } public void disableControls() { controls.hideControls(); } }