Browse Source

Use shared state in ComboBox (#19229)

This change uses shared state for the read-only flag, text
input allowed flag and input prompt.

Change-Id: I3bdc6843288c5309311461a3d036293d79004e22
feature/databinding
Henri Sara 8 years ago
parent
commit
b214cb8ca3

+ 24
- 21
client/src/com/vaadin/client/ui/combobox/ComboBoxConnector.java View File

@@ -23,13 +23,14 @@ import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.vaadin.client.ApplicationConnection;
import com.vaadin.client.Paintable;
import com.vaadin.client.Profiler;
import com.vaadin.client.UIDL;
import com.vaadin.client.communication.StateChangeEvent;
import com.vaadin.client.ui.AbstractFieldConnector;
import com.vaadin.client.ui.SimpleManagedLayout;
import com.vaadin.client.ui.VFilterSelect;
import com.vaadin.client.ui.VFilterSelect.FilterSelectSuggestion;
import com.vaadin.shared.ui.Connect;
import com.vaadin.shared.ui.combobox.ComboBoxConstants;
import com.vaadin.shared.ui.combobox.ComboBoxState;
import com.vaadin.shared.ui.combobox.FilteringMode;
import com.vaadin.ui.ComboBox;
@@ -42,6 +43,28 @@ public class ComboBoxConnector extends AbstractFieldConnector implements
// update textbox text by a changed item caption.
private boolean oldSuggestionTextMatchTheOldSelection;

@Override
public void onStateChanged(StateChangeEvent stateChangeEvent) {
super.onStateChanged(stateChangeEvent);

Profiler.enter("ComboBoxConnector.onStateChanged update content");

getWidget().readonly = isReadOnly();
getWidget().updateReadOnly();

getWidget().immediate = getState().immediate;

getWidget().setTextInputEnabled(getState().textInputAllowed);

if (getState().inputPrompt != null) {
getWidget().inputPrompt = getState().inputPrompt;
} else {
getWidget().inputPrompt = "";
}

Profiler.leave("ComboBoxConnector.onStateChanged update content");
}

/*
* (non-Javadoc)
*
@@ -54,20 +77,10 @@ public class ComboBoxConnector extends AbstractFieldConnector implements
getWidget().client = client;
getWidget().paintableId = uidl.getId();

getWidget().readonly = isReadOnly();
getWidget().updateReadOnly();

if (!isRealUpdate(uidl)) {
return;
}

// Inverse logic here to make the default case (text input enabled)
// work without additional UIDL messages
boolean noTextInput = uidl
.hasAttribute(ComboBoxConstants.ATTR_NO_TEXT_INPUT)
&& uidl.getBooleanAttribute(ComboBoxConstants.ATTR_NO_TEXT_INPUT);
getWidget().setTextInputEnabled(!noTextInput);

// not a FocusWidget -> needs own tabindex handling
getWidget().tb.setTabIndex(getState().tabIndex);

@@ -76,8 +89,6 @@ public class ComboBoxConnector extends AbstractFieldConnector implements
.getStringAttribute("filteringmode"));
}

getWidget().immediate = getState().immediate;

getWidget().nullSelectionAllowed = uidl.hasAttribute("nullselect");

getWidget().nullSelectItem = uidl.hasAttribute("nullselectitem")
@@ -89,14 +100,6 @@ public class ComboBoxConnector extends AbstractFieldConnector implements
getWidget().pageLength = uidl.getIntAttribute("pagelength");
}

if (uidl.hasAttribute(ComboBoxConstants.ATTR_INPUTPROMPT)) {
// input prompt changed from server
getWidget().inputPrompt = uidl
.getStringAttribute(ComboBoxConstants.ATTR_INPUTPROMPT);
} else {
getWidget().inputPrompt = "";
}

getWidget().suggestionPopup.updateStyleNames(uidl, getState());

getWidget().allowNewItem = uidl.hasAttribute("allownewitem");

+ 9
- 25
server/src/com/vaadin/ui/ComboBox.java View File

@@ -34,7 +34,6 @@ import com.vaadin.event.FieldEvents.FocusListener;
import com.vaadin.server.PaintException;
import com.vaadin.server.PaintTarget;
import com.vaadin.server.Resource;
import com.vaadin.shared.ui.combobox.ComboBoxConstants;
import com.vaadin.shared.ui.combobox.ComboBoxState;
import com.vaadin.shared.ui.combobox.FilteringMode;

@@ -75,8 +74,6 @@ public class ComboBox extends AbstractSelect implements
public String getStyle(ComboBox source, Object itemId);
}

private String inputPrompt = null;

/**
* Holds value of property pageLength. 0 disables paging.
*/
@@ -121,13 +118,6 @@ public class ComboBox extends AbstractSelect implements
*/
private boolean scrollToSelectedItem = true;

/**
* If text input is not allowed, the ComboBox behaves like a pretty
* NativeSelect - the user can not enter any text and clicking the text
* field opens the drop down with options
*/
private boolean textInputAllowed = true;

private ItemStyleGenerator itemStyleGenerator = null;

public ComboBox() {
@@ -164,7 +154,7 @@ public class ComboBox extends AbstractSelect implements
* @return the current input prompt, or null if not enabled
*/
public String getInputPrompt() {
return inputPrompt;
return getState(false).inputPrompt;
}

/**
@@ -175,8 +165,7 @@ public class ComboBox extends AbstractSelect implements
* the desired input prompt, or null to disable
*/
public void setInputPrompt(String inputPrompt) {
this.inputPrompt = inputPrompt;
markAsDirty();
getState().inputPrompt = inputPrompt;
}

private boolean isFilteringNeeded() {
@@ -188,15 +177,6 @@ public class ComboBox extends AbstractSelect implements
public void paintContent(PaintTarget target) throws PaintException {
isPainting = true;
try {
if (inputPrompt != null) {
target.addAttribute(ComboBoxConstants.ATTR_INPUTPROMPT,
inputPrompt);
}

if (!textInputAllowed) {
target.addAttribute(ComboBoxConstants.ATTR_NO_TEXT_INPUT, true);
}

// clear caption change listeners
getCaptionChangeListener().clear();

@@ -368,8 +348,7 @@ public class ComboBox extends AbstractSelect implements
* selection
*/
public void setTextInputAllowed(boolean textInputAllowed) {
this.textInputAllowed = textInputAllowed;
markAsDirty();
getState().textInputAllowed = textInputAllowed;
}

/**
@@ -381,7 +360,7 @@ public class ComboBox extends AbstractSelect implements
* @return
*/
public boolean isTextInputAllowed() {
return textInputAllowed;
return getState(false).textInputAllowed;
}

@Override
@@ -389,6 +368,11 @@ public class ComboBox extends AbstractSelect implements
return (ComboBoxState) super.getState();
}

@Override
protected ComboBoxState getState(boolean markAsDirty) {
return (ComboBoxState) super.getState(markAsDirty);
}

/**
* Returns the filtered options for the current page using a container
* filter.

+ 0
- 27
shared/src/com/vaadin/shared/ui/combobox/ComboBoxConstants.java View File

@@ -1,27 +0,0 @@
/*
* Copyright 2000-2014 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.vaadin.shared.ui.combobox;

import java.io.Serializable;

@Deprecated
public class ComboBoxConstants implements Serializable {
@Deprecated
public static final String ATTR_INPUTPROMPT = "prompt";
@Deprecated
public static final String ATTR_NO_TEXT_INPUT = "noInput";

}

+ 18
- 0
shared/src/com/vaadin/shared/ui/combobox/ComboBoxState.java View File

@@ -26,4 +26,22 @@ public class ComboBoxState extends AbstractSelectState {
{
primaryStyleName = "v-filterselect";
}

/**
* If text input is not allowed, the ComboBox behaves like a pretty
* NativeSelect - the user can not enter any text and clicking the text
* field opens the drop down with options.
*
* @since
*/
public boolean textInputAllowed = true;

/**
* A textual prompt that is displayed when the select would otherwise be
* empty, to prompt the user for input.
*
* @since
*/
public String inputPrompt = null;

}

Loading…
Cancel
Save