Browse Source

Updated Root to use hierarchy change event for content and windows

tags/7.0.0.alpha2
Artur Signell 12 years ago
parent
commit
1cc4ad371d

+ 15
- 26
src/com/vaadin/terminal/gwt/client/ComponentLocator.java View File

@@ -5,6 +5,7 @@ package com.vaadin.terminal.gwt.client;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
@@ -17,6 +18,7 @@ import com.vaadin.terminal.gwt.client.ui.VMeasuringOrderedLayout;
import com.vaadin.terminal.gwt.client.ui.VTabsheetPanel;
import com.vaadin.terminal.gwt.client.ui.VView;
import com.vaadin.terminal.gwt.client.ui.VWindow;
import com.vaadin.terminal.gwt.client.ui.WindowConnector;

/**
* ComponentLocator provides methods for generating a String locator for a given
@@ -368,18 +370,14 @@ public class ComponentLocator {
return null;
}

String pid = ConnectorMap.get(client).getConnectorId(w.getElement());
if (isStaticPid(pid)) {
return pid;
}

if (w instanceof VView) {
return "";
} else if (w instanceof VWindow) {
VWindow win = (VWindow) w;
ArrayList<VWindow> subWindowList = client.getView().getWidget()
.getSubWindowList();
int indexOfSubWindow = subWindowList.indexOf(win);
Connector windowConnector = ConnectorMap.get(client)
.getConnector(w);
List<WindowConnector> subWindowList = client.getView()
.getSubWindows();
int indexOfSubWindow = subWindowList.indexOf(windowConnector);
return PARENTCHILD_SEPARATOR + "VWindow[" + indexOfSubWindow + "]";
} else if (w instanceof RootPanel) {
return ROOT_ID;
@@ -543,8 +541,14 @@ public class ComponentLocator {
* compatibility
*/
if (widgetClassName.equals("VWindow")) {
iterator = client.getView().getWidget().getSubWindowList()
.iterator();
List<WindowConnector> windows = client.getView()
.getSubWindows();
List<VWindow> windowWidgets = new ArrayList<VWindow>(
windows.size());
for (WindowConnector wc : windows) {
windowWidgets.add(wc.getWidget());
}
iterator = windowWidgets.iterator();
} else if (widgetClassName.equals("VContextMenu")) {
return client.getContextMenu();
} else {
@@ -603,19 +607,4 @@ public class ComponentLocator {
return null;
}

/**
* Checks if the given pid is a static pid.
*
* @param pid
* The pid to check
* @return true if the pid is a static pid, false otherwise
*/
private boolean isStaticPid(String pid) {
if (pid == null) {
return false;
}

return pid.startsWith("PID_S");
}

}

+ 3
- 4
src/com/vaadin/terminal/gwt/client/VDebugConsole.java View File

@@ -56,7 +56,7 @@ import com.vaadin.terminal.gwt.client.ui.RootConnector;
import com.vaadin.terminal.gwt.client.ui.VLazyExecutor;
import com.vaadin.terminal.gwt.client.ui.VNotification;
import com.vaadin.terminal.gwt.client.ui.VOverlay;
import com.vaadin.terminal.gwt.client.ui.VWindow;
import com.vaadin.terminal.gwt.client.ui.WindowConnector;

/**
* A helper console for client side development. The debug console can also be
@@ -858,9 +858,8 @@ public class VDebugConsole extends VOverlay implements Console {
.getConnectors();
log("Sub windows:");
Set<ComponentConnector> subWindowHierarchyConnectors = new HashSet<ComponentConnector>();
for (VWindow w : root.getWidget().getSubWindowList()) {
SimpleTree windowHierachy = dumpConnectorHierarchy(
connectorMap.getConnector(w), "",
for (WindowConnector wc : root.getSubWindows()) {
SimpleTree windowHierachy = dumpConnectorHierarchy(wc, "",
subWindowHierarchyConnectors);
if (panel.isAttached()) {
windowHierachy.open(true);

+ 73
- 54
src/com/vaadin/terminal/gwt/client/ui/RootConnector.java View File

@@ -3,8 +3,9 @@
*/
package com.vaadin.terminal.gwt.client.ui;

import java.util.HashSet;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.Scheduler;
@@ -22,6 +23,8 @@ import com.google.gwt.user.client.ui.Widget;
import com.vaadin.terminal.gwt.client.ApplicationConnection;
import com.vaadin.terminal.gwt.client.BrowserInfo;
import com.vaadin.terminal.gwt.client.ComponentConnector;
import com.vaadin.terminal.gwt.client.ComponentState;
import com.vaadin.terminal.gwt.client.Connector;
import com.vaadin.terminal.gwt.client.ConnectorHierarchyChangeEvent;
import com.vaadin.terminal.gwt.client.ConnectorMap;
import com.vaadin.terminal.gwt.client.Focusable;
@@ -41,6 +44,19 @@ import com.vaadin.ui.Root;
public class RootConnector extends AbstractComponentContainerConnector
implements Paintable {

public static class RootState extends ComponentState {
private Connector content;

public Connector getContent() {
return content;
}

public void setContent(Connector content) {
this.content = content;
}

}

public interface RootServerRPC extends ClickRPC, ServerRpc {

}
@@ -158,39 +174,8 @@ public class RootConnector extends AbstractComponentContainerConnector
return;
}

// Draw this application level window
UIDL childUidl = uidl.getChildUIDL(childIndex);
final ComponentConnector lo = client.getPaintable(childUidl);

boolean layoutChanged = getWidget().layout != lo;
if (getWidget().layout != null) {
if (layoutChanged) {
// remove old
if (childStateChangeHandlerRegistration != null) {
childStateChangeHandlerRegistration.removeHandler();
childStateChangeHandlerRegistration = null;
}
// add new
getWidget().setWidget(lo.getWidget());
getWidget().layout = lo;
}
} else {
getWidget().setWidget(lo.getWidget());
getWidget().layout = lo;
if (layoutChanged) {
childStateChangeHandlerRegistration = lo
.addStateChangeHandler(childStateChangeHandler);
// Must handle new child here as state change events are already
// fired
onChildSizeChange();
}
}

// Save currently open subwindows to track which will need to be closed
final HashSet<VWindow> removedSubWindows = new HashSet<VWindow>(
getWidget().subWindows);

// Handle other UIDL children
UIDL childUidl;
while ((childUidl = uidl.getChildUIDL(++childIndex)) != null) {
String tag = childUidl.getTag().intern();
if (tag == "actions") {
@@ -208,28 +193,9 @@ public class RootConnector extends AbstractComponentContainerConnector
final UIDL notification = (UIDL) it.next();
VNotification.showNotification(client, notification);
}
} else {
// subwindows
final WindowConnector w = (WindowConnector) client
.getPaintable(childUidl);
VWindow windowWidget = w.getWidget();
if (getWidget().subWindows.contains(windowWidget)) {
removedSubWindows.remove(windowWidget);
} else {
getWidget().subWindows.add(windowWidget);
}
w.updateFromUIDL(childUidl, client);
}
}

// Close old windows which where not in UIDL anymore
for (final Iterator<VWindow> rem = removedSubWindows.iterator(); rem
.hasNext();) {
final VWindow w = rem.next();
getWidget().subWindows.remove(w);
w.hide();
}

if (uidl.hasAttribute("focused")) {
// set focused component when render phase is finished
Scheduler.get().scheduleDeferred(new Command() {
@@ -356,7 +322,7 @@ public class RootConnector extends AbstractComponentContainerConnector
}

protected void onChildSizeChange() {
ComponentConnector child = getWidget().layout;
ComponentConnector child = (ComponentConnector) getState().getContent();
Style childStyle = child.getWidget().getElement().getStyle();
/*
* Must set absolute position if the child has relative height and
@@ -382,17 +348,70 @@ public class RootConnector extends AbstractComponentContainerConnector
*/
@Deprecated
public boolean hasSubWindow(WindowConnector wc) {
return getWidget().subWindows.contains(wc.getWidget());
return getChildren().contains(wc);
}

/**
* Return an iterator for current subwindows. This method is meant for
* testing purposes only.
*
* @return
*/
public List<WindowConnector> getSubWindows() {
ArrayList<WindowConnector> windows = new ArrayList<WindowConnector>();
for (ComponentConnector child : getChildren()) {
if (child instanceof WindowConnector) {
windows.add((WindowConnector) child);
}
}
return windows;
}

@Override
public RootState getState() {
return (RootState) super.getState();
}

@Override
public void onConnectorHierarchyChange(ConnectorHierarchyChangeEvent event) {
super.onConnectorHierarchyChange(event);

ComponentConnector oldChild = null;
ComponentConnector newChild = (ComponentConnector) getState()
.getContent();

for (ComponentConnector c : event.getOldChildren()) {
if (!(c instanceof WindowConnector)) {
oldChild = c;
break;
}
}

if (oldChild != newChild) {
if (childStateChangeHandlerRegistration != null) {
childStateChangeHandlerRegistration.removeHandler();
childStateChangeHandlerRegistration = null;
}
getWidget().setWidget(newChild.getWidget());
childStateChangeHandlerRegistration = newChild
.addStateChangeHandler(childStateChangeHandler);
// Must handle new child here as state change events are already
// fired
onChildSizeChange();
}

for (ComponentConnector c : getChildren()) {
if (c instanceof WindowConnector) {
WindowConnector wc = (WindowConnector) c;
wc.setWindowOrderAndPosition();
}
}

// Close removed sub windows
for (ComponentConnector c : event.getOldChildren()) {
if (c.getParent() != this && c instanceof WindowConnector) {
((WindowConnector) c).getWidget().hide();
}
}
}
}

+ 0
- 19
src/com/vaadin/terminal/gwt/client/ui/VView.java View File

@@ -5,7 +5,6 @@
package com.vaadin.terminal.gwt.client.ui;

import java.util.ArrayList;
import java.util.LinkedHashSet;

import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
@@ -44,10 +43,6 @@ public class VView extends SimplePanel implements ResizeHandler,

String theme;

ComponentConnector layout;

final LinkedHashSet<VWindow> subWindows = new LinkedHashSet<VWindow>();

String id;

ShortcutActionHandler actionHandler;
@@ -329,20 +324,6 @@ public class VView extends SimplePanel implements ResizeHandler,
}
}-*/;

/**
* Return an iterator for current subwindows. This method is meant for
* testing purposes only.
*
* @return
*/
public ArrayList<VWindow> getSubWindowList() {
ArrayList<VWindow> windows = new ArrayList<VWindow>(subWindows.size());
for (VWindow widget : subWindows) {
windows.add(widget);
}
return windows;
}

public ShortcutActionHandler getShortcutActionHandler() {
return actionHandler;
}

+ 20
- 28
src/com/vaadin/ui/Root.java View File

@@ -27,10 +27,12 @@ import com.vaadin.event.MouseEvents.ClickListener;
import com.vaadin.terminal.PaintException;
import com.vaadin.terminal.PaintTarget;
import com.vaadin.terminal.Resource;
import com.vaadin.terminal.Vaadin6Component;
import com.vaadin.terminal.WrappedRequest;
import com.vaadin.terminal.WrappedRequest.BrowserDetails;
import com.vaadin.terminal.gwt.client.MouseEventDetails;
import com.vaadin.terminal.gwt.client.ui.RootConnector.RootServerRPC;
import com.vaadin.terminal.gwt.client.ui.RootConnector.RootState;
import com.vaadin.terminal.gwt.client.ui.VNotification;
import com.vaadin.terminal.gwt.client.ui.VView;
import com.vaadin.tools.ReflectTools;
@@ -74,7 +76,7 @@ import com.vaadin.ui.Window.CloseListener;
* @since 7.0
*/
public abstract class Root extends AbstractComponentContainer implements
Action.Container, Action.Notifier {
Action.Container, Action.Notifier, Vaadin6Component {

/**
* Listener that gets notified when the size of the browser window
@@ -343,11 +345,6 @@ public abstract class Root extends AbstractComponentContainer implements
*/
public static final int BORDER_DEFAULT = 2;

/**
* The container in which the component hierarchy of the root starts.
*/
private ComponentContainer content;

/**
* The application to which this root belongs
*/
@@ -422,8 +419,7 @@ public abstract class Root extends AbstractComponentContainer implements
* {@link VerticalLayout} with margins enabled as its content.
*/
public Root() {
registerRpc(rpc);
setSizeFull();
this((ComponentContainer) null);
}

/**
@@ -435,7 +431,8 @@ public abstract class Root extends AbstractComponentContainer implements
* @see #setContent(ComponentContainer)
*/
public Root(ComponentContainer content) {
this();
registerRpc(rpc);
setSizeFull();
setContent(content);
}

@@ -450,7 +447,7 @@ public abstract class Root extends AbstractComponentContainer implements
* @see #setCaption(String)
*/
public Root(String caption) {
this();
this((ComponentContainer) null);
setCaption(caption);
}

@@ -471,6 +468,11 @@ public abstract class Root extends AbstractComponentContainer implements
setCaption(caption);
}

@Override
public RootState getState() {
return (RootState) super.getState();
}

/**
* Overridden to return a value instead of referring to the parent.
*
@@ -505,17 +507,6 @@ public abstract class Root extends AbstractComponentContainer implements
}
}

ComponentContainer content = getContent();
if (content != null) {
content.paint(target);
}

// Paint subwindows
for (final Iterator<Window> i = windows.iterator(); i.hasNext();) {
final Window w = i.next();
w.paint(target);
}

// Paint notifications
if (notifications != null) {
target.startTag("notifications");
@@ -1035,10 +1026,7 @@ public abstract class Root extends AbstractComponentContainer implements
* @see #createDefaultLayout()
*/
public ComponentContainer getContent() {
if (content == null) {
setContent(createDefaultLayout());
}
return content;
return (ComponentContainer) getState().getContent();
}

/**
@@ -1066,10 +1054,14 @@ public abstract class Root extends AbstractComponentContainer implements
* @see #createDefaultLayout()
*/
public void setContent(ComponentContainer content) {
if (this.content != null) {
super.removeComponent(this.content);
if (content == null) {
content = createDefaultLayout();
}

if (getState().getContent() != null) {
super.removeComponent((Component) getState().getContent());
}
this.content = content;
getState().setContent(content);
if (content != null) {
super.addComponent(content);
}

Loading…
Cancel
Save