package oraloganalyzer.views;
import java.util.HashMap;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;
import oraloganalyzer.model.OraError;
import oraloganalyzer.model.OraLineError;
import oraloganalyzer.model.ParsingResult;
import org.eclipse.nebula.widgets.grid.Grid;
import org.eclipse.nebula.widgets.grid.GridColumn;
import org.eclipse.nebula.widgets.grid.GridItem;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
public class ErrorListGridView extends ErrorListView
{
private Grid grid;
private Map<String, GridItem> gridDataMap;
public ErrorListGridView()
{
super();
}
public void createPartControl(Composite parent)
{
gridDataMap = new HashMap<String, GridItem>();
GridData gridData = new GridData();
gridData.verticalAlignment = GridData.FILL;
gridData.horizontalSpan = 3;
gridData.grabExcessHorizontalSpace = true;
gridData.grabExcessVerticalSpace = true;
gridData.horizontalAlignment = GridData.FILL;
this.grid = new Grid(parent,SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
grid.setLayoutData(gridData);
grid.setHeaderVisible(true);
grid.setRowHeaderVisible(false);
grid.setLinesVisible(true);
grid.setRowsResizeable(true);
GridColumn codeColumn = new GridColumn(grid, SWT.NONE);
codeColumn.setText("Fehlercode");
codeColumn.setWidth(80);
codeColumn.setTree(true);
GridColumn zeileColumn = new GridColumn(grid, SWT.NONE);
zeileColumn.setText("Zeile");
zeileColumn.setWidth(70);
GridColumn meldungColumn = new GridColumn(grid, SWT.NONE);
meldungColumn.setText("Fehlermeldung");
meldungColumn.setWidth(500);
meldungColumn.setWordWrap(true);
registerListeners();
this.getViewSite().getPage().getWorkbenchWindow().addPerspectiveListener(this);
}
public void setFocus()
{
this.grid.setFocus();
}
public void setInput(ParsingResult input)
{
this.data = input;
grid.removeAll();
gridDataMap.clear();
fillGrid();
grid.redraw();
}
private void fillGrid()
{
SortedSet<OraError> oeSet = new TreeSet<OraError>();
for(OraLineError ole : this.data.getResults())
{
oeSet.add(ole.getError());
}
Color nodeRowColor = Display.getCurrent().getSystemColor(SWT.COLOR_YELLOW);
//Color nodeRowColor = new Color(Display.getCurrent(), new RGB(0, 128, 0));
for(OraError err : oeSet)
{
GridItem node = new GridItem(grid,SWT.NONE);
node.setText(labelProvider.formatFehlercode(err));
node.setBackground(0, nodeRowColor);
node.setBackground(1, nodeRowColor);
node.setBackground(2, nodeRowColor);
//node.setExpanded(true);
node.setData("anzahl", 0);
gridDataMap.put(labelProvider.formatFehlercode(err), node);
}
for(OraLineError ole : this.data.getResults())
{
GridItem node = gridDataMap.get(labelProvider.formatFehlercode(ole.getError()));
int anz = (Integer) node.getData("anzahl");
node.setData("anzahl", anz+1);
GridItem subnode = new GridItem(node,SWT.NONE);
subnode.setText(1,labelProvider.getColumnText(ole, IErrorListColumns.ZEILE));
subnode.setText(2,labelProvider.getColumnText(ole, IErrorListColumns.FEHLERMELDUNG));
subnode.setData(ole);
}
for(GridItem errNode : gridDataMap.values())
{
errNode.setText(2, "Anzahl: " + errNode.getData("anzahl"));
}
}
public void clearData()
{
this.data = null;
grid.removeAll();
gridDataMap.clear();
}
private final void registerListeners()
{
grid.addSelectionListener(new SelectionListener()
{
public void widgetDefaultSelected(SelectionEvent event)
{
}
public void widgetSelected(SelectionEvent event)
{
try
{
GridItem item = (GridItem) event.item;
OraLineError ole = (OraLineError) item.getData();
editor.selectAndReveal(ole.getOffset(), ole.getError()
.getErrType().getErrCodeLength());
} catch (RuntimeException e)
{
}
}
});
}
}