/******************************************************************************* | |
* Copyright (c) 2011, 2012 Formal Mind GmbH and University of Dusseldorf. | |
* All rights reserved. This program and the accompanying materials | |
* are made available under the terms of the Eclipse Public License v1.0 | |
* which accompanies this distribution, and is available at | |
* http://www.eclipse.org/legal/epl-v10.html | |
* | |
* Contributors: | |
* Michael Jastram - initial API and implementation | |
******************************************************************************/ | |
package org.eclipse.rmf.reqif10.pror.editor.agilegrid; | |
import java.util.HashMap; | |
import org.agilemore.agilegrid.AgileGrid; | |
import org.agilemore.agilegrid.DefaultLayoutAdvisor; | |
import org.agilemore.agilegrid.ICellRenderer; | |
import org.eclipse.rmf.reqif10.SpecHierarchy; | |
import org.eclipse.rmf.reqif10.Specification; | |
public class ProrLayoutAdvisor extends DefaultLayoutAdvisor { | |
private final HashMap<Integer, String> topHeaderLabel = new HashMap<Integer, String>(); | |
private int columnCount; | |
private int rowCount; | |
private final HashMap<Integer, HashMap<Integer, Integer>> cachedCellHeights = new HashMap<Integer, HashMap<Integer, Integer>>(); | |
public ProrLayoutAdvisor(AgileGrid agileGrid) { | |
super(agileGrid); | |
} | |
@Override | |
public String getTopHeaderLabel(int col) { | |
String label; | |
if (col == columnCount - 1) { | |
label = "Link"; | |
} else { | |
label = topHeaderLabel.get(col); | |
} | |
return label != null ? label : ("Column " + (col + 1)); | |
} | |
@Override | |
protected void doSetTopHeaderLabel(int col, String label) { | |
topHeaderLabel.put(col, label); | |
} | |
@Override | |
protected void doSetColumnCount(int columnCount) { | |
this.columnCount = columnCount; | |
} | |
@Override | |
public int getColumnCount() { | |
return columnCount; | |
} | |
@Override | |
protected void doSetRowCount(int rowCount) { | |
this.rowCount = rowCount; | |
} | |
@Override | |
public int getRowCount() { | |
return rowCount; | |
} | |
/** | |
* Used by some {@link ICellRenderer}s to store the cell's height. The | |
* method checks whether the row height has changed and notifies the | |
* associated {@link ProrAgileGrid}. | |
*/ | |
void setCellHeight(int row, int col, int height) { | |
int oldRowHeight = getRowHeight(row); | |
HashMap<Integer, Integer> cols = cachedCellHeights.get(row); | |
if (cols == null) { | |
cols = new HashMap<Integer, Integer>(); | |
cachedCellHeights.put(row, cols); | |
} | |
cols.put(col, height); | |
int newRowHeight = getRowHeight(row); | |
if (oldRowHeight != newRowHeight) { | |
super.setRowHeight(row, newRowHeight); | |
agileGrid.redraw(); | |
} | |
} | |
@Override | |
public int getRowHeight(int row) { | |
ProrRow prorRow = ((ProrAgileGridContentProvider) agileGrid | |
.getContentProvider()).getProrRow(row); | |
if (prorRow != null && ! prorRow.isVisible()) return 1; | |
int height = 18; | |
if (cachedCellHeights.get(row) == null) { | |
return height; | |
} | |
HashMap<Integer, Integer> cols = cachedCellHeights.get(row); | |
if (cols == null) { | |
return height; | |
} | |
for (Integer h : cols.values()) { | |
if (h > height) { | |
height = h; | |
} | |
} | |
return height; | |
} | |
@Override | |
public String getLeftHeaderLabel(int row) { | |
StringBuffer sb = new StringBuffer(); | |
ProrRow prorRow = ((ProrAgileGridContentProvider) agileGrid | |
.getContentProvider()).getProrRow(row); | |
if (!(prorRow instanceof ProrRow.ProrRowSpecHierarchy)) { | |
return ""; | |
} | |
SpecHierarchy specHierarchy = ((ProrRow.ProrRowSpecHierarchy) prorRow).getSpecHierarchy(); | |
while (specHierarchy.eContainer() instanceof SpecHierarchy) { | |
SpecHierarchy parent = (SpecHierarchy) specHierarchy.eContainer(); | |
int level = parent.getChildren().indexOf(specHierarchy) + 1; | |
sb.insert(0, level); | |
sb.insert(0, "."); | |
specHierarchy = parent; | |
} | |
if (specHierarchy.eContainer() instanceof Specification) { | |
Specification parent = (Specification) specHierarchy | |
.eContainer(); | |
int level = parent.getChildren().indexOf(specHierarchy) + 1; | |
sb.insert(0, level); | |
} | |
return sb.toString(); | |
} | |
} |