/*
* DataTable.java
*
* Copyright (C) 2009-15 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.dataviewer;
import java.util.ArrayList;
import org.rstudio.core.client.dom.IFrameElementEx;
import org.rstudio.core.client.dom.WindowEx;
import org.rstudio.core.client.resources.ImageResource2x;
import org.rstudio.core.client.theme.res.ThemeStyles;
import org.rstudio.core.client.widget.LatchingToolbarButton;
import org.rstudio.core.client.widget.RStudioFrame;
import org.rstudio.core.client.widget.SearchWidget;
import org.rstudio.core.client.widget.Toolbar;
import org.rstudio.core.client.widget.ToolbarLabel;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.ui.SuggestOracle;
public class DataTable
{
public interface Host
{
RStudioFrame getDataTableFrame();
}
public DataTable(Host host)
{
host_ = host;
}
public void initToolbar(Toolbar toolbar, boolean isPreview)
{
filterButton_ = new LatchingToolbarButton(
"Filter",
new ImageResource2x(DataViewerResources.INSTANCE.filterIcon2x()),
new ClickHandler() {
public void onClick(ClickEvent event)
{
boolean newFilterState = !filtered_;
// attempt to apply the new filter state, and update state
// if we succeed (might fail if the filter UI is not
// ready/table is not initialized)
if (setFilterUIVisible(newFilterState))
{
filtered_ = newFilterState;
filterButton_.setLatched(filtered_);
}
}
});
toolbar.addLeftWidget(filterButton_);
filterButton_.setVisible(!isPreview);
searchWidget_ = new SearchWidget(new SuggestOracle() {
@Override
public void requestSuggestions(Request request, Callback callback)
{
// no suggestions
callback.onSuggestionsReady(
request,
new Response(new ArrayList<Suggestion>()));
}
});
searchWidget_.addValueChangeHandler(new ValueChangeHandler<String>() {
@Override
public void onValueChange(ValueChangeEvent<String> event)
{
applySearch(getWindow(), event.getValue());
}
});
toolbar.addRightWidget(searchWidget_);
searchWidget_.setVisible(!isPreview);
if (isPreview)
{
ToolbarLabel label =
new ToolbarLabel("(Displaying up to 1,000 records)");
label.addStyleName(ThemeStyles.INSTANCE.toolbarInfoLabel());
toolbar.addRightWidget(label);
}
}
private WindowEx getWindow()
{
IFrameElementEx frameEl = (IFrameElementEx) host_.getDataTableFrame().getElement().cast();
return frameEl.getContentWindow();
}
public boolean setFilterUIVisible(boolean visible)
{
return setFilterUIVisible(getWindow(), visible);
}
public void refreshData(boolean structureChanged, boolean sizeChanged)
{
// if the structure of the data changed, the old search/filter data is
// discarded, as it may no longer be applicable to the data's new shape.
if (structureChanged)
{
filtered_= false;
if (searchWidget_ != null)
searchWidget_.setText("", false);
if (filterButton_ != null)
filterButton_.setLatched(false);
}
refreshData(getWindow(), structureChanged, sizeChanged);
}
public void onActivate()
{
onActivate(getWindow());
}
public void onDeactivate()
{
try
{
onDeactivate(getWindow());
}
catch(Exception e)
{
// swallow exceptions occurring when deactivating, as they'll keep
// users from switching tabs
}
}
private static final native boolean setFilterUIVisible (WindowEx frame, boolean visible) /*-{
if (frame && frame.setFilterUIVisible)
return frame.setFilterUIVisible(visible);
return false;
}-*/;
private static final native void refreshData(WindowEx frame,
boolean structureChanged,
boolean sizeChanged) /*-{
if (frame && frame.refreshData)
frame.refreshData(structureChanged, sizeChanged);
}-*/;
private static final native void applySearch(WindowEx frame, String text) /*-{
if (frame && frame.applySearch)
frame.applySearch(text);
}-*/;
private static final native void onActivate(WindowEx frame) /*-{
if (frame && frame.onActivate)
frame.onActivate();
}-*/;
private static final native void onDeactivate(WindowEx frame) /*-{
if (frame && frame.onDeactivate)
frame.onDeactivate();
}-*/;
private Host host_;
private LatchingToolbarButton filterButton_;
private SearchWidget searchWidget_;
private boolean filtered_ = false;
}