/*
* CodeBrowserContextWidget.java
*
* Copyright (C) 2009-12 by RStudio, Inc.
*
* Unless you have received this program directly from RStudio pursuant
* to the terms of a commercial license agreement with RStudio, then
* this program is licensed to you under the terms of version 3 of the
* GNU Affero General Public License. This program is distributed WITHOUT
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
* AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
*
*/
package org.rstudio.studio.client.workbench.views.source.editors.codebrowser;
import org.rstudio.core.client.resources.ImageResource2x;
import org.rstudio.core.client.theme.res.ThemeResources;
import org.rstudio.core.client.widget.ScrollableToolbarPopupMenu;
import org.rstudio.studio.client.workbench.codesearch.model.SearchPathFunctionDefinition;
import com.google.gwt.core.client.JsArrayString;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.HasSelectionHandlers;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.event.shared.GwtEvent;
import com.google.gwt.event.shared.HandlerManager;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.MenuItem;
public class CodeBrowserContextWidget extends Composite
implements HasSelectionHandlers<String>
{
public CodeBrowserContextWidget(
final CodeBrowserEditingTargetWidget.Styles styles)
{
HorizontalPanel panel = new HorizontalPanel();
captionLabel_ = new Label();
captionLabel_.addStyleName(styles.captionLabel());
panel.add(captionLabel_);
ClickHandler clickHandler = new ClickHandler()
{
public void onClick(ClickEvent event)
{
if (dropDownImage_.isVisible())
{
CodeBrowserPopupMenu menu = new CodeBrowserPopupMenu();
JsArrayString methods = functionDef_.getMethods();
for (int i=0; i < methods.length(); i++)
{
final String method = methods.get(i);
MenuItem mi = new MenuItem(method, new Command() {
@Override
public void execute()
{
SelectionEvent.fire(CodeBrowserContextWidget.this,
method) ;
}
});
mi.getElement().getStyle().setPaddingRight(20, Unit.PX);
menu.addItem(mi);
}
menu.showRelativeTo(nameLabel_);
menu.getElement().getStyle().setPaddingTop(3, Unit.PX);
}
}
};
nameLabel_ = new Label();
nameLabel_.addStyleName(styles.menuElement());
nameLabel_.addStyleName(styles.functionName());
nameLabel_.addClickHandler(clickHandler);
panel.add(nameLabel_);
namespaceLabel_ = new Label();
namespaceLabel_.addStyleName(styles.menuElement());
namespaceLabel_.addStyleName(styles.functionNamespace());
namespaceLabel_.addClickHandler(clickHandler);
panel.add(namespaceLabel_);
dropDownImage_ = new Image(new ImageResource2x(ThemeResources.INSTANCE.mediumDropDownArrow2x()));
dropDownImage_.addStyleName(styles.menuElement());
dropDownImage_.addStyleName(styles.dropDownImage());
dropDownImage_.addClickHandler(clickHandler);
panel.add(dropDownImage_);
dropDownImage_.setVisible(false);
initWidget(panel);
}
@Override
public HandlerRegistration addSelectionHandler(
SelectionHandler<String> handler)
{
return handlers_.addHandler(SelectionEvent.getType(), handler);
}
@Override
public void fireEvent(GwtEvent<?> event)
{
handlers_.fireEvent(event) ;
}
public void setCurrentFunction(SearchPathFunctionDefinition functionDef)
{
functionDef_ = functionDef;
nameLabel_.setText(functionDef.getName());
namespaceLabel_.setText("(" + functionDef.getNamespace() + ")");
if (functionDef.getMethods().length() > 0)
{
captionLabel_.setText("Method:");
dropDownImage_.setVisible(true);
}
else
{
captionLabel_.setText("Function:");
dropDownImage_.setVisible(false);
}
}
private class CodeBrowserPopupMenu extends ScrollableToolbarPopupMenu
{
@Override
protected int getMaxHeight()
{
return Window.getClientHeight() - captionLabel_.getAbsoluteTop() -
captionLabel_.getOffsetHeight() - 50;
}
}
private SearchPathFunctionDefinition functionDef_;
private Label captionLabel_;
private Label nameLabel_;
private Label namespaceLabel_;
private Image dropDownImage_;
private final HandlerManager handlers_ = new HandlerManager(null);
}