From: Matti Tahvonen Date: Wed, 11 Jul 2007 07:20:24 +0000 (+0000) Subject: refactoring and first steps towars column collapsing X-Git-Tag: 6.7.0.beta1~6188 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=4c4b44fddf274093e89c30126e2fc52469f4394e;p=vaadin-framework.git refactoring and first steps towars column collapsing svn changeset:1837/svn branch:trunk --- diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IAction.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IAction.java index af75a49491..72c834079b 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IAction.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IAction.java @@ -6,68 +6,29 @@ import com.itmill.toolkit.terminal.gwt.client.Client; /** * */ -public class IAction implements Command { +public abstract class IAction implements Command { - IActionOwner owner; + protected IActionOwner owner; - String targetKey = ""; - String actionKey = ""; + protected String iconUrl = null; - String iconUrl = null; - - String caption = ""; + protected String caption = ""; public IAction(IActionOwner owner) { this.owner = owner; } - public IAction(IActionOwner owner, String target, String action) { - this(owner); - this.targetKey = target; - this.actionKey = action; - } - - /** - * Sends message to server that this action has been fired. - * Messages are "standard" Toolkit messages whose value is comma - * separated pair of targetKey (row, treeNod ...) and actions id. - * - * Variablename is always "action". - * - * Actions are always sent immediatedly to server. + * Executed when action fired */ - public void execute() { - owner.getClient().updateVariable( - owner.getPaintableId(), - "action", - targetKey + "," + actionKey, - true); - owner.getClient().getContextMenu().hide(); - } - - public String getActionKey() { - return actionKey; - } - - public void setActionKey(String actionKey) { - this.actionKey = actionKey; - } - - public String getTargetKey() { - return targetKey; - } - - public void setTargetKey(String targetKey) { - this.targetKey = targetKey; - } - - public String getHTMLRepresentation() { + public abstract void execute(); + + public String getHTML() { StringBuffer sb = new StringBuffer(); - if(iconUrl != null) { - sb.append("\"icon\""); + if(getIconUrl() != null) { + sb.append("\"icon\""); } - sb.append(caption); + sb.append(getCaption()); return sb.toString(); } @@ -78,6 +39,10 @@ public class IAction implements Command { public void setCaption(String caption) { this.caption = caption; } + + public String getIconUrl() { + return iconUrl; + } } /** diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IContextMenu.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IContextMenu.java index d18120f217..ea7de7e2e0 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IContextMenu.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IContextMenu.java @@ -1,6 +1,5 @@ package com.itmill.toolkit.terminal.gwt.client.ui; -import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.MenuBar; import com.google.gwt.user.client.ui.MenuItem; import com.google.gwt.user.client.ui.PopupPanel; @@ -43,7 +42,7 @@ public class IContextMenu extends PopupPanel { IAction[] actions = actionOwner.getActions(); for (int i = 0; i < actions.length; i++) { IAction a = actions[i]; - menu.addItem(new MenuItem(a.getHTMLRepresentation(), true, a)); + menu.addItem(new MenuItem(a.getHTML(), true, a)); } setPopupPosition(left, top); diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IScrollTable.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IScrollTable.java index ec81c750c2..8e6f1a0885 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IScrollTable.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IScrollTable.java @@ -11,8 +11,15 @@ import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.DeferredCommand; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.Event; +import com.google.gwt.user.client.EventListener; import com.google.gwt.user.client.Timer; +import com.google.gwt.user.client.ui.ClickListener; import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.FlexTable; +import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.Grid; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Panel; import com.google.gwt.user.client.ui.ScrollListener; import com.google.gwt.user.client.ui.ScrollPanel; @@ -58,11 +65,11 @@ public class IScrollTable extends Composite implements Paintable, ITable, Scroll private ScrollPanel bodyContainer = new ScrollPanel(); - private ScrollPanel headerContainer = new ScrollPanel(); - private boolean colWidthsInitialized = false; private int totalRows; private HashMap columnWidths = new HashMap(); + private HashMap columnCaptions = new HashMap(); + private Set collapsedColumns; private RowRequestHandler rowRequestHandler; private IScrollTableBody tBody; @@ -82,14 +89,14 @@ public class IScrollTable extends Composite implements Paintable, ITable, Scroll private HashMap actionMap = new HashMap(); public IScrollTable() { - headerContainer.setStyleName("iscrolltable-header"); - headerContainer.add(tHead); - DOM.setStyleAttribute(headerContainer.getElement(), "overflow", "hidden"); + // TODO move headerContainer and column selector into TableHead bodyContainer.addScrollListener(this); VerticalPanel panel = new VerticalPanel(); - panel.add(headerContainer); + + + panel.add(tHead); panel.add(bodyContainer); rowRequestHandler = new RowRequestHandler(); @@ -139,6 +146,13 @@ public class IScrollTable extends Composite implements Paintable, ITable, Scroll this.columnOrder = uidl.getStringArrayVariable("columnorder"); } + if(uidl.hasVariable("collapsedcolumns")) { + tHead.setColumnCollapsingAllowed(true); + this.collapsedColumns = uidl.getStringArrayVariableAsSet("collapsedcolumns"); + } else { + tHead.setColumnCollapsingAllowed(false); + } + UIDL columnInfo = null; UIDL rowData = null; for(Iterator it = uidl.getChildIterator(); it.hasNext();) { @@ -150,7 +164,7 @@ public class IScrollTable extends Composite implements Paintable, ITable, Scroll else if(c.getTag().equals("actions")) updateActionMap(c); else if(c.getTag().equals("visiblecolumns")) - ; + updateVisibleColumns(c); } updateHeader(columnInfo); @@ -166,6 +180,17 @@ public class IScrollTable extends Composite implements Paintable, ITable, Scroll } } + private void updateVisibleColumns(UIDL c) { + columnCaptions.clear(); + Iterator it = c.getChildIterator(); + while(it.hasNext()) { + UIDL col = (UIDL) it.next(); + columnCaptions.put( + col.getStringAttribute("cid"), + col.getStringAttribute("caption")); + } + } + private IScrollTableBody getTBody() { if(tBody == null || totalRows != tBody.getTotalRows()) { if(tBody != null) @@ -345,7 +370,7 @@ public class IScrollTable extends Composite implements Paintable, ITable, Scroll rowRequestHandler.cancel(); // fix headers horizontal scrolling - headerContainer.setHorizontalScrollPosition(scrollLeft); + tHead.setHorizontalScrollPosition(scrollLeft); firstRowInViewPort = (int) Math.ceil( scrollTop / (double) tBody.getRowHeight() ); client.console.log("At scrolltop: " + scrollTop + " At row " + firstRowInViewPort); @@ -396,7 +421,6 @@ public class IScrollTable extends Composite implements Paintable, ITable, Scroll protected void onAttach() { super.onAttach(); - int bodyWidth = tBody.getOffsetWidth(); // sync column widths initColumnWidths(); @@ -408,12 +432,11 @@ public class IScrollTable extends Composite implements Paintable, ITable, Scroll } if(width < 0) { - bodyWidth = tBody.getOffsetWidth(); bodyContainer.setWidth((tBody.getOffsetWidth() + getScrollBarWidth() ) + "px"); - headerContainer.setWidth((tBody.getOffsetWidth()) + "px"); + tHead.setWidth(bodyContainer.getOffsetWidth()); } else { bodyContainer.setWidth(width + "px"); - headerContainer.setWidth(width + "px"); + tHead.setWidth(width); } tHead.disableBrowserIntelligence(); @@ -454,7 +477,7 @@ public class IScrollTable extends Composite implements Paintable, ITable, Scroll private int getScrollBarWidth() { // TODO Auto-generated method stub - return 30; + return 20; } private class RowRequestHandler extends Timer { @@ -592,9 +615,7 @@ public class IScrollTable extends Composite implements Paintable, ITable, Scroll */ public void onBrowserEvent(Event event) { - Element target = DOM.eventGetTarget(event); - - if(isResizing || DOM.compare(target, colResizeWidget)) { + if(isResizing || DOM.compare(DOM.eventGetTarget(event), colResizeWidget)) { onResizeEvent(event); } else { handleCaptionEvent(event); @@ -748,28 +769,70 @@ public class IScrollTable extends Composite implements Paintable, ITable, Scroll } - public class TableHead extends Panel { + public class TableHead extends Panel implements IActionOwner { + + private static final int COLUMN_SELECTOR_WIDTH = 10; + private static final int COLUMN_SELECTOR_HEIGHT = 10; private static final int WRAPPER_WIDTH = 9000; Vector cells = new Vector(); Element div = DOM.createDiv(); + Element hTableWrapper = DOM.createDiv(); + Element hTableContainer = DOM.createDiv(); Element table = DOM.createTable(); Element tBody = DOM.createTBody(); Element tr = DOM.createTR(); + private Element columnSelector = DOM.createDiv(); + private int focusedSlot = -1; + private boolean columnCollapsing = false; + public TableHead() { + DOM.setStyleAttribute(hTableWrapper, "overflow", "hidden"); + DOM.setAttribute(hTableWrapper, "className", "iscrolltable-header"); + + // TODO move styles to CSS + DOM.setStyleAttribute(columnSelector, "width", COLUMN_SELECTOR_WIDTH +"px"); + DOM.setStyleAttribute(columnSelector, "float", "right"); + DOM.setStyleAttribute(columnSelector, "height", COLUMN_SELECTOR_HEIGHT + "px"); + DOM.setStyleAttribute(columnSelector, "background", "brown"); + DOM.setStyleAttribute(columnSelector, "display", "none"); + DOM.appendChild(table, tBody); DOM.appendChild(tBody, tr); - DOM.appendChild(div, table); + DOM.appendChild(hTableContainer, table); + DOM.appendChild(hTableWrapper, hTableContainer); + DOM.appendChild(div, columnSelector); + DOM.appendChild(div, hTableWrapper); setElement(div); + + DOM.sinkEvents(columnSelector, Event.ONCLICK); + } + + public void setHorizontalScrollPosition(int scrollLeft) { + DOM.setIntAttribute(hTableWrapper, "scrollLeft", scrollLeft); } + public void setWidth(int width) { + DOM.setStyleAttribute(hTableWrapper, "width", (width - getScrollBarWidth()) + "px"); + super.setWidth(width + "px"); + } + + public void setColumnCollapsingAllowed(boolean cc) { + columnCollapsing = cc; + if(cc) { + DOM.setStyleAttribute(columnSelector, "display", "block"); + } else { + DOM.setStyleAttribute(columnSelector, "display", "none"); + } + } + public void disableBrowserIntelligence() { - DOM.setStyleAttribute(div, "width", WRAPPER_WIDTH +"px"); + DOM.setStyleAttribute(hTableContainer, "width", WRAPPER_WIDTH +"px"); } public void setHeaderCell(int index, HeaderCell cell) { @@ -831,7 +894,62 @@ public class IScrollTable extends Composite implements Paintable, ITable, Scroll DOM.setStyleAttribute(DOM.getChild(tr, focusedSlot - 1), "borderRight", "none"); focusedSlot = -1; } + + public void onBrowserEvent(Event event) { + super.onBrowserEvent(event); + if(DOM.compare(DOM.eventGetTarget(event), columnSelector)) { + int left = DOM.getAbsoluteLeft(columnSelector); + int top = DOM.getAbsoluteTop(columnSelector) + COLUMN_SELECTOR_WIDTH; + client.getContextMenu().showAt(this, left, top); + } + } + + class VisibleColumnAction extends IAction { + + String colKey; + + public VisibleColumnAction(String colKey) { + super(IScrollTable.TableHead.this); + this.colKey = colKey; + caption = (String) columnCaptions.get(colKey); + } + + public void execute() { + client.getContextMenu().hide(); + // toggle selected column + if(collapsedColumns.contains(colKey)) + collapsedColumns.remove(colKey); + else + collapsedColumns.add(colKey); + + // update variable to server + client.updateVariable(paintableId, "collapsedcolumns", + collapsedColumns.toArray(), true); + } + + } + + public IAction[] getActions() { + IAction[] actions= new IAction[columnCaptions.size()]; + Iterator it = columnCaptions.keySet().iterator(); + int i = 0; + while(it.hasNext()) { + String cid = (String) it.next(); + VisibleColumnAction a = new VisibleColumnAction(cid); + a.setCaption((String) columnCaptions.get(cid)); + actions[i] = a; + i++; + } + return actions; + } + public Client getClient() { + return client; + } + + public String getPaintableId() { + return paintableId; + } } @@ -1199,13 +1317,16 @@ public class IScrollTable extends Composite implements Paintable, ITable, Scroll } } + /* (non-Javadoc) + * @see com.itmill.toolkit.terminal.gwt.client.ui.IActionOwner#getActions() + */ public IAction[] getActions() { if(actionKeys == null) return new IAction[] {}; IAction[] actions = new IAction[actionKeys.length]; for (int i = 0; i < actions.length; i++) { String actionKey = actionKeys[i]; - IAction a = new IAction(this, String.valueOf(rowKey), actionKey); + ITreeAction a = new ITreeAction(this, String.valueOf(rowKey), actionKey); a.setCaption(getActionCaption(actionKey)); actions[i] = a; } diff --git a/src/com/itmill/toolkit/terminal/gwt/public/component-themes/common/css/common.css b/src/com/itmill/toolkit/terminal/gwt/public/component-themes/common/css/common.css index 46ac419287..b35da03269 100644 --- a/src/com/itmill/toolkit/terminal/gwt/public/component-themes/common/css/common.css +++ b/src/com/itmill/toolkit/terminal/gwt/public/component-themes/common/css/common.css @@ -21,7 +21,15 @@ select { filter: alpha(opacity:30); } +i-contextmenu { + background: #fff; + border: #000; +} + /* TODO move table styles to separate file */ +.iscrolltable-header { + +} .iscrolltable-header table { border-collapse:collapse;