/*
* FindOutputCodec.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.output.find;
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.TableCellElement;
import com.google.gwt.dom.client.TableRowElement;
import org.rstudio.core.client.CodeNavigationTarget;
import org.rstudio.core.client.FilePosition;
import org.rstudio.core.client.widget.HeaderBreaksItemCodec;
import org.rstudio.studio.client.workbench.views.output.find.FindOutputResources.Styles;
import org.rstudio.studio.client.workbench.views.output.find.model.FindResult;
public class FindOutputCodec
extends HeaderBreaksItemCodec<FindResult, CodeNavigationTarget, Object>
{
public FindOutputCodec(FindOutputResources resources)
{
styles_ = resources.styles();
}
@Override
public TableRowElement getRowForItem(FindResult entry)
{
if (entry == null)
{
// Overflow message
TableRowElement tr = Document.get().createTRElement();
TableCellElement td = Document.get().createTDElement();
td.setClassName(styles_.overflowWarning());
td.setColSpan(2);
td.setInnerText("More than 1000 matching lines were found. " +
"Only the first 1000 lines are shown.");
tr.appendChild(td);
return tr;
}
TableRowElement tr = Document.get().createTRElement();
tr.setAttribute(DATA_FILE, entry.getFile());
tr.setAttribute(DATA_LINE, entry.getLine() + "");
TableCellElement td1 = Document.get().createTDElement();
td1.setClassName(styles_.line());
td1.setInnerText(entry.getLine() + ":\u00A0");
tr.appendChild(td1);
TableCellElement td2 = Document.get().createTDElement();
td2.setClassName(styles_.lineValue());
td2.setInnerHTML(entry.getLineHTML().asString());
tr.appendChild(td2);
return tr;
}
@Override
protected boolean needsBreak(TableRowElement prevRow, TableRowElement row)
{
if (!row.hasAttribute(DATA_FILE))
return false;
return prevRow == null ||
!prevRow.getAttribute(DATA_FILE).equals(row.getAttribute(DATA_FILE));
}
@Override
protected int addBreak(TableRowElement row)
{
TableRowElement tr = Document.get().createTRElement();
tr.setClassName(styles_.headerRow());
TableCellElement td = Document.get().createTDElement();
td.setColSpan(2);
td.setInnerText(row.getAttribute(DATA_FILE));
tr.appendChild(td);
row.getParentElement().insertBefore(tr, row);
return 1;
}
@Override
public CodeNavigationTarget getOutputForRow(TableRowElement row)
{
String file = row.getAttribute(DATA_FILE);
int line = Integer.parseInt(row.getAttribute(DATA_LINE));
return new CodeNavigationTarget(file, FilePosition.create(line, 1));
}
@Override
public Object getOutputForRow2(TableRowElement row)
{
return null;
}
@Override
public boolean isValueRow(TableRowElement row)
{
return row.hasAttribute(DATA_FILE);
}
@Override
public boolean hasNonValueRows()
{
return true;
}
private Styles styles_;
private static final String DATA_FILE = "data-file";
private static final String DATA_LINE = "data-line";
}