Browse Source

(#9949) Flush focused connector on historyChange

Change-Id: Ia0f41220a038a83fcbcbbe9feebe066cbc626e27
tags/7.0.0.beta11
Mikael Grankvist 11 years ago
parent
commit
8a264ec405

+ 26
- 0
client/src/com/vaadin/client/ApplicationConnection.java View File

GwtEvent.Type<H> type, H handler) { GwtEvent.Type<H> type, H handler) {
return eventBus.addHandler(type, handler); return eventBus.addHandler(type, handler);
} }

/**
* Calls {@link ComponentConnector#flush()} on the active connector. Does
* nothing if there is no active (focused) connector.
*/
public void flushActiveConnector() {
ComponentConnector activeConnector = getActiveConnector();
if (activeConnector == null) {
return;
}
activeConnector.flush();
}

/**
* Gets the active connector for focused element in browser.
*
* @return Connector for focused element or null.
*/
private ComponentConnector getActiveConnector() {
Element focusedElement = Util.getFocusedElement();
if (focusedElement == null) {
return null;
}
return Util.getConnectorForElement(this, getUIConnector().getWidget(),
focusedElement);
}
} }

+ 12
- 0
client/src/com/vaadin/client/ComponentConnector.java View File

*/ */
public TooltipInfo getTooltipInfo(Element element); public TooltipInfo getTooltipInfo(Element element);


/**
* Called for the active (focused) connector when a situation occurs that
* the focused connector might have buffered changes which need to be
* processed before other activity takes place.
* <p>
* This is currently called when the user changes the fragment using the
* back/forward button in the browser and allows the focused field to submit
* its value to the server before the fragment change event takes place.
* </p>
*/
public void flush();

} }

+ 14
- 3
client/src/com/vaadin/client/Util.java View File

} }


/** /**
* Gets the currently focused element for Internet Explorer.
* Gets the currently focused element.
* *
* @return The currently focused element
* @return The active element or null if no active element could be found.
*/ */
public native static Element getIEFocusedElement()
public native static Element getFocusedElement()
/*-{ /*-{
if ($wnd.document.activeElement) { if ($wnd.document.activeElement) {
return $wnd.document.activeElement; return $wnd.document.activeElement;
return null; return null;
}-*/ }-*/
; ;
/**
* Gets the currently focused element for Internet Explorer.
*
* @return The currently focused element
* @deprecated Use #getFocusedElement instead
*/
@Deprecated
public static Element getIEFocusedElement() {
return getFocusedElement();
}


/** /**
* Kind of stronger version of isAttached(). In addition to std isAttached, * Kind of stronger version of isAttached(). In addition to std isAttached,

+ 9
- 0
client/src/com/vaadin/client/ui/AbstractComponentConnector.java View File

protected String getIcon() { protected String getIcon() {
return getResourceUrl(ComponentConstants.ICON_RESOURCE); return getResourceUrl(ComponentConstants.ICON_RESOURCE);
} }

/*
* (non-Javadoc)
*
* @see com.vaadin.client.ComponentConnector#flush()
*/
public void flush() {
// No generic implementation. Override if needed
}
} }

+ 2
- 0
client/src/com/vaadin/client/ui/VUI.java View File

String newFragment = event.getValue(); String newFragment = event.getValue();


// Send the location to the server if the fragment has changed // Send the location to the server if the fragment has changed
// and flush active connectors in UI.
if (!newFragment.equals(currentFragment) && connection != null) { if (!newFragment.equals(currentFragment) && connection != null) {
currentFragment = newFragment; currentFragment = newFragment;
connection.flushActiveConnector();
connection.updateVariable(id, UIConstants.LOCATION_VARIABLE, connection.updateVariable(id, UIConstants.LOCATION_VARIABLE,
Window.Location.getHref(), true); Window.Location.getHref(), true);
} }

+ 6
- 1
client/src/com/vaadin/client/ui/richtextarea/RichTextAreaConnector.java View File



@Override @Override
public void onBeforeShortcutAction(Event e) { public void onBeforeShortcutAction(Event e) {
getWidget().synchronizeContentToServer();
flush();
} }


@Override @Override
public VRichTextArea getWidget() { public VRichTextArea getWidget() {
return (VRichTextArea) super.getWidget(); return (VRichTextArea) super.getWidget();
}

@Override
public void flush() {
getWidget().synchronizeContentToServer();
}; };


} }

+ 5
- 0
client/src/com/vaadin/client/ui/textfield/TextFieldConnector.java View File



@Override @Override
public void onBeforeShortcutAction(Event e) { public void onBeforeShortcutAction(Event e) {
flush();
}

@Override
public void flush() {
getWidget().valueChange(false); getWidget().valueChange(false);
} }



+ 117
- 0
uitest/src/com/vaadin/tests/components/uitest/BackButtonTest.java View File

package com.vaadin.tests.components.uitest;

import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.server.Page.UriFragmentChangedEvent;
import com.vaadin.server.Page.UriFragmentChangedListener;
import com.vaadin.server.VaadinRequest;
import com.vaadin.tests.components.AbstractTestUI;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Label;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;

public class BackButtonTest extends AbstractTestUI {

private VerticalLayout layout;

private String value = "Hello";
private Page1 p1;
private Page2 p2;

@Override
public void setup(VaadinRequest request) {
getPage().setUriFragment("page1");

layout = new VerticalLayout();
addComponent(layout);

p1 = new Page1();
addComponent(p1);

p2 = new Page2();
getPage().addUriFragmentChangedListener(
new UriFragmentChangedListener() {

@Override
public void uriFragmentChanged(UriFragmentChangedEvent event) {
String f = event.getUriFragment();
if ("page2".equals(f)) {
showPage2();
}

if ("page1".equals(f)) {
showPage1();
}
}
});
}

class Page1 extends VerticalLayout {
Label l = new Label();

public Page1() {
setSizeFull();
l.setCaption("Data from Page 1 : " + value);
addComponent(l);

Button b = new Button("Go to Page 2", new Button.ClickListener() {
public void buttonClick(ClickEvent event) {
l.setCaption("Data from Page 1 : " + value);
getPage().setUriFragment("page2");
}
});
addComponent(b);
}
}

private void showPage2() {
removeComponent(p1);
p2.f.setValue("");
addComponent(p2);
}

private void showPage1() {
removeComponent(p2);
addComponent(p1);
}

class Page2 extends VerticalLayout {
private final TextField f = new TextField();

public Page2() {
setSizeFull();

addComponent(f);
f.addValueChangeListener(new ValueChangeListener() {
public void valueChange(ValueChangeEvent event) {
value = f.getValue();
p1.l.setCaption("Data from Page 2 : " + value);
}
});

Button b = new Button("Go Back", new Button.ClickListener() {
public void buttonClick(ClickEvent event) {
getPage().setUriFragment("page1");
}
});
addComponent(b);
addComponent(new Label(
"Go back with the back button without creating a blur event on the text field. Text should transfer to page1 label."));
}

}

@Override
protected Integer getTicketNumber() {
return 9949;
}

@Override
protected String getTestDescription() {
// TODO Auto-generated method stub
return null;
}

}

Loading…
Cancel
Save