/* * Copyright 2014-2015 CyberVision, 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.kaaproject.avro.ui.gwt.client.widget.grid; import java.util.HashSet; import java.util.Set; import org.kaaproject.avro.ui.gwt.client.util.Utils; import com.google.gwt.cell.client.Cell.Context; import com.google.gwt.dom.builder.shared.TableCellBuilder; import com.google.gwt.dom.builder.shared.TableRowBuilder; import com.google.gwt.safehtml.shared.SafeHtmlUtils; import com.google.gwt.user.cellview.client.AbstractCellTable; import com.google.gwt.user.cellview.client.AbstractCellTable.Style; import com.google.gwt.user.cellview.client.Column; import com.google.gwt.user.cellview.client.DefaultHeaderOrFooterBuilder; import com.google.gwt.user.cellview.client.Header; import com.google.gwt.user.cellview.client.SafeHtmlHeader; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.Widget; public class StringFilterHeaderBuilder<T> extends DefaultHeaderOrFooterBuilder<T> { private AbstractGrid<T,?> grid; public StringFilterHeaderBuilder(AbstractGrid<T,?> grid) { super(grid.getDataGrid(), false); this.grid = grid; } @SuppressWarnings("unchecked") @Override protected boolean buildHeaderOrFooterImpl() { boolean result = super.buildHeaderOrFooterImpl(); AbstractCellTable<T> table = getTable(); Header<?> prevHeader = getHeader(0); Style style = table.getResources().style(); StringBuilder classesBuilder = new StringBuilder(style.header()); classesBuilder.append(" ").append(Utils.avroUiStyle.fieldWidget()); TableRowBuilder tr = startRow(); for (int i=0;i<table.getColumnCount();i++) { appendExtraStyles(prevHeader, classesBuilder); TableCellBuilder th = tr.startTH().className(classesBuilder.toString()); Column<T,?> column = table.getColumn(i); Header<?> header = null; if (column instanceof FiltrableStringColumn) { StringFilterHeader filterHeader = new StringFilterHeader(grid, (FiltrableStringColumn<T>)column, new Integer(i)); Set<String> headerEvents = filterHeader.getCell().getConsumedEvents(); Set<String> consumedEvents = new HashSet<String>(); if (headerEvents != null) { consumedEvents.addAll(headerEvents); } sinkEvents(table, consumedEvents); header = filterHeader; } else { header = new SafeHtmlHeader( SafeHtmlUtils.fromSafeConstant("")); } Context context = new Context(0, 0, header.getKey()); renderHeader(th, context, header); th.endTH(); } tr.endTR(); return result; } private <H> void appendExtraStyles(Header<H> header, StringBuilder classesBuilder) { if (header == null) { return; } String headerStyleNames = header.getHeaderStyleNames(); if (headerStyleNames != null) { classesBuilder.append(" "); classesBuilder.append(headerStyleNames); } } public final void sinkEvents(Widget widget, Set<String> typeNames) { if (typeNames == null) { return; } int eventsToSink = 0; for (String typeName : typeNames) { int typeInt = Event.getTypeInt(typeName); if (typeInt < 0) { widget.sinkBitlessEvent(typeName); } else { typeInt = sinkEvent(widget, typeName); if (typeInt > 0) { eventsToSink |= typeInt; } } } if (eventsToSink > 0) { widget.sinkEvents(eventsToSink); } } protected int sinkEvent(Widget widget, String typeName) { return Event.getTypeInt(typeName); } }