Performance: use simple row focus indicator and us detach() instead of setvisible.

This commit is contained in:
Heng Sin Low 2012-03-05 12:56:03 +08:00
parent 877d0409ba
commit 9800528f42
1 changed files with 50 additions and 46 deletions

View File

@ -54,7 +54,6 @@ import org.zkoss.zul.RendererCtrl;
import org.zkoss.zul.Row; import org.zkoss.zul.Row;
import org.zkoss.zul.RowRenderer; import org.zkoss.zul.RowRenderer;
import org.zkoss.zul.RowRendererExt; import org.zkoss.zul.RowRendererExt;
import org.zkoss.zhtml.Input;
import org.zkoss.zhtml.Label; import org.zkoss.zhtml.Label;
import org.zkoss.zhtml.Text; import org.zkoss.zhtml.Text;
@ -66,9 +65,8 @@ import org.zkoss.zhtml.Text;
* <li>BF [ 2996608 ] GridPanel is not displaying time * <li>BF [ 2996608 ] GridPanel is not displaying time
* https://sourceforge.net/tracker/?func=detail&aid=2996608&group_id=176962&atid=955896 * https://sourceforge.net/tracker/?func=detail&aid=2996608&group_id=176962&atid=955896
*/ */
public class GridTabRowRenderer implements RowRenderer, RowRendererExt, RendererCtrl { public class GridTabRowRenderer implements RowRenderer<Object[]>, RowRendererExt, RendererCtrl {
private static final String CURRENT_ROW_STYLE = "background-color: #BDEDFF";
private static final int MAX_TEXT_LENGTH = 60; private static final int MAX_TEXT_LENGTH = 60;
private GridTab gridTab; private GridTab gridTab;
private int windowNo; private int windowNo;
@ -98,9 +96,19 @@ public class GridTabRowRenderer implements RowRenderer, RowRendererExt, Renderer
this.dataBinder = new GridTabDataBinder(gridTab); this.dataBinder = new GridTabDataBinder(gridTab);
} }
private WEditor getEditorCell(GridField gridField, Object object, int i) { private WEditor getEditorCell(GridField gridField) {
WEditor editor = editors.get(gridField); WEditor editor = editors.get(gridField);
if (editor != null) { if (editor != null) {
prepareFieldEditor(gridField, editor);
}
editor.addValueChangeListener(dataBinder);
gridField.removePropertyChangeListener(editor);
gridField.addPropertyChangeListener(editor);
editor.setValue(gridField.getValue());
return editor;
}
private void prepareFieldEditor(GridField gridField, WEditor editor) {
if (editor instanceof WButtonEditor) if (editor instanceof WButtonEditor)
{ {
if (m_windowPanel != null) if (m_windowPanel != null)
@ -117,21 +125,11 @@ public class GridTabRowRenderer implements RowRenderer, RowRendererExt, Renderer
} }
} }
} }
else
{
editor.addValueChangeListener(dataBinder);
}
gridField.removePropertyChangeListener(editor);
gridField.addPropertyChangeListener(editor);
editor.setValue(gridField.getValue());
//streach component to fill grid cell //streach component to fill grid cell
if (editor.getComponent() instanceof Textbox) if (editor.getComponent() instanceof HtmlBasedComponent) {
((HtmlBasedComponent)editor.getComponent()).setWidth("98%");
else
editor.fillHorizontal(); editor.fillHorizontal();
} }
return editor;
} }
private int getColumnIndex(GridField field) { private int getColumnIndex(GridField field) {
@ -309,7 +307,7 @@ public class GridTabRowRenderer implements RowRenderer, RowRendererExt, Renderer
else else
child = parent; child = parent;
} }
Component component = div.getFirstChild(); Component component = (Component) div.getAttribute("display.component");
if (updateCellLabel) { if (updateCellLabel) {
if (component instanceof Label) { if (component instanceof Label) {
Label label = (Label)component; Label label = (Label)component;
@ -325,13 +323,14 @@ public class GridTabRowRenderer implements RowRenderer, RowRendererExt, Renderer
checkBox.setChecked(false); checkBox.setChecked(false);
} }
} }
component.setVisible(true);
if (row == null) if (row == null)
row = ((Row)div.getParent()); row = ((Row)div.getParent());
entry.getValue().getComponent().detach(); entry.getValue().getComponent().detach();
entry.getKey().removePropertyChangeListener(entry.getValue()); entry.getKey().removePropertyChangeListener(entry.getValue());
entry.getValue().removeValuechangeListener(dataBinder); entry.getValue().removeValuechangeListener(dataBinder);
div.appendChild(component);
} }
} }
@ -345,7 +344,7 @@ public class GridTabRowRenderer implements RowRenderer, RowRendererExt, Renderer
* @see RowRenderer#render(Row, Object) * @see RowRenderer#render(Row, Object)
*/ */
@Override @Override
public void render(Row row, Object data, int index) throws Exception { public void render(Row row, Object[] data, int index) throws Exception {
//don't render if not visible //don't render if not visible
if (gridPanel != null && !gridPanel.isVisible()) { if (gridPanel != null && !gridPanel.isVisible()) {
return; return;
@ -357,7 +356,7 @@ public class GridTabRowRenderer implements RowRenderer, RowRendererExt, Renderer
if (rowListener == null) if (rowListener == null)
rowListener = new RowListener((Grid)row.getParent().getParent()); rowListener = new RowListener((Grid)row.getParent().getParent());
currentValues = (Object[])data; currentValues = data;
int columnCount = gridTab.getTableModel().getColumnCount(); int columnCount = gridTab.getTableModel().getColumnCount();
GridField[] gridField = gridTab.getFields(); GridField[] gridField = gridTab.getFields();
Grid grid = (Grid) row.getParent().getParent(); Grid grid = (Grid) row.getParent().getParent();
@ -368,9 +367,18 @@ public class GridTabRowRenderer implements RowRenderer, RowRendererExt, Renderer
rowIndex = (paging.getActivePage() * paging.getPageSize()) + rowIndex; rowIndex = (paging.getActivePage() * paging.getPageSize()) + rowIndex;
} }
Div indicatorDiv = new Div();
indicatorDiv.setStyle("text-align: center; border: none; width: 100%; height: 100%;");
indicatorDiv.appendChild(new Label());
//TODO: checkbox for selection and batch action ( delete, export, complete, etc )
// indicatorDiv.appendChild(new Checkbox());
row.appendChild(indicatorDiv);
int colIndex = -1; int colIndex = -1;
int compCount = 0;
for (int i = 0; i < columnCount; i++) { for (int i = 0; i < columnCount; i++) {
if (editors.get(gridField[i]) == null)
editors.put(gridField[i], WebEditorFactory.getEditor(gridField[i], true));
if (!gridField[i].isDisplayed()) { if (!gridField[i].isDisplayed()) {
continue; continue;
} }
@ -380,13 +388,9 @@ public class GridTabRowRenderer implements RowRenderer, RowRendererExt, Renderer
String divStyle = "border: none; width: 100%; height: 100%;"; String divStyle = "border: none; width: 100%; height: 100%;";
org.zkoss.zul.Column column = (org.zkoss.zul.Column) columns.getChildren().get(colIndex); org.zkoss.zul.Column column = (org.zkoss.zul.Column) columns.getChildren().get(colIndex);
if (column.isVisible()) { if (column.isVisible()) {
compCount++;
Component component = getDisplayComponent(rowIndex, currentValues[i], gridField[i]); Component component = getDisplayComponent(rowIndex, currentValues[i], gridField[i]);
div.appendChild(component); div.appendChild(component);
// if (compCount == 1) { div.setAttribute("display.component", component);
//add hidden input component to help focusing to row
div.appendChild(createAnchorInput());
// }
if (DisplayType.YesNo == gridField[i].getDisplayType() || DisplayType.Image == gridField[i].getDisplayType()) { if (DisplayType.YesNo == gridField[i].getDisplayType() || DisplayType.Image == gridField[i].getDisplayType()) {
divStyle += "text-align:center; "; divStyle += "text-align:center; ";
@ -399,6 +403,7 @@ public class GridTabRowRenderer implements RowRenderer, RowRendererExt, Renderer
div.setAttribute("columnName", gridField[i].getColumnName()); div.setAttribute("columnName", gridField[i].getColumnName());
div.addEventListener(Events.ON_CLICK, rowListener); div.addEventListener(Events.ON_CLICK, rowListener);
div.addEventListener(Events.ON_DOUBLE_CLICK, rowListener); div.addEventListener(Events.ON_DOUBLE_CLICK, rowListener);
row.addEventListener(Events.ON_CLICK, rowListener);
row.appendChild(div); row.appendChild(div);
} }
@ -408,28 +413,27 @@ public class GridTabRowRenderer implements RowRenderer, RowRendererExt, Renderer
row.addEventListener(Events.ON_OK, rowListener); row.addEventListener(Events.ON_OK, rowListener);
} }
/**
* @param component
* @return
*/
private Input createAnchorInput() {
Input input = new Input();
input.setDynamicProperty("type", "text");
input.setValue("");
input.setDynamicProperty("readonly", "readonly");
input.setStyle("border: none; display: none; width: 3px;");
return input;
}
/** /**
* @param row * @param row
*/ */
public void setCurrentRow(Row row) { public void setCurrentRow(Row row) {
if (currentRow != null && currentRow.getParent() != null && currentRow != row) { if (currentRow != null && currentRow.getParent() != null && currentRow != row) {
currentRow.setStyle(null); Div div = (Div) currentRow.getFirstChild();
if (div != null) {
Label label = (Label) div.getFirstChild();
label.getChildren().clear();
}
} }
currentRow = row; currentRow = row;
currentRow.setStyle(CURRENT_ROW_STYLE); Div div = (Div) currentRow.getFirstChild();
if (div != null) {
Label label = (Label) div.getFirstChild();
label.getChildren().clear();
label.appendChild(new Text(">>"));
label.setStyle("color: darkblue; font-weight: bold; text-align: center");
}
currentRowIndex = gridTab.getCurrentRow();
if (currentRowIndex == gridTab.getCurrentRow()) { if (currentRowIndex == gridTab.getCurrentRow()) {
if (editing) { if (editing) {
stopEditing(false); stopEditing(false);
@ -466,20 +470,19 @@ public class GridTabRowRenderer implements RowRenderer, RowRendererExt, Renderer
int columnCount = gridTab.getTableModel().getColumnCount(); int columnCount = gridTab.getTableModel().getColumnCount();
GridField[] gridField = gridTab.getFields(); GridField[] gridField = gridTab.getFields();
org.zkoss.zul.Columns columns = grid.getColumns(); org.zkoss.zul.Columns columns = grid.getColumns();
int colIndex = -1; //skip indicator column
int colIndex = 0;
for (int i = 0; i < columnCount; i++) { for (int i = 0; i < columnCount; i++) {
if (!gridField[i].isDisplayed()) { if (!gridField[i].isDisplayed()) {
continue; continue;
} }
colIndex ++; colIndex ++;
if (editors.get(gridField[i]) == null)
editors.put(gridField[i], WebEditorFactory.getEditor(gridField[i], true));
org.zkoss.zul.Column column = (org.zkoss.zul.Column) columns.getChildren().get(colIndex); org.zkoss.zul.Column column = (org.zkoss.zul.Column) columns.getChildren().get(colIndex);
if (column.isVisible()) { if (column.isVisible()) {
Div div = (Div) currentRow.getChildren().get(colIndex); Div div = (Div) currentRow.getChildren().get(colIndex);
div.getFirstChild().setVisible(false); div.getFirstChild().detach();
WEditor editor = getEditorCell(gridField[i], currentValues[i], i); WEditor editor = getEditorCell(gridField[i]);
div.appendChild(editor.getComponent()); div.appendChild(editor.getComponent());
WEditorPopupMenu popupMenu = editor.getPopupMenu(); WEditorPopupMenu popupMenu = editor.getPopupMenu();
@ -596,7 +599,7 @@ public class GridTabRowRenderer implements RowRenderer, RowRendererExt, Renderer
this.gridPanel = gridPanel; this.gridPanel = gridPanel;
} }
class RowListener implements EventListener { class RowListener implements EventListener<Event> {
private Grid _grid; private Grid _grid;
@ -608,6 +611,7 @@ public class GridTabRowRenderer implements RowRenderer, RowRendererExt, Renderer
if (Events.ON_CLICK.equals(event.getName())) { if (Events.ON_CLICK.equals(event.getName())) {
Event evt = new Event(Events.ON_CLICK, _grid, event.getTarget()); Event evt = new Event(Events.ON_CLICK, _grid, event.getTarget());
Events.sendEvent(_grid, evt); Events.sendEvent(_grid, evt);
evt.stopPropagation();
} }
else if (Events.ON_DOUBLE_CLICK.equals(event.getName())) { else if (Events.ON_DOUBLE_CLICK.equals(event.getName())) {
Event evt = new Event(Events.ON_DOUBLE_CLICK, _grid, _grid); Event evt = new Event(Events.ON_DOUBLE_CLICK, _grid, _grid);