/* * 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; }