From: Matti Tahvonen Date: Wed, 19 Sep 2007 14:36:49 +0000 (+0000) Subject: renamed layout interface to container, fixed paintable unregistering in table X-Git-Tag: 6.7.0.beta1~5979 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=642dcb2da95fc3ffbb3a03911c7c899afb56a56d;p=vaadin-framework.git renamed layout interface to container, fixed paintable unregistering in table svn changeset:2341/svn branch:trunk --- diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ApplicationConnection.java b/src/com/itmill/toolkit/terminal/gwt/client/ApplicationConnection.java index e95d435443..1b7c2e50f7 100755 --- a/src/com/itmill/toolkit/terminal/gwt/client/ApplicationConnection.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ApplicationConnection.java @@ -45,17 +45,17 @@ public class ApplicationConnection implements FocusListener { private final WidgetSet widgetSet; private IContextMenu contextMenu = null; - + private IView view = new IView(); - + public ApplicationConnection(WidgetSet widgetSet) { this.widgetSet = widgetSet; appUri = getAppUri(); if (isDebugMode()) { - console = new DebugConsole(); + console = new DebugConsole(); } else { - console = new NullConsole(); + console = new NullConsole(); } makeUidlRequest("repaintAll=1"); @@ -75,17 +75,18 @@ public class ApplicationConnection implements FocusListener { }-*/; private native String getAppUri()/*-{ - return $wnd.itmtk.appUri; - }-*/; + return $wnd.itmtk.appUri; + }-*/; private native String getPathInfo()/*-{ - return $wnd.itmtk.pathInfo; - }-*/; + return $wnd.itmtk.pathInfo; + }-*/; private void makeUidlRequest(String requestData) { console.log("Making UIDL Request with params: " + requestData); RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, appUri - + "/UIDL" + getPathInfo() + "?requestId=" + (Math.random()) + "&" + requestData); + + "/UIDL" + getPathInfo() + "?requestId=" + (Math.random()) + + "&" + requestData); try { rb.sendRequest(requestData, new RequestCallback() { public void onError(Request request, Throwable exception) { @@ -120,29 +121,29 @@ public class ApplicationConnection implements FocusListener { return; } // Handle redirect - JSONObject redirect = (JSONObject) ((JSONObject) json) - .get("redirect"); + JSONObject redirect = (JSONObject) ((JSONObject) json).get("redirect"); if (redirect != null) { - JSONString url = (JSONString)redirect.get("url"); - if (url!=null) { + JSONString url = (JSONString) redirect.get("url"); + if (url != null) { console.log("redirecting to " + url.stringValue()); redirect(url.stringValue()); return; } } - + // Store resources JSONObject resources = (JSONObject) ((JSONObject) json) .get("resources"); for (Iterator i = resources.keySet().iterator(); i.hasNext();) { String key = (String) i.next(); - resourcesMap.put(key, ((JSONString)resources.get(key)).stringValue()); + resourcesMap.put(key, ((JSONString) resources.get(key)) + .stringValue()); } - + // Store locale data - if(((JSONObject)json).containsKey("locales")) { + if (((JSONObject) json).containsKey("locales")) { JSONArray l = (JSONArray) ((JSONObject) json).get("locales"); - for(int i=0; i < l.size(); i++) + for (int i = 0; i < l.size(); i++) LocaleService.addLocale((JSONObject) l.get(i)); } @@ -175,10 +176,10 @@ public class ApplicationConnection implements FocusListener { e.printStackTrace(); } } - - if(((JSONObject) json).containsKey("meta")) { + + if (((JSONObject) json).containsKey("meta")) { JSONObject meta = ((JSONObject) json).get("meta").isObject(); - if(meta.containsKey("focus")) { + if (meta.containsKey("focus")) { String focusPid = meta.get("focus").isString().stringValue(); Paintable toBeFocused = this.getPaintable(focusPid); if (toBeFocused instanceof HasFocus) { @@ -187,43 +188,51 @@ public class ApplicationConnection implements FocusListener { } } } - + long prosessingTime = (new Date().getTime()) - start.getTime(); console.log(" Processing time was " + String.valueOf(prosessingTime) + "ms for " + jsonText.length() + " characters of JSON"); + console.log("Referenced paintables: " + idToPaintable.size()); } - - // Redirect browser - private static native void redirect(String url)/*-{ - $wnd.location = url; - }-*/; + // Redirect browser + private static native void redirect(String url)/*-{ + $wnd.location = url; + }-*/; public void registerPaintable(String id, Paintable paintable) { idToPaintable.put(id, paintable); paintableToId.put(paintable, id); } - + public void unregisterPaintable(Paintable p) { idToPaintable.remove(paintableToId.get(p)); paintableToId.remove(p); - + if (p instanceof HasWidgets) { - HasWidgets container = (HasWidgets) p; - Iterator it = container.iterator(); - while(it.hasNext()) { - Widget w = (Widget) it.next(); - if (w instanceof Paintable) { - this.unregisterPaintable((Paintable) w); - } - } + unregisterChildPaintables((HasWidgets) p); } } + public void unregisterChildPaintables(HasWidgets container) { + Iterator it = container.iterator(); + while(it.hasNext()) { + Widget w = (Widget) it.next(); + if (w instanceof Paintable) { + this.unregisterPaintable((Paintable) w); + } + if (w instanceof HasWidgets) { + unregisterChildPaintables((HasWidgets) w); + } + } + } + /** * Returns Paintable element by its id - * @param id Paintable ID + * + * @param id + * Paintable ID */ public Paintable getPaintable(String id) { return (Paintable) idToPaintable.get(id); @@ -249,7 +258,8 @@ public class ApplicationConnection implements FocusListener { req.append("changes="); for (int i = 0; i < pendingVariables.size(); i++) { - if (i>0) req.append("\u0001"); + if (i > 0) + req.append("\u0001"); req.append(pendingVariables.get(i)); } @@ -269,22 +279,26 @@ public class ApplicationConnection implements FocusListener { public void updateVariable(String paintableId, String variableName, int newValue, boolean immediate) { - addVariableToQueue(paintableId, variableName, "" + newValue, immediate, 'i'); + addVariableToQueue(paintableId, variableName, "" + newValue, immediate, + 'i'); } - + public void updateVariable(String paintableId, String variableName, long newValue, boolean immediate) { - addVariableToQueue(paintableId, variableName, "" + newValue, immediate, 'l'); + addVariableToQueue(paintableId, variableName, "" + newValue, immediate, + 'l'); } - + public void updateVariable(String paintableId, String variableName, float newValue, boolean immediate) { - addVariableToQueue(paintableId, variableName, "" + newValue, immediate, 'f'); + addVariableToQueue(paintableId, variableName, "" + newValue, immediate, + 'f'); } - + public void updateVariable(String paintableId, String variableName, double newValue, boolean immediate) { - addVariableToQueue(paintableId, variableName, "" + newValue, immediate, 'd'); + addVariableToQueue(paintableId, variableName, "" + newValue, immediate, + 'd'); } public void updateVariable(String paintableId, String variableName, @@ -301,16 +315,16 @@ public class ApplicationConnection implements FocusListener { buf.append(","); buf.append(escapeString(values[i].toString())); } - addVariableToQueue(paintableId, variableName, - buf.toString(), immediate, 'a'); + addVariableToQueue(paintableId, variableName, buf.toString(), + immediate, 'a'); } - public static Layout getParentLayout(Widget component) { + public static Container getParentLayout(Widget component) { Widget parent = component.getParent(); - while (parent != null && !(parent instanceof Layout)) + while (parent != null && !(parent instanceof Container)) parent = parent.getParent(); - if (parent != null && ((Layout) parent).hasChildComponent(component)) - return (Layout) parent; + if (parent != null && ((Container) parent).hasChildComponent(component)) + return (Container) parent; return null; } @@ -356,7 +370,7 @@ public class ApplicationConnection implements FocusListener { // Switch to correct implementation if needed if (!widgetSet.isCorrectImplementation(component, uidl)) { - Layout parent = getParentLayout(component); + Container parent = getParentLayout(component); if (parent != null) { Widget w = widgetSet.createWidget(uidl); parent.replaceChildComponent(component, w); @@ -369,7 +383,7 @@ public class ApplicationConnection implements FocusListener { // Set captions // TODO Manage Error messages if (manageCaption) { - Layout parent = getParentLayout(component); + Container parent = getParentLayout(component); if (parent != null) parent.updateCaption((Paintable) component, uidl); } @@ -386,7 +400,7 @@ public class ApplicationConnection implements FocusListener { boolean enabled = true; if (uidl.hasAttribute("disabled")) enabled = !uidl.getBooleanAttribute("disabled"); - if(!enabled) + if (!enabled) component.addStyleName("i-disabled"); else component.removeStyleName("i-disabled"); @@ -395,9 +409,9 @@ public class ApplicationConnection implements FocusListener { component.setVisible(visible); if (!visible) return true; - + // add additional styles as css classes - if(uidl.hasAttribute("style")) + if (uidl.hasAttribute("style")) component.addStyleName(uidl.getStringAttribute("style")); return false; @@ -423,18 +437,18 @@ public class ApplicationConnection implements FocusListener { registerPaintable(id, (Paintable) w); return w; } - + public String getResource(String name) { return (String) resourcesMap.get(name); } - + /** * Singleton method to get instance of app's context menu. * * @return IContextMenu object */ public IContextMenu getContextMenu() { - if(contextMenu == null) { + if (contextMenu == null) { contextMenu = new IContextMenu(); } return contextMenu; @@ -442,11 +456,11 @@ public class ApplicationConnection implements FocusListener { public void onFocus(Widget sender) { // TODO Auto-generated method stub - + } public void onLostFocus(Widget sender) { // TODO Auto-generated method stub - + } } diff --git a/src/com/itmill/toolkit/terminal/gwt/client/Container.java b/src/com/itmill/toolkit/terminal/gwt/client/Container.java new file mode 100644 index 0000000000..174e44f516 --- /dev/null +++ b/src/com/itmill/toolkit/terminal/gwt/client/Container.java @@ -0,0 +1,48 @@ +package com.itmill.toolkit.terminal.gwt.client; + +import com.google.gwt.user.client.ui.Widget; + +public interface Container extends Paintable { + + /** + * Replace child of this layout with another component. + * + * Each layout must be able to switch children. To to this, one must just + * give references to a current and new child. Note that the Layout is not + * responsible for registering Paintable into ApplicationConnection, but it + * is responsible is for unregistering it. + * + * @param oldComponent + * Child to be replaced + * @param newComponent + * Child that replaces the oldComponent + */ + void replaceChildComponent(Widget oldComponent, Widget newComponent); + + /** + * Is a given component child of this layout. + * + * @param component + * Component to test. + * @return true iff component is a child of this layout. + */ + boolean hasChildComponent(Widget component); + + /** + * Update child components caption, description and error message. + * + *

+ * Each component is responsible for maintaining its caption, description + * and error message. In most cases components doesn't want to do that and + * those elements reside outside of the component. Because of this layouts + * must provide service for it's childen to show those elements for them. + *

+ * + * @param component + * Child component for which service is requested. + * @param uidl + * UIDL of the child component. + */ + void updateCaption(Paintable component, UIDL uidl); + +} diff --git a/src/com/itmill/toolkit/terminal/gwt/client/Layout.java b/src/com/itmill/toolkit/terminal/gwt/client/Layout.java deleted file mode 100644 index 4c302726a2..0000000000 --- a/src/com/itmill/toolkit/terminal/gwt/client/Layout.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.itmill.toolkit.terminal.gwt.client; - -import com.google.gwt.user.client.ui.Widget; - -public interface Layout extends Paintable { - - /** - * Replace child of this layout with another component. - * - * Each layout must be able to switch children. To to this, one must just - * give references to a current and new child. Note that the Layout is not - * responsible for registering paintable into ApplicationConnection, but it is responsible - * is for unregistering it. - * - * @param oldComponent - * Child to be replaced - * @param newComponent - * Child that replaces the oldComponent - */ - void replaceChildComponent(Widget oldComponent, Widget newComponent); - - /** - * Is a given component child of this layout. - * - * @param component - * Component to test. - * @return true iff component is a child of this layout. - */ - boolean hasChildComponent(Widget component); - - /** - * Update child components caption, description and error message. - * - *

- * Each component is responsible for maintaining its caption, description - * and error message. In most cases components doesn't want to do that and - * those elements reside outside of the component. Because of this layouts - * must provide service for it's childen to show those elements for them. - *

- * - * @param component - * Child component for which service is requested. - * @param uidl - * UIDL of the child component. - */ - void updateCaption(Paintable component, UIDL uidl); - -} diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ICustomLayout.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ICustomLayout.java index d837ac16ed..4acc843749 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/ICustomLayout.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/ICustomLayout.java @@ -10,7 +10,7 @@ import com.google.gwt.user.client.ui.Widget; import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection; import com.itmill.toolkit.terminal.gwt.client.Caption; import com.itmill.toolkit.terminal.gwt.client.CaptionWrapper; -import com.itmill.toolkit.terminal.gwt.client.Layout; +import com.itmill.toolkit.terminal.gwt.client.Container; import com.itmill.toolkit.terminal.gwt.client.Paintable; import com.itmill.toolkit.terminal.gwt.client.UIDL; @@ -20,7 +20,7 @@ import com.itmill.toolkit.terminal.gwt.client.UIDL; * @author IT Mill * */ -public class ICustomLayout extends ComplexPanel implements Paintable, Layout { +public class ICustomLayout extends ComplexPanel implements Paintable, Container { /** Location-name to containing element in DOM map */ private HashMap locationToElement = new HashMap(); diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IForm.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IForm.java index eb16189808..5d9231efb9 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IForm.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IForm.java @@ -3,7 +3,7 @@ package com.itmill.toolkit.terminal.gwt.client.ui; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection; -import com.itmill.toolkit.terminal.gwt.client.Layout; +import com.itmill.toolkit.terminal.gwt.client.Container; import com.itmill.toolkit.terminal.gwt.client.Paintable; import com.itmill.toolkit.terminal.gwt.client.UIDL; @@ -11,7 +11,7 @@ public class IForm extends SimplePanel implements Paintable { public static final String CLASSNAME = "i-form"; - private Layout lo; + private Container lo; private ApplicationConnection client; @@ -24,7 +24,7 @@ public class IForm extends SimplePanel implements Paintable { this.client = client; UIDL layoutUidl = uidl.getChildUIDL(0); if(lo == null) { - lo = (Layout) client.getWidget(layoutUidl); + lo = (Container) client.getWidget(layoutUidl); setWidget((Widget) lo); } lo.updateFromUIDL(layoutUidl, client); diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IFormLayout.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IFormLayout.java index 063aa0c3d9..400169ffa6 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IFormLayout.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IFormLayout.java @@ -7,14 +7,14 @@ import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.Widget; import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection; import com.itmill.toolkit.terminal.gwt.client.Caption; -import com.itmill.toolkit.terminal.gwt.client.Layout; +import com.itmill.toolkit.terminal.gwt.client.Container; import com.itmill.toolkit.terminal.gwt.client.Paintable; import com.itmill.toolkit.terminal.gwt.client.UIDL; /** * Two col Layout that places caption on left col and field on right col */ -public class IFormLayout extends FlexTable implements Layout { +public class IFormLayout extends FlexTable implements Container { HashMap componentToCaption = new HashMap(); private ApplicationConnection client; diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IGridLayout.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IGridLayout.java index ab91f7f0ff..a3d2a47144 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IGridLayout.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IGridLayout.java @@ -8,11 +8,11 @@ import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.Widget; import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection; import com.itmill.toolkit.terminal.gwt.client.CaptionWrapper; -import com.itmill.toolkit.terminal.gwt.client.Layout; +import com.itmill.toolkit.terminal.gwt.client.Container; import com.itmill.toolkit.terminal.gwt.client.Paintable; import com.itmill.toolkit.terminal.gwt.client.UIDL; -public class IGridLayout extends FlexTable implements Paintable, Layout { +public class IGridLayout extends FlexTable implements Paintable, Container { /** Widget to captionwrapper map */ private HashMap widgetToCaptionWrapper = new HashMap(); diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IOrderedLayout.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IOrderedLayout.java index 56078a53a1..681341c340 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IOrderedLayout.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IOrderedLayout.java @@ -11,7 +11,7 @@ import com.google.gwt.user.client.ui.UIObject; import com.google.gwt.user.client.ui.Widget; import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection; import com.itmill.toolkit.terminal.gwt.client.Caption; -import com.itmill.toolkit.terminal.gwt.client.Layout; +import com.itmill.toolkit.terminal.gwt.client.Container; import com.itmill.toolkit.terminal.gwt.client.Paintable; import com.itmill.toolkit.terminal.gwt.client.UIDL; @@ -20,7 +20,7 @@ import com.itmill.toolkit.terminal.gwt.client.UIDL; * Use either vertical or horizontal subclass. * @author IT Mill Ltd */ -public abstract class IOrderedLayout extends ComplexPanel implements Layout { +public abstract class IOrderedLayout extends ComplexPanel implements Container { public static final String CLASSNAME = "i-orderedlayout"; 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 2850641e4c..b4a70db3b4 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IScrollTable.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IScrollTable.java @@ -36,9 +36,9 @@ import com.itmill.toolkit.terminal.gwt.client.ui.IScrollTable.IScrollTableBody.I * reordering and hiding columns. * * ScrollPanel contains IScrollTableBody object which handles content. To save - * some bandwidth and to improve clients responsiviness with loads of data, in - * IScrollTableBody all rows are not necessarely rendered. There are "spacer" in - * IScrollTableBody to use the exact same space as unrendered rows would use. + * some bandwidth and to improve clients responsiveness with loads of data, in + * IScrollTableBody all rows are not necessary rendered. There are "spacer" in + * IScrollTableBody to use the exact same space as non-rendered rows would use. * This way we can use seamlessly traditional scrollbars and scrolling to fetch * more rows instead of "paging". * @@ -49,7 +49,7 @@ import com.itmill.toolkit.terminal.gwt.client.ui.IScrollTable.IScrollTableBody.I * * TODO implement unregistering for child componts in Cells */ -public class IScrollTable extends Composite implements Paintable, ITable, +public class IScrollTable extends Composite implements ITable, ScrollListener { public static final String CLASSNAME = "i-table"; @@ -109,13 +109,14 @@ public class IScrollTable extends Composite implements Paintable, ITable, private String[] visibleColOrder; private boolean initialContentReceived = false; private Element scrollPositionElement; + private FlowPanel panel; public IScrollTable() { bodyContainer.addScrollListener(this); bodyContainer.setStyleName(CLASSNAME + "-body"); - FlowPanel panel = new FlowPanel(); + panel = new FlowPanel(); panel.setStyleName(CLASSNAME); panel.add(tHead); panel.add(bodyContainer); @@ -1589,6 +1590,7 @@ public class IScrollTable extends Composite implements Paintable, ITable, } IScrollTableRow toBeRemoved = (IScrollTableRow) renderedRows .get(index); + client.unregisterChildPaintables(toBeRemoved); DOM.removeChild(tBody, toBeRemoved.getElement()); this.orphan(toBeRemoved); renderedRows.remove(index); @@ -1885,4 +1887,20 @@ public class IScrollTable extends Composite implements Paintable, ITable, selectedRowKeys.clear(); } + + public void add(Widget w) { + throw new UnsupportedOperationException("ITable can contain only rows created by itself."); + } + + public void clear() { + panel.clear(); + } + + public Iterator iterator() { + return panel.iterator(); + } + + public boolean remove(Widget w) { + return panel.remove(w); + } } diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ITable.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ITable.java index b8b906699a..458cca95e2 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/ITable.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/ITable.java @@ -1,8 +1,10 @@ package com.itmill.toolkit.terminal.gwt.client.ui; -public interface ITable { +import com.google.gwt.user.client.ui.HasWidgets; +import com.itmill.toolkit.terminal.gwt.client.Paintable; + +public interface ITable extends HasWidgets, Paintable { final int SELECT_MODE_NONE = 0; final int SELECT_MODE_SINGLE = 1; final int SELECT_MODE_MULTI = 2; - } diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ITablePaging.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ITablePaging.java index 19b005d4e1..6d464575b1 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/ITablePaging.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/ITablePaging.java @@ -23,50 +23,54 @@ import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection; import com.itmill.toolkit.terminal.gwt.client.Paintable; import com.itmill.toolkit.terminal.gwt.client.UIDL; -public class ITablePaging extends Composite implements ITable, Paintable, ClickListener { - +/** + * TODO make this work (just an early prototype). We may want to have paging + * style table which will be much lighter than IScrollTable is. + */ +public class ITablePaging extends Composite implements ITable, Paintable, + ClickListener { + private Grid tBody = new Grid(); private Button nextPage = new Button(">"); private Button prevPage = new Button("<"); private Button firstPage = new Button("<<"); private Button lastPage = new Button(">>"); - private int pageLength = 15; - + private boolean rowHeaders = false; - + private Map columnOrder = new HashMap(); - + private ApplicationConnection client; private String id; - + private boolean immediate = false; - + private int selectMode = ITable.SELECT_MODE_NONE; - + private Vector selectedRowKeys = new Vector(); - + private int totalRows; private HashMap columnWidths = new HashMap(); - + private HashMap visibleColumns = new HashMap(); - + private int rows; private int firstRow; private boolean sortAscending = true; private HorizontalPanel pager; - + public HashMap rowKeysToTableRows = new HashMap(); - + public ITablePaging() { tBody.setStyleName("itable-tbody"); - + VerticalPanel panel = new VerticalPanel(); - + pager = new HorizontalPanel(); pager.add(firstPage); firstPage.addClickListener(this); @@ -79,7 +83,7 @@ public class ITablePaging extends Composite implements ITable, Paintable, ClickL panel.add(pager); panel.add(tBody); - + initWidget(panel); } @@ -94,56 +98,56 @@ public class ITablePaging extends Composite implements ITable, Paintable, ClickL this.pageLength = uidl.getIntAttribute("pagelength"); this.firstRow = uidl.getIntAttribute("firstrow"); this.rows = uidl.getIntAttribute("rows"); - - if(uidl.hasAttribute("selectmode")) { - if(uidl.getStringAttribute("selectmode").equals("multi")) + + if (uidl.hasAttribute("selectmode")) { + if (uidl.getStringAttribute("selectmode").equals("multi")) selectMode = ITable.SELECT_MODE_MULTI; else selectMode = ITable.SELECT_MODE_SINGLE; - - if(uidl.hasAttribute("selected")) { + + if (uidl.hasAttribute("selected")) { Set selectedKeys = uidl.getStringArrayVariableAsSet("selected"); selectedRowKeys.clear(); - for(Iterator it = selectedKeys.iterator();it.hasNext();) + for (Iterator it = selectedKeys.iterator(); it.hasNext();) selectedRowKeys.add((String) it.next()); } } - - if(uidl.hasVariable("sortascending")) + + if (uidl.hasVariable("sortascending")) this.sortAscending = uidl.getBooleanVariable("sortascending"); - if(uidl.hasAttribute("rowheaders")) + if (uidl.hasAttribute("rowheaders")) rowHeaders = true; - + UIDL rowData = null; UIDL visibleColumns = null; - for(Iterator it = uidl.getChildIterator(); it.hasNext();) { + for (Iterator it = uidl.getChildIterator(); it.hasNext();) { UIDL c = (UIDL) it.next(); - if(c.getTag().equals("rows")) + if (c.getTag().equals("rows")) rowData = c; - else if(c.getTag().equals("actions")) + else if (c.getTag().equals("actions")) updateActionMap(c); - else if(c.getTag().equals("visiblecolumns")) + else if (c.getTag().equals("visiblecolumns")) visibleColumns = c; } - tBody.resize(rows+1, uidl.getIntAttribute("cols") + (rowHeaders ? 1 : 0 )); + tBody.resize(rows + 1, uidl.getIntAttribute("cols") + + (rowHeaders ? 1 : 0)); updateHeader(visibleColumns); updateBody(rowData); - + updatePager(); } - + private void updateHeader(UIDL c) { Iterator it = c.getChildIterator(); visibleColumns.clear(); int colIndex = (rowHeaders ? 1 : 0); - while(it.hasNext()) { + while (it.hasNext()) { UIDL col = (UIDL) it.next(); String cid = col.getStringAttribute("cid"); - if(!col.hasAttribute("collapsed")) { - tBody.setWidget(0, colIndex, - new HeaderCell(cid, - col.getStringAttribute("caption"))); + if (!col.hasAttribute("collapsed")) { + tBody.setWidget(0, colIndex, new HeaderCell(cid, col + .getStringAttribute("caption"))); } colIndex++; @@ -152,44 +156,43 @@ public class ITablePaging extends Composite implements ITable, Paintable, ClickL private void updateActionMap(UIDL c) { // TODO Auto-generated method stub - + } /** - * Updates row data from uidl. UpdateFromUIDL delegates updating - * tBody to this method. + * Updates row data from uidl. UpdateFromUIDL delegates updating tBody to + * this method. * - * Updates may be to different part of tBody, depending on update type. - * It can be initial row data, scroll up, scroll down... + * Updates may be to different part of tBody, depending on update type. It + * can be initial row data, scroll up, scroll down... * - * @param uidl which contains row data + * @param uidl + * which contains row data */ private void updateBody(UIDL uidl) { Iterator it = uidl.getChildIterator(); - + int curRowIndex = 1; - while(it.hasNext()){ + while (it.hasNext()) { UIDL rowUidl = (UIDL) it.next(); - TableRow row = new TableRow( - curRowIndex, - String.valueOf(rowUidl.getIntAttribute("key")), - rowUidl.hasAttribute("selected")); + TableRow row = new TableRow(curRowIndex, String.valueOf(rowUidl + .getIntAttribute("key")), rowUidl.hasAttribute("selected")); int colIndex = 0; - if(rowHeaders) { - tBody.setWidget(curRowIndex, colIndex, - new BodyCell(row, rowUidl.getStringAttribute("caption"))); + if (rowHeaders) { + tBody.setWidget(curRowIndex, colIndex, new BodyCell(row, + rowUidl.getStringAttribute("caption"))); colIndex++; } Iterator cells = rowUidl.getChildIterator(); - while(cells.hasNext()) { + while (cells.hasNext()) { Object cell = cells.next(); if (cell instanceof String) { - tBody.setWidget(curRowIndex, colIndex, - new BodyCell(row, (String) cell)); + tBody.setWidget(curRowIndex, colIndex, new BodyCell(row, + (String) cell)); } else { - Widget cellContent = client.getWidget((UIDL) cell); - BodyCell bodyCell = new BodyCell(row); - bodyCell.setWidget(cellContent); + Widget cellContent = client.getWidget((UIDL) cell); + BodyCell bodyCell = new BodyCell(row); + bodyCell.setWidget(cellContent); tBody.setWidget(curRowIndex, colIndex, bodyCell); } colIndex++; @@ -197,20 +200,20 @@ public class ITablePaging extends Composite implements ITable, Paintable, ClickL curRowIndex++; } } - + private void updatePager() { - if(pageLength == 0) { + if (pageLength == 0) { pager.setVisible(false); return; } - if(isFirstPage()) { + if (isFirstPage()) { firstPage.setEnabled(false); prevPage.setEnabled(false); } else { firstPage.setEnabled(true); prevPage.setEnabled(true); } - if(hasNextPage()) { + if (hasNextPage()) { nextPage.setEnabled(true); lastPage.setEnabled(true); } else { @@ -221,41 +224,44 @@ public class ITablePaging extends Composite implements ITable, Paintable, ClickL } private boolean hasNextPage() { - if(firstRow + rows + 1 > totalRows) + if (firstRow + rows + 1 > totalRows) return false; return true; } private boolean isFirstPage() { - if(firstRow == 0) + if (firstRow == 0) return true; return false; } public void onClick(Widget sender) { if (sender instanceof Button) { - if(sender == firstPage) + if (sender == firstPage) client.updateVariable(this.id, "firstvisible", 0, true); - else if(sender == nextPage) - client.updateVariable(this.id, "firstvisible", firstRow + pageLength, true); - else if(sender == prevPage) { + else if (sender == nextPage) + client.updateVariable(this.id, "firstvisible", firstRow + + pageLength, true); + else if (sender == prevPage) { int newFirst = firstRow - pageLength; - if(newFirst < 0) + if (newFirst < 0) newFirst = 0; client.updateVariable(this.id, "firstvisible", newFirst, true); } else if (sender == lastPage) { - client.updateVariable(this.id, "firstvisible", totalRows - pageLength, true); + client.updateVariable(this.id, "firstvisible", totalRows + - pageLength, true); } } if (sender instanceof HeaderCell) { HeaderCell hCell = (HeaderCell) sender; client.updateVariable(this.id, "sortcolumn", hCell.getCid(), false); - client.updateVariable(this.id, "sortascending", ( sortAscending ? false : true ), true); + client.updateVariable(this.id, "sortascending", + (sortAscending ? false : true), true); } } private class HeaderCell extends HTML { - + private String cid; public String getCid() { @@ -276,22 +282,22 @@ public class ITablePaging extends Composite implements ITable, Paintable, ClickL DOM.setStyleAttribute(getElement(), "font-weight", "bold"); } } - + /** - * Abstraction of table cell content. In needs to know on which row it - * is in case of context click. + * Abstraction of table cell content. In needs to know on which row it is in + * case of context click. * * @author mattitahvonen */ public class BodyCell extends SimplePanel { private TableRow row; - + public BodyCell(TableRow row) { super(); this.sinkEvents(Event.BUTTON_LEFT | Event.BUTTON_RIGHT); this.row = row; } - + public BodyCell(TableRow row2, String textContent) { super(); this.sinkEvents(Event.BUTTON_LEFT | Event.BUTTON_RIGHT); @@ -308,7 +314,7 @@ public class ITablePaging extends Composite implements ITable, Paintable, ClickL DOM.eventCancelBubble(event, true); break; case Event.BUTTON_LEFT: - if(ITablePaging.this.selectMode > ITable.SELECT_MODE_NONE) + if (ITablePaging.this.selectMode > ITable.SELECT_MODE_NONE) row.toggleSelected(); break; default: @@ -317,9 +323,9 @@ public class ITablePaging extends Composite implements ITable, Paintable, ClickL super.onBrowserEvent(event); } } - + private class TableRow { - + private String key; private int rowIndex; private boolean selected = false; @@ -332,50 +338,53 @@ public class ITablePaging extends Composite implements ITable, Paintable, ClickL } /** - * This method is used to set row status. Does not change value on server. + * This method is used to set row status. Does not change value on + * server. + * * @param selected */ public void setSelected(boolean sel) { this.selected = sel; - if(selected) { + if (selected) { selectedRowKeys.add(key); - DOM.setStyleAttribute( - ITablePaging.this.tBody.getRowFormatter().getElement(rowIndex), - "background", "yellow"); - + DOM.setStyleAttribute(ITablePaging.this.tBody.getRowFormatter() + .getElement(rowIndex), "background", "yellow"); + } else { selectedRowKeys.remove(key); - DOM.setStyleAttribute( - ITablePaging.this.tBody.getRowFormatter().getElement(rowIndex), - "background", "transparent"); + DOM.setStyleAttribute(ITablePaging.this.tBody.getRowFormatter() + .getElement(rowIndex), "background", "transparent"); } } - public void setContextMenuOptions(HashMap options) { - + } - + /** - * Toggles rows select state. Also updates state to server according to tables immediate flag. - * + * Toggles rows select state. Also updates state to server according to + * tables immediate flag. + * */ public void toggleSelected() { - if(selected) { + if (selected) { setSelected(false); } else { - if(ITablePaging.this.selectMode == ITable.SELECT_MODE_SINGLE) { + if (ITablePaging.this.selectMode == ITable.SELECT_MODE_SINGLE) { ITablePaging.this.deselectAll(); } setSelected(true); } - client.updateVariable(id, "selected", selectedRowKeys.toArray(), immediate); + client.updateVariable(id, "selected", selectedRowKeys.toArray(), + immediate); } - + /** * Shows context menu for this row. * - * @param event Event which triggered context menu. Correct place for context menu can be determined with it. + * @param event + * Event which triggered context menu. Correct place for + * context menu can be determined with it. */ public void showContextMenu(Event event) { System.out.println("TODO: Show context menu"); @@ -386,10 +395,30 @@ public class ITablePaging extends Composite implements ITable, Paintable, ClickL Object[] keys = selectedRowKeys.toArray(); for (int i = 0; i < keys.length; i++) { TableRow tableRow = (TableRow) rowKeysToTableRows.get(keys[i]); - if(tableRow != null) + if (tableRow != null) tableRow.setSelected(false); } - // still ensure all selects are removed from + // still ensure all selects are removed from selectedRowKeys.clear(); } + + public void add(Widget w) { + // TODO Auto-generated method stub + + } + + public void clear() { + // TODO Auto-generated method stub + + } + + public Iterator iterator() { + // TODO Auto-generated method stub + return null; + } + + public boolean remove(Widget w) { + // TODO Auto-generated method stub + return false; + } }