/* * Copyright (c) 2010 Lockheed Martin Corporation * * 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.eurekastreams.web.client.ui.common.tabs; import java.util.HashMap; import java.util.Map; import org.eurekastreams.web.client.events.UpdateHistoryEvent; import org.eurekastreams.web.client.history.CreateUrlRequest; import org.eurekastreams.web.client.ui.Session; import org.eurekastreams.web.client.ui.pages.master.StaticResourceBundle; import com.allen_sauer.gwt.dnd.client.PickupDragController; 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.FocusPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Widget; /** * A simple tab. Just a name and a content widget. Can't be simpler than that. Oh, it also supports dragging and * dropping. I guess its not THAT simple. * */ public class SimpleTab extends FlowPanel { /** * The inner div. This is necessary because focuspanel can only have 1 child. Silly GWT. */ private final FlowPanel panel = new FlowPanel(); /** * focusPanel is the outside div for the tab. It is a focus panel for clickablility. */ private final FocusPanel focusPanel = new FocusPanel(); /** * The label is the text of the tab. */ private final Label label; /** * The contents are what are displayed when the tab is clicked. */ private Widget contents; /** * Is this tab draggable. */ private boolean draggable = true; /** The tab's identifier. */ private final String identifier; /** * Parameters to remove from the URL when the tab is selected. (This is a very primitive form of context handling. * The idea is that parameters set by controls on one tab aren't left in the URL to affect controls on another tab. */ private String[] paramsToClear = {}; /** * Parameters to set when this tab is selected. */ private Map<String, String> paramsToSet = null; /** * Constructor with no contents. (Sometimes tabs do other things when clicked.) * * @param inIdentifier * the identifier of the tab (also used as the title). */ public SimpleTab(final String inIdentifier) { this(inIdentifier, inIdentifier, null); } /** * Constructor. * * @param inIdentifier * the identifier of the tab (also used as the title). * @param inContents * the contents to show when the tab is clicked. */ public SimpleTab(final String inIdentifier, final Widget inContents) { this(inIdentifier, inIdentifier, inContents); } /** * Constructor. * * @param inIdentifier * the identifier of the tab. * @param inTitle * The title to display on the tab. * @param inContents * the contents to show when the tab is clicked. */ public SimpleTab(final String inIdentifier, final String inTitle, final Widget inContents) { this.addStyleName(StaticResourceBundle.INSTANCE.coreCss().tab()); focusPanel.add(panel); this.add(focusPanel); identifier = inIdentifier; label = new Label(inTitle); contents = inContents; panel.add(label); } /** * @param inParams * List of URL parameters to clear when tab is selected. */ public void setParamsToClear(final String... inParams) { paramsToClear = inParams; } /** * Set the params that will be added when this tab is selected. * * @param inParamsToSet * the paramsToSet to set */ public void setParamsToSet(final Map<String, String> inParamsToSet) { paramsToSet = inParamsToSet; } /** * Set whether the tab is draggable. * * @param inDraggable * draggable. */ public void setDraggable(final boolean inDraggable) { draggable = inDraggable; } /** * Init the tab. * * @param key * the history token key. */ public void init(final String key) { focusPanel.addClickHandler(new ClickHandler() { public void onClick(final ClickEvent event) { if (getIdentifier() != null) { Map<String, String> params = new HashMap<String, String>(); params.put(key, getIdentifier()); int length = paramsToClear.length; for (int i = 0; i < length; i++) { params.put(paramsToClear[i], null); } if (paramsToSet != null) { length = paramsToSet.keySet().size(); for (String key : paramsToSet.keySet()) { params.put(key, paramsToSet.get(key)); } } Session.getInstance().getEventBus().notifyObservers( new UpdateHistoryEvent(new CreateUrlRequest(params, false))); } } }); } /** * Make this tab draggable. * * @param dragController * the drag controller. */ public void makeTabDraggable(final PickupDragController dragController) { if (draggable) { dragController.makeDraggable(this, label); } } /** * Set the contents manually. * * @param inContents * the contents. */ public void setContents(final Widget inContents) { contents = inContents; } /** * Get the contents. * * @return the contents. */ public Widget getContents() { return contents; } /** * Gets the label for subclasses. * * @return the label. */ public Label getLabel() { return label; } /** * Gets the panel for subclasses. * * @return the panel. */ protected FlowPanel getPanel() { return panel; } /** * Gets the focuspanel for subclasses. * * @return the focuspanel. */ protected FocusPanel getFocusPanel() { return focusPanel; } /** * The identifier of the tab is how it is keyed in the system. Also, what will be displayed in the URL when clicked. * *IT MUST BE UNIQUE ACROSS ALL TABS* * * @return the identifier. */ public String getIdentifier() { return identifier; } /** * Gets called when the tab is selected. */ public void select() { addStyleName(StaticResourceBundle.INSTANCE.coreCss().active()); } /** * Gets called when the tab is unselected. */ public void unSelect() { removeStyleName(StaticResourceBundle.INSTANCE.coreCss().active()); } /** * Renames the tab. * * @param inTitle * New name. */ @Override public void setTitle(final String inTitle) { label.setText(inTitle); } }