/*
* Copyright (c) 2009-2011 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.autocomplete;
import org.eurekastreams.web.client.ui.pages.master.StaticResourceBundle;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.event.dom.client.FocusEvent;
import com.google.gwt.event.dom.client.FocusHandler;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.DeferredCommand;
import com.google.gwt.user.client.Random;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.TextBoxBase;
/**
* Auto complete drop down widget.
*
*/
public abstract class AutoCompleteDropDownPanel extends FlowPanel
{
/**
* The possible form element types.
*
*/
public enum ElementType
{
/**
* A textbox form element.
*/
TEXTBOX,
/**
* A textarea form element.
*/
TEXTAREA;
}
/**
* The command interface for what happens when one selects the item.
*
*/
public interface OnItemSelectedCommand
{
/**
* Gets called when the item is selected.
*
* @param obj
* the javascript object of the selected.
*/
void itemSelected(final JavaScriptObject obj);
}
/** The command. */
private static OnItemSelectedCommand command;
/** Text box/area. */
private TextBoxBase textWidget;
/** The text widget as a textbox (avoid cast). */
private TextBox textBox;
/** Clear panel. */
private final FlowPanel clearPanel = new FlowPanel();
/** Results panel. */
private final FlowPanel resultsPanel = new FlowPanel();
/** Random identifier. */
private final String rand = String.valueOf(Random.nextInt());
/**
* Default constructor.
*
* @param url
* the resource url.
*/
public AutoCompleteDropDownPanel(final String url)
{
this(url, ElementType.TEXTBOX);
}
/**
* Default constructor.
*
* @param url
* the resource url.
* @param inElementType
* the element type
*/
public AutoCompleteDropDownPanel(final String url, final ElementType inElementType)
{
this.addStyleName(StaticResourceBundle.INSTANCE.coreCss().yuiSkinSam());
this.addStyleName(StaticResourceBundle.INSTANCE.coreCss().autoComplete());
final SimplePanel textWrapper = new SimplePanel();
if (inElementType == ElementType.TEXTBOX)
{
textBox = new TextBox();
textWidget = textBox;
textWrapper.addStyleName(StaticResourceBundle.INSTANCE.coreCss().textboxInputWrapper());
}
else
{
textWidget = new ExtendedTextArea();
textWrapper.addStyleName(StaticResourceBundle.INSTANCE.coreCss().textareaInputWrapper());
}
textWidget.getElement().setAttribute("id", "actb-" + rand);
// Need to do this to fix an especially nasty IE CSS bug (input margin inheritance)
textWrapper.addStyleName(StaticResourceBundle.INSTANCE.coreCss().acInputWrapper());
textWrapper.add(textWidget);
this.add(textWrapper);
resultsPanel.getElement().setAttribute("id", "acra-" + rand);
clearPanel.setStyleName(StaticResourceBundle.INSTANCE.coreCss().clear());
this.add(clearPanel);
this.add(resultsPanel);
DeferredCommand.addCommand(new Command()
{
public void execute()
{
setUpAutoComplete("actb-" + rand, "acra-" + rand, url);
}
});
}
/**
* Sets the default text.
*
* @param text
* the text.
*/
public void setDefaultText(final String text)
{
textWidget.setText(text);
textWidget.addStyleName(StaticResourceBundle.INSTANCE.coreCss().defaultClass());
textWidget.addFocusHandler(new FocusHandler()
{
public void onFocus(final FocusEvent inEvent)
{
textWidget.setText("");
textWidget.removeStyleName(StaticResourceBundle.INSTANCE.coreCss().defaultClass());
}
});
}
/**
* Sets the text.
*
* @param text
* The text.
*/
public void setText(final String text)
{
textWidget.setText(text);
}
/**
* Clear the text in the text box.
*/
public void clearText()
{
textWidget.setText("");
}
/**
* Set the maxlength field.
*
* @param maxLength
* the length to set.
*/
public void setMaxLength(final int maxLength)
{
textBox.setMaxLength(maxLength);
}
/**
* Get the text from the text box.
*
* @return The text.
*/
public String getText()
{
return textWidget.getText();
}
/**
* Returns the random identifier.
*
* @return the random identifier.
*/
public String getRandomIdentifier()
{
return rand;
}
/**
* Set up the command.
*
* @param inCommand
* the command.
*/
public void setOnItemSelectedCommand(final OnItemSelectedCommand inCommand)
{
command = inCommand;
}
/**
* Gets called by the JSNI when the item is selected.
*
* @param obj
* the javascript object.
*/
public static void onItemSelect(final JavaScriptObject obj)
{
if (command != null)
{
command.itemSelected(obj);
}
}
/**
* Returns the text widget.
*
* @return the text widget.
*/
protected TextBoxBase getTextWidget()
{
return textWidget;
}
/**
* Sets up the auto complete.
*
* @param taId
* the text area id.
* @param acdId
* the auto complete area id.
* @param url
* the url.
*/
protected abstract void setUpAutoComplete(final String taId, final String acdId, final String url);
}