/*
* Copyright 2015 JBoss, by Red Hat, Inc
*
* 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.uberfire.ext.widgets.common.client.tables;
import java.util.ArrayList;
import java.util.HashMap;
import javax.inject.Inject;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Widget;
import org.gwtbootstrap3.client.shared.event.TabShowEvent;
import org.gwtbootstrap3.client.shared.event.TabShowHandler;
import org.gwtbootstrap3.client.ui.Anchor;
import org.gwtbootstrap3.client.ui.Button;
import org.gwtbootstrap3.client.ui.NavTabs;
import org.gwtbootstrap3.client.ui.TabContent;
import org.gwtbootstrap3.client.ui.TabListItem;
import org.gwtbootstrap3.client.ui.TabPane;
import org.gwtbootstrap3.client.ui.constants.ButtonSize;
import org.gwtbootstrap3.client.ui.constants.ButtonType;
import org.gwtbootstrap3.client.ui.constants.IconType;
import org.jboss.errai.common.client.api.Caller;
import org.uberfire.ext.services.shared.preferences.MultiGridPreferencesStore;
import org.uberfire.ext.services.shared.preferences.UserPreferencesService;
import org.uberfire.ext.widgets.common.client.common.popups.YesNoCancelPopup;
import org.uberfire.ext.widgets.common.client.resources.i18n.CommonConstants;
import org.uberfire.ext.widgets.common.client.tables.popup.NewTabFilterPopup;
import org.uberfire.mvp.Command;
/**
* Widget that shows rows of paged data.
*/
public class FilterPagedTable<T>
extends Composite {
private static Binder uiBinder = GWT.create(Binder.class);
public Command refreshGridCommand;
protected MultiGridPreferencesStore multiGridPreferencesStore;
@UiField
NavTabs navTabs;
@UiField
TabContent tabContent;
private HashMap<String, DataGridFilter> dataGridFilterHashMap = new HashMap<String, DataGridFilter>();
@Inject
private Caller<UserPreferencesService> preferencesService;
public FilterPagedTable() {
}
public FilterPagedTable(MultiGridPreferencesStore gridsPreferences) {
this.multiGridPreferencesStore = gridsPreferences;
}
public void removeTab(String gridKey) {
int index = getGridIndex(gridKey);
if (index != -1) {
dataGridFilterHashMap.remove(gridKey);
removeTab(index);
multiGridPreferencesStore.removeTab(gridKey);
multiGridPreferencesStore.setSelectedGrid("");
if (navTabs.getWidgetCount() > 1) {
selectTab(index == 0 ? 0 : index - 1);
}
preferencesService.call().saveUserPreferences(multiGridPreferencesStore);
}
}
public String getValidKeyForAdditionalListGrid(String baseName) {
int i;
for (i = dataGridFilterHashMap.size(); dataGridFilterHashMap.get(baseName + i) != null; i++) {
}
return baseName + i;
}
public void createNewTab(PagedTable<T> pagedTable,
final String key,
Button button,
Command filterCommand) {
multiGridPreferencesStore.setSelectedGrid(key);
preferencesService.call().saveUserPreferences(multiGridPreferencesStore);
if (navTabs.getWidgetCount() > 0) {
removeTab(navTabs.getWidgetCount() - 1);
}
addTab(pagedTable,
key,
filterCommand);
addAddTableButton(button);
selectTab(dataGridFilterHashMap.size() - 1);
}
public void addTab(final PagedTable<T> grid,
final String key,
Command filterCommand) {
dataGridFilterHashMap.put(key,
new DataGridFilter(key,
filterCommand));
final String gridHeader = multiGridPreferencesStore.getGridSettingParam(key,
NewTabFilterPopup.FILTER_TAB_NAME_PARAM);
final String gridTitle = multiGridPreferencesStore.getGridSettingParam(key,
NewTabFilterPopup.FILTER_TAB_DESC_PARAM);
final String safeHtmlGridHeader =(gridHeader!=null ? SafeHtmlUtils.htmlEscape(gridHeader) : "");
final String safeHtmlGridTitle =(gridTitle!=null ? SafeHtmlUtils.htmlEscape(gridTitle) : "");
grid.addTableTitle(safeHtmlGridTitle);
Button close = null;
if (!"base".equals(key)) {
close = GWT.create(Button.class);
close.setType(ButtonType.LINK);
close.setIcon(IconType.TIMES);
close.setSize(ButtonSize.EXTRA_SMALL);
close.setTitle(CommonConstants.INSTANCE.Close() + " " + gridHeader);
close.getElement().getStyle().setVerticalAlign(Style.VerticalAlign.TEXT_TOP);
close.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
getYesNoCancelPopup(safeHtmlGridHeader,
key).show();
}
});
}
addContentTab(gridHeader,
close,
grid,
key);
selectTab(dataGridFilterHashMap.size() - 1);
}
protected YesNoCancelPopup getYesNoCancelPopup(final String gridHeader,
final String key) {
return YesNoCancelPopup.newYesNoCancelPopup(CommonConstants.INSTANCE.RemoveTabTitle(),
CommonConstants.INSTANCE.RemoveTabConfirm(gridHeader),
new Command() {
@Override
public void execute() {
removeTab(key);
}
},
null,
new Command() {
@Override
public void execute() {
}
});
}
public void addAddTableButton(Button addTableButton) {
addContentTab(null,
addTableButton,
GWT.<HTML>create(HTML.class),
null);
}
public Widget makeWidget() {
return uiBinder.createAndBindUi(this);
}
public MultiGridPreferencesStore getMultiGridPreferencesStore() {
return multiGridPreferencesStore;
}
public void setMultiGridPreferencesStore(MultiGridPreferencesStore multiGridPreferencesStore) {
this.multiGridPreferencesStore = multiGridPreferencesStore;
}
public void setPreferencesService(Caller<UserPreferencesService> preferencesService) {
this.preferencesService = preferencesService;
}
private int getGridIndex(String key) {
if (key == null) {
return -1;
}
ArrayList<String> tabsId = multiGridPreferencesStore.getGridsId();
for (int i = 0; i < tabsId.size(); i++) {
if (key.equals(tabsId.get(i))) {
return i;
}
}
return -1;
}
public void setSelectedTab() {
int selectedTab = getGridIndex(getMultiGridPreferencesStore().getSelectedGrid());
if (selectedTab != -1) {
selectTab(selectedTab);
} else {
selectTab(0);
}
}
public void saveTabSettings(String key,
HashMap<String, Object> params) {
multiGridPreferencesStore.setGridSettings(key,
params);
preferencesService.call().saveUserPreferences(multiGridPreferencesStore);
}
public void saveNewTabSettings(String key,
HashMap<String, Object> params) {
multiGridPreferencesStore.addNewTab(key,
params);
preferencesService.call().saveUserPreferences(multiGridPreferencesStore);
}
public void saveNewRefreshInterval(int newValue) {
multiGridPreferencesStore.setRefreshInterval(newValue);
preferencesService.call().saveUserPreferences(multiGridPreferencesStore);
}
public int getRefreshInterval() {
return multiGridPreferencesStore.getRefreshInterval();
}
public void setRefreshGridCommand(Command refreshGridCommand) {
this.refreshGridCommand = refreshGridCommand;
}
private void selectTab(int index) {
final TabListItem widget = (TabListItem) navTabs.getWidget(index);
if (widget != null) {
widget.showTab();
}
}
public void removeTab(int index) {
if (index < 0) {
return;
}
if (index < navTabs.getWidgetCount()) {
navTabs.remove(index);
}
if (index < tabContent.getWidgetCount()) {
tabContent.remove(index);
}
}
private void addContentTab(final String title,
final Widget titleWidget,
final Widget content,
final String key) {
final TabListItem tabListItem = GWT.create(TabListItem.class);
tabListItem.addShowHandler(new TabShowHandler() {
@Override
public void onShow(TabShowEvent event) {
if (key != null) {
multiGridPreferencesStore.setSelectedGrid(key);
preferencesService.call().saveUserPreferences(multiGridPreferencesStore);
dataGridFilterHashMap.get(key).getFilterCommand().execute();
}
}
});
final TabPane tabPane = GWT.create(TabPane.class);
tabPane.add(content);
tabListItem.setDataTargetWidget(tabPane);
if (title != null) {
tabListItem.setText(title);
}
if (titleWidget != null && tabListItem.getWidget(0) instanceof Anchor) {
((Anchor) tabListItem.getWidget(0)).add(titleWidget);
}
navTabs.add(tabListItem);
tabContent.add(tabPane);
}
interface Binder
extends
UiBinder<Widget, FilterPagedTable> {
}
}