Example usage for org.apache.wicket.extensions.ajax.markup.html.autocomplete AutoCompleteSettings setMaxHeightInPx

List of usage examples for org.apache.wicket.extensions.ajax.markup.html.autocomplete AutoCompleteSettings setMaxHeightInPx

Introduction

In this page you can find the example usage for org.apache.wicket.extensions.ajax.markup.html.autocomplete AutoCompleteSettings setMaxHeightInPx.

Prototype

public AutoCompleteSettings setMaxHeightInPx(final int maxHeightInPx) 

Source Link

Document

Sets the maximum height in pixels of the autocomplete list.

Usage

From source file:com.evolveum.midpoint.gui.api.component.autocomplete.AbstractAutoCompletePanel.java

License:Apache License

protected AutoCompleteSettings createAutoCompleteSettings() {
    AutoCompleteSettings autoCompleteSettings = new AutoCompleteSettings();
    autoCompleteSettings.setShowListOnEmptyInput(true);
    autoCompleteSettings.setShowListOnFocusGain(true);
    autoCompleteSettings.setMaxHeightInPx(200);
    autoCompleteSettings.setShowCompleteListOnFocusGain(true);
    return autoCompleteSettings;
}

From source file:com.servoy.j2db.server.headlessclient.dataui.WebDataLookupField.java

License:Open Source License

private void init() {

    add(new HeaderContributor(new IHeaderContributor() {
        private static final long serialVersionUID = 1L;

        public void renderHead(IHeaderResponse response) {
            response.renderCSSReference(
                    new CompressedResourceReference(WebDataLookupField.class, "servoy_lookupfield.css")); //$NON-NLS-1$
        }//w w w .ja va2  s  . c  o m
    }) {
        @Override
        public boolean isEnabled(Component component) {
            return !getScriptObject().isReadOnly() && getScriptObject().isEnabled();
        }
    });

    setOutputMarkupPlaceholderTag(true);

    AutoCompleteSettings behSettings = new AutoCompleteSettings();
    behSettings.setMaxHeightInPx(200);
    behSettings.setPreselect(true);
    behSettings.setShowCompleteListOnFocusGain(true);
    behSettings.setAdjustInputWidth(false);

    ClientProperties clp = (application.getApplicationType() != IApplication.HEADLESS_CLIENT
            ? ((WebClientInfo) Session.get().getClientInfo()).getProperties()
            : null); // in case of batch processors/jsp, we can't get browser info because UI is not given by web client components
    if (clp != null && (!clp.isBrowserInternetExplorer() || clp.getBrowserVersionMajor() >= 8)) {
        // smart positioning doesn't work on IE < 8 (probably because of unreliable clientWidth/clientHeight browser element js properties)
        behSettings.setUseSmartPositioning(true);
        behSettings.setUseHideShowCoveredIEFix(false); // don't know if the problem this setting is for can still be reproduced (I couldn't reproduce it)... this is true by default and makes fields in IE and Opera appear/dissapear if they would be covered by type-ahead popup
    } else {
        behSettings.setUseSmartPositioning(false);
        behSettings.setUseHideShowCoveredIEFix(true);
    }
    behSettings.setThrottleDelay(500);

    IAutoCompleteRenderer<Object> renderer = new IAutoCompleteRenderer<Object>() {
        protected String getTextValue(Object object) {
            String str = ""; //$NON-NLS-1$
            if (object instanceof DisplayString) {
                str = object.toString();
            } else if (object != null && !(object instanceof String)) {
                IConverter con = getConverter(object.getClass());
                if (con != null) {
                    str = con.convertToString(object, getLocale());
                } else {
                    str = object.toString();
                }
            } else if (object != null) {
                str = object.toString();
            }
            if (str == null || str.trim().equals("")) //$NON-NLS-1$
                str = "&nbsp;"; //$NON-NLS-1$
            return str;
        }

        protected void renderChoice(Object object, Response response, String criteria) {
            if (IValueList.SEPARATOR_DESIGN_VALUE.equals(object))
                return;
            String renderedObject = getTextValue(object);
            // escape the markup if it is not html or not just an empty none breaking space (null or empty string object)
            if (!renderedObject.equals("&nbsp;") && !HtmlUtils.hasHtmlTag(renderedObject)) //$NON-NLS-1$
                renderedObject = HtmlUtils.escapeMarkup(renderedObject, true, false).toString();
            response.write(renderedObject);
        }

        /*
         * (non-Javadoc)
         *
         * @see org.apache.wicket.extensions.ajax.markup.html.autocomplete.IAutoCompleteRenderer#render(java.lang.Object, org.apache.wicket.Response,
         * java.lang.String)
         */
        public void render(Object object, Response response, String criteria) {
            String textValue = getTextValue(object);
            if (textValue == null) {
                throw new IllegalStateException(
                        "A call to textValue(Object) returned an illegal value: null for object: "
                                + object.toString());
            }
            textValue = textValue.replaceAll("\\\"", "&quot;");

            response.write("<li textvalue=\"" + textValue + "\"");
            response.write(">");
            renderChoice(object, response, criteria);
            response.write("</li>");
        }

        /*
         * (non-Javadoc)
         *
         * @see org.apache.wicket.extensions.ajax.markup.html.autocomplete.IAutoCompleteRenderer#renderHeader(org.apache.wicket.Response)
         */
        @SuppressWarnings("nls")
        public void renderHeader(Response response) {
            StringBuffer listStyle = new StringBuffer();
            listStyle.append("style=\"");

            String fFamily = "Tahoma, Arial, Helvetica, sans-serif";
            String bgColor = "#ffffff";
            String fgColor = "#000000";
            String fSize = TemplateGenerator.DEFAULT_FONT_SIZE + "px";
            String padding = "2px";
            String margin = "0px";
            if (getFont() != null) {
                Font f = getFont();
                if (f != null) {
                    if (f.getFamily() != null) {
                        fFamily = f.getFamily();
                        if (fFamily.contains(" "))
                            fFamily = "'" + fFamily + "'";
                    }
                    if (f.getName() != null) {
                        String fName = f.getName();
                        if (fName.contains(" "))
                            fName = "'" + fName + "'";
                        fFamily = fName + "," + fFamily;
                    }
                    if (f.isBold())
                        listStyle.append("font-weight:bold; ");
                    if (f.isItalic())
                        listStyle.append("font-style:italic; ");

                    fSize = Integer.toString(f.getSize()) + "px";
                }
            }

            if (getListColor() != null && getListColor().getAlpha() == 255) {
                // background shouldn't be transparent
                bgColor = getWebColor(getListColor().getRGB());
            }
            if (getForeground() != null) {
                fgColor = getWebColor(getForeground().getRGB());
            }
            Insets _padding = getPadding();
            if (getPadding() != null)
                padding = _padding.top + "px " + _padding.right + "px " + _padding.bottom + "px "
                        + _padding.left + "px";

            listStyle.append("font-family:" + fFamily + "; ");
            listStyle.append("background-color: " + bgColor + "; ");
            listStyle.append("color: " + fgColor + "; ");
            listStyle.append("font-size:" + fSize + "; ");
            listStyle.append("min-width:" + (getSize().width - 6) + "px; "); // extract padding and border
            listStyle.append("margin: " + margin + "; ");
            listStyle.append("padding: " + padding + "; ");
            listStyle.append(
                    "text-align:" + TemplateGenerator.getHorizontalAlignValue(getHorizontalAlignment()));
            listStyle.append("\"");

            response.write("<ul " + listStyle + ">");
        }

        /*
         * (non-Javadoc)
         *
         * @see org.apache.wicket.extensions.ajax.markup.html.autocomplete.IAutoCompleteRenderer#renderFooter(org.apache.wicket.Response)
         */
        public void renderFooter(Response response) {
            response.write("</ul>"); //$NON-NLS-1$
        }

        /**
         * Returns web color representation of int rgba color by
         * removing the alpha value
         *
         * @param color int representation of rgba color
         * @return web color of form #rrggbb
         */
        private String getWebColor(int color) {
            String webColor = Integer.toHexString(color);
            int startIdx = webColor.length() - 6;
            if (startIdx < 0)
                startIdx = 0;
            webColor = webColor.substring(startIdx);

            StringBuilder sb = new StringBuilder();
            sb.append('#');
            int nrMissing0 = 6 - webColor.length();
            for (int i = 0; i < nrMissing0; i++) {
                sb.append('0');
            }
            sb.append(webColor);

            return sb.toString();
        }
    };

    AutoCompleteBehavior<Object> beh = new AutoCompleteBehavior<Object>(renderer, behSettings) {
        private static final long serialVersionUID = 1L;

        /**
         * @see org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteBehavior#getChoices(java.lang.String)
         */
        @Override
        protected Iterator<Object> getChoices(String input) {
            String filteredInput = filterInput(input);
            if (changeListener != null)
                dlm.getValueList().removeListDataListener(changeListener);
            try {
                dlm.fill(parentState, getDataProviderID(), filteredInput, false);
                return dlm.iterator();
            } catch (Exception ex) {
                Debug.error(ex);
            } finally {
                if (changeListener != null)
                    dlm.getValueList().addListDataListener(changeListener);
            }
            return Collections.emptyList().iterator();
        }

        /**
         * filters the input in case of masked input (removes the mask)
         */
        private String filterInput(String input) {
            String displayFormat = WebDataLookupField.this.parsedFormat.getDisplayFormat();
            if (displayFormat != null && displayFormat.length() > 0
                    && input.length() == displayFormat.length()) {
                int index = firstBlankSpacePosition(input, displayFormat);
                if (index == -1)
                    return input;
                return input.substring(0, index);
            }
            return input;
        }

        /**
         * Computes the index of the first space char found in the input and is not ' ' nor '*' in the format
         * Example:
         * input  '12 - 3  -  '
         * format '## - ## - #'
         * returns 6
         * @param input
         * @param displayFormat
         * @return The index of the first space char found in the input and is not ' ' nor '*' in the format
         */
        private int firstBlankSpacePosition(String input, String displayFormat) {
            for (int i = 0; i < input.length(); i++) {
                if ((input.charAt(i) == ' ') && (displayFormat.charAt(i) != ' ')
                        && (displayFormat.charAt(i) != '*'))
                    return i;
            }
            return 0;
        }

        /**
         * @see org.apache.wicket.ajax.AbstractDefaultAjaxBehavior#getFailureScript()
         */
        @Override
        protected CharSequence getFailureScript() {
            return "onAjaxError();"; //$NON-NLS-1$
        }

        /**
         * @see org.apache.wicket.ajax.AbstractDefaultAjaxBehavior#getPreconditionScript()
         */
        @Override
        protected CharSequence getPreconditionScript() {
            return "onAjaxCall();" + super.getPreconditionScript(); //$NON-NLS-1$
        }

        // need to set this behavior to true (enterHidesWithNoSelection) because otherwise the onKeyDown events
        // or other events for the component with type ahead would be null in Firefox, and would not execute as
        // expected on the other browsers...
        @Override
        public void renderHead(IHeaderResponse response) {
            settings.setShowListOnEmptyInput(Boolean.TRUE.equals(UIUtils.getUIProperty(getScriptObject(),
                    application, IApplication.TYPE_AHEAD_SHOW_POPUP_WHEN_EMPTY, Boolean.TRUE)));
            settings.setShowListOnFocusGain(Boolean.TRUE.equals(UIUtils.getUIProperty(getScriptObject(),
                    application, IApplication.TYPE_AHEAD_SHOW_POPUP_ON_FOCUS_GAIN, Boolean.TRUE)));
            if (!getScriptObject().isReadOnly() && getScriptObject().isEnabled()) {
                super.renderHead(response);
                response.renderJavascript("Wicket.AutoCompleteSettings.enterHidesWithNoSelection = true;", //$NON-NLS-1$
                        "AutocompleteSettingsID"); //$NON-NLS-1$
            }
        }

        /**
         * @see org.apache.wicket.behavior.AbstractBehavior#isEnabled(org.apache.wicket.Component)
         */
        @Override
        public boolean isEnabled(Component component) {
            IFormUIInternal<?> formui = findParent(IFormUIInternal.class);
            if (formui != null && formui.isDesignMode()) {
                return false;
            }
            return super.isEnabled(component) && WebClientSession.get().useAjax();
        }
    };
    add(beh);
}

From source file:cz.zcu.kiv.eegdatabase.wui.ui.administration.AdminManagePersonPage.java

License:Apache License

private AutoCompleteSettings prepareAutoCompleteSettings() {

    AutoCompleteSettings settings = new AutoCompleteSettings();
    settings.setShowListOnEmptyInput(true);
    settings.setShowCompleteListOnFocusGain(true);
    settings.setUseHideShowCoveredIEFix(false);
    settings.setMaxHeightInPx(200);
    settings.setAdjustInputWidth(false);
    return settings;
}

From source file:cz.zcu.kiv.eegdatabase.wui.ui.experiments.forms.wizard.AddExperimentScenarioForm.java

License:Apache License

private AutoCompleteSettings prepareAutoCompleteSettings() {
    AutoCompleteSettings settings = new AutoCompleteSettings();
    settings.setShowListOnEmptyInput(true);
    settings.setShowCompleteListOnFocusGain(true);
    settings.setUseHideShowCoveredIEFix(false);
    settings.setMaxHeightInPx(200);
    settings.setAdjustInputWidth(false);
    return settings;
}

From source file:jp.xet.uncommons.wicket.gp.TimeField.java

License:Apache License

private static AutoCompleteSettings newDefaultAutoCompleteSettings() {
    AutoCompleteSettings settings = new AutoCompleteSettings();
    settings.setShowCompleteListOnFocusGain(true);
    settings.setShowListOnEmptyInput(true);
    settings.setShowListOnFocusGain(true);
    settings.setMaxHeightInPx(160); // CHECKSTYLE IGNORE THIS LINE
    settings.setThrottleDelay(0);/*from w  ww.  j  av a 2  s  .  c o m*/

    return settings;
}

From source file:org.geoserver.wps.web.ProcessSelectionPage.java

License:Open Source License

public ProcessSelectionPage(final WPSAccessRulePage wpsAccessRulePage, final ProcessGroupInfo pfi) {
    this.pfi = pfi;

    // prepare the process factory title
    Class<? extends ProcessFactory> factoryClass = pfi.getFactoryClass();
    ProcessFactory pf = GeoServerProcessors.getProcessFactory(factoryClass, false);
    if (pf == null) {
        throw new IllegalArgumentException("Failed to locate the process factory " + factoryClass);
    }/* www.ja v a  2s .c o  m*/
    this.title = pf.getTitle().toString(getLocale());

    Form form = new Form("form");
    add(form);

    GeoServerRoleService roleService = getSecurityManager().getActiveRoleService();
    try {
        for (GeoServerRole r : roleService.getRoles()) {
            availableRoles.add(r.getAuthority());
        }
    } catch (IOException e1) {
        LOGGER.log(Level.FINER, e1.getMessage(), e1);
    }

    final FilteredProcessesProvider provider = new FilteredProcessesProvider(pfi, getLocale());
    final AutoCompleteSettings settings = new AutoCompleteSettings();
    settings.setShowCompleteListOnFocusGain(false);
    settings.setShowListOnEmptyInput(true);
    settings.setShowListOnFocusGain(true);
    settings.setMaxHeightInPx(100);
    processSelector = new GeoServerTablePanel<FilteredProcess>("selectionTable", provider) {

        @Override
        protected Component getComponentForProperty(String id, final IModel itemModel,
                Property<FilteredProcess> property) {
            if (property.getName().equals("enabled")) {
                Fragment fragment = new Fragment(id, "enabledFragment", ProcessSelectionPage.this);
                CheckBox enabled = new CheckBox("enabled", property.getModel(itemModel));
                enabled.setOutputMarkupId(true);
                fragment.add(enabled);
                return fragment;
            } else if (property.getName().equals("title")) {
                return new Label(id, property.getModel(itemModel));
            } else if (property.getName().equals("description")) {
                return new Label(id, property.getModel(itemModel));
            } else if (property.getName().equals("roles")) {
                Fragment fragment = new Fragment(id, "rolesFragment", ProcessSelectionPage.this);
                TextArea<String> roles = new TextArea<String>("roles", property.getModel(itemModel)) {
                    public org.apache.wicket.util.convert.IConverter getConverter(java.lang.Class<?> type) {
                        return new RolesConverter(availableRoles);
                    };
                };
                StringBuilder selectedRoles = new StringBuilder();
                IAutoCompleteRenderer<String> roleRenderer = new RolesRenderer(selectedRoles);
                AutoCompleteBehavior<String> b = new RolesAutoCompleteBehavior(roleRenderer, settings,
                        selectedRoles, availableRoles);
                roles.setOutputMarkupId(true);
                roles.add(b);
                fragment.add(roles);
                return fragment;
            } else if (property.getName().equals("validated")) {
                final IModel<Boolean> hasValidatorsModel = property.getModel(itemModel);
                IModel<String> availableModel = new AbstractReadOnlyModel<String>() {

                    @Override
                    public String getObject() {
                        Boolean value = hasValidatorsModel.getObject();
                        if (Boolean.TRUE.equals(value)) {
                            return "*";
                        } else {
                            return "";
                        }
                    }

                };
                return new Label(id, availableModel);
            } else if (property.getName().equals("edit")) {
                Fragment fragment = new Fragment(id, "linkFragment", ProcessSelectionPage.this);
                // we use a submit link to avoid losing the other edits in the form
                Link link = new Link("link") {
                    @Override
                    public void onClick() {
                        FilteredProcess fp = (FilteredProcess) itemModel.getObject();
                        setResponsePage(new ProcessLimitsPage(ProcessSelectionPage.this, fp));
                    }
                };
                fragment.add(link);

                return fragment;
            }
            return null;
        }
    };
    processSelector.setFilterable(false);
    processSelector.setPageable(false);
    processSelector.setOutputMarkupId(true);
    form.add(processSelector);
    SubmitLink apply = new SubmitLink("apply") {
        @Override
        public void onSubmit() {
            // super.onSubmit();
            pfi.getFilteredProcesses().clear();
            for (FilteredProcess process : provider.getItems()) {
                if (!process.getRoles().isEmpty() || !process.getEnabled()
                        || !process.getValidators().isEmpty()) {
                    ProcessInfo pai = process.toProcessInfo();
                    pfi.getFilteredProcesses().add(pai);
                }
            }
            setResponsePage(wpsAccessRulePage);
        }
    };
    form.add(apply);
    Link cancel = new Link("cancel") {
        @Override
        public void onClick() {
            setResponsePage(wpsAccessRulePage);
        }
    };
    form.add(cancel);
}

From source file:org.geoserver.wps.web.WPSAccessRulePage.java

License:Open Source License

public WPSAccessRulePage() {
    wpsInfo = getGeoServer().getService(WPSInfo.class);
    Form form = new Form("form", new CompoundPropertyModel(wpsInfo));

    processFactories = cloneFactoryInfos(wpsInfo.getProcessGroups());
    ProcessFactoryInfoProvider provider = new ProcessFactoryInfoProvider(processFactories, getLocale());
    GeoServerRoleService roleService = getSecurityManager().getActiveRoleService();
    try {//from  w  ww. j  a  v a  2s .co m
        for (GeoServerRole r : roleService.getRoles()) {
            availableRoles.add(r.getAuthority());
        }
    } catch (IOException e1) {
        LOGGER.log(Level.FINER, e1.getMessage(), e1);
    }

    TextField<Integer> maxComplexInputSize = new TextField<Integer>("maxComplexInputSize", Integer.class);
    maxComplexInputSize.add(new MinimumValidator<Integer>(0));
    form.add(maxComplexInputSize);

    final AutoCompleteSettings settings = new AutoCompleteSettings();
    settings.setShowCompleteListOnFocusGain(false);
    settings.setShowListOnEmptyInput(true);
    settings.setShowListOnFocusGain(true);
    settings.setMaxHeightInPx(100);

    GeoServerTablePanel<ProcessGroupInfo> processFilterEditor = new GeoServerTablePanel<ProcessGroupInfo>(
            "processFilterTable", provider) {

        @Override
        protected Component getComponentForProperty(String id, final IModel itemModel,
                Property<ProcessGroupInfo> property) {

            if (property.getName().equals("enabled")) {
                Fragment fragment = new Fragment(id, "enabledFragment", WPSAccessRulePage.this);
                CheckBox enabled = new CheckBox("enabled", property.getModel(itemModel));
                enabled.setOutputMarkupId(true);
                fragment.add(enabled);
                return fragment;
            } else if (property.getName().equals("prefix")) {
                return new Label(id, property.getModel(itemModel));
            } else if (property.getName().equals("title")) {
                return new Label(id, property.getModel(itemModel));
            } else if (property.getName().equals("summary")) {
                return new Label(id, property.getModel(itemModel));
            } else if (property.getName().equals("roles")) {
                Fragment fragment = new Fragment(id, "rolesFragment", WPSAccessRulePage.this);
                TextArea<String> roles = new TextArea<String>("roles", property.getModel(itemModel)) {
                    public org.apache.wicket.util.convert.IConverter getConverter(java.lang.Class<?> type) {
                        return new RolesConverter(availableRoles);
                    };
                };
                StringBuilder selectedRoles = new StringBuilder();
                IAutoCompleteRenderer<String> roleRenderer = new RolesRenderer(selectedRoles);
                AutoCompleteBehavior<String> b = new RolesAutoCompleteBehavior(roleRenderer, settings,
                        selectedRoles, availableRoles);
                roles.setOutputMarkupId(true);
                roles.add(b);
                fragment.add(roles);
                return fragment;
            } else if (property.getName().equals("edit")) {
                Fragment fragment = new Fragment(id, "linkFragment", WPSAccessRulePage.this);
                // we use a submit link to avoid losing the other edits in the form
                Link link = new Link("link") {
                    @Override
                    public void onClick() {
                        ProcessGroupInfo pfi = (ProcessGroupInfo) itemModel.getObject();
                        setResponsePage(new ProcessSelectionPage(WPSAccessRulePage.this, pfi));
                    }
                };
                fragment.add(link);

                return fragment;
            }

            return null;
        }
    };
    processFilterEditor.setFilterable(false);
    processFilterEditor.setPageable(false);
    processFilterEditor.setOutputMarkupId(true);
    form.add(processFilterEditor);

    form.add(new AjaxLink("processAccessModeHelp") {
        @Override
        public void onClick(AjaxRequestTarget target) {
            dialog.showInfo(target, new StringResourceModel("processAccessModeHelp.title", getPage(), null),
                    new StringResourceModel("processAccessModeHelp.message", getPage(), null));
        }
    });
    catalogModeChoice = new RadioChoice("processAccessMode",
            new PropertyModel<CatalogMode>(wpsInfo, "catalogMode"), CATALOG_MODES, new CatalogModeRenderer());
    catalogModeChoice.setSuffix(" ");
    form.add(catalogModeChoice);

    SubmitLink submit = new SubmitLink("submit", new StringResourceModel("save", (Component) null, null)) {
        @Override
        public void onSubmit() {
            try {
                // overwrite the process factories that we did clone to achieve isolation
                List<ProcessGroupInfo> factories = wpsInfo.getProcessGroups();
                factories.clear();
                factories.addAll(processFactories);
                getGeoServer().save(wpsInfo);
                doReturn();
            } catch (Exception e) {
                error(e);
            }
        }
    };
    form.add(submit);

    Button cancel = new Button("cancel", new StringResourceModel("cancel", (Component) null, null)) {
        public void onSubmit() {
            doReturn();
        }
    };
    form.add(cancel);

    add(form);

}

From source file:org.hippoecm.frontend.plugins.console.menu.node.NodeDialog.java

License:Apache License

public NodeDialog(IModelReference<Node> modelReference) {
    this.modelReference = modelReference;
    final IModel<Node> nodeModel = modelReference.getModel();
    setModel(nodeModel);/*ww w. j a  va2s  .  c  om*/

    getParent().add(CssClass.append("node-dialog"));

    // list defined child node names and types for automatic completion
    final Node node = nodeModel.getObject();
    try {
        NodeType pnt = node.getPrimaryNodeType();
        for (NodeDefinition nd : pnt.getChildNodeDefinitions()) {
            if (!nd.isProtected()) {
                for (NodeType nt : nd.getRequiredPrimaryTypes()) {
                    if (!nt.isAbstract()) {
                        addNodeType(nd, nt);
                    }
                    for (NodeType subnt : getDescendantNodeTypes(nt)) {
                        addNodeType(nd, subnt);
                    }
                }
            }
        }
        for (NodeType nt : node.getMixinNodeTypes()) {
            for (NodeDefinition nd : nt.getChildNodeDefinitions()) {
                if (!nd.isProtected()) {
                    for (NodeType cnt : nd.getRequiredPrimaryTypes()) {
                        if (!cnt.isAbstract()) {
                            addNodeType(nd, cnt);
                        }
                        for (NodeType subnt : getDescendantNodeTypes(cnt)) {
                            addNodeType(nd, subnt);
                        }
                    }
                }
            }
        }
    } catch (RepositoryException e) {
        log.warn("Unable to populate autocomplete list for child node names", e);
    }

    AutoCompleteSettings settings = new AutoCompleteSettings();
    settings.setAdjustInputWidth(false);
    settings.setUseSmartPositioning(true);
    settings.setShowCompleteListOnFocusGain(true);
    settings.setShowListOnEmptyInput(true);
    // Setting a max height will trigger a correct recalculation of the height when the list of items is filtered
    settings.setMaxHeightInPx(400);

    final Model<String> typeModel = new Model<String>() {
        @Override
        public String getObject() {
            if (name != null && namesToTypes.containsKey(name)) {
                Collection<String> types = namesToTypes.get(name);
                if (types.size() == 1) {
                    type = types.iterator().next();
                }
            } else if (namesToTypes.size() == 1) {
                Collection<String> types = namesToTypes.values().iterator().next();
                if (types.size() == 1) {
                    type = types.iterator().next();
                }
            }
            return type;
        }

        @Override
        public void setObject(String s) {
            type = s;
        }
    };
    typeField = new AutoCompleteTextFieldWidget<String>("type", typeModel, settings) {
        @Override
        protected Iterator<String> getChoices(final String input) {
            Collection<String> result = new TreeSet<>();
            if (!Strings.isEmpty(name)) {
                if (namesToTypes.get(name) != null) {
                    result.addAll(namesToTypes.get(name));
                }
                if (namesToTypes.get("*") != null) {
                    result.addAll(namesToTypes.get("*"));
                }
            } else {
                namesToTypes.values().forEach(result::addAll);
            }
            Iterator<String> resultIter = result.iterator();
            while (resultIter.hasNext()) {
                if (!resultIter.next().contains(input)) {
                    resultIter.remove();
                }
            }
            return result.iterator();
        }

        @Override
        protected void onUpdate(final AjaxRequestTarget target) {
            if (isVisibleInHierarchy()) {
                target.add(nameField);
            }
        }
    };
    typeField.setRequired(true);
    add(typeField);

    final Model<String> nameModel = new Model<String>() {
        @Override
        public String getObject() {
            if (type != null && typesToNames.containsKey(type)) {
                if (name == null) {
                    Collection<String> names = typesToNames.get(type);
                    if (names.size() == 1) {
                        String _name = names.iterator().next();
                        if (!_name.equals("*")) {
                            name = _name;
                        }
                    }
                }
            } else if (typesToNames.size() == 1) {
                Collection<String> names = typesToNames.values().iterator().next();
                if (names.size() == 1) {
                    String _name = names.iterator().next();
                    if (!_name.equals("*")) {
                        name = _name;
                    }
                }
            }
            return name;
        }

        @Override
        public void setObject(String s) {
            name = s;
        }
    };
    nameField = new AutoCompleteTextFieldWidget<String>("name", nameModel, settings) {
        @Override
        protected Iterator<String> getChoices(String input) {
            Collection<String> result = new TreeSet<>();
            if (type != null && !type.isEmpty()) {
                if (typesToNames.get(type) != null) {
                    result.addAll(typesToNames.get(type));
                }
            } else {
                for (String nodeName : namesToTypes.keySet()) {
                    if (!nodeName.equals("*") && nodeName.contains(input)) {
                        result.add(nodeName);
                    }
                }
            }
            return result.iterator();
        }

        @Override
        protected void onUpdate(final AjaxRequestTarget target) {
            if (isVisibleInHierarchy()) {
                target.add(typeField);
            }
        }
    };
    nameField.setRequired(true);

    add(setFocus(nameField));
}

From source file:org.hippoecm.frontend.plugins.console.menu.property.PropertyDialog.java

License:Apache License

public PropertyDialog(IModelReference<Node> modelReference) {
    this.modelReference = modelReference;
    final IModel<Node> model = modelReference.getModel();

    getParent().add(CssClass.append("property-dialog"));

    // list defined properties for automatic completion
    choiceModel = new LoadableDetachableModel<Map<String, List<PropertyDefinition>>>() {

        protected Map<String, List<PropertyDefinition>> load() {
            Map<String, List<PropertyDefinition>> choices = new HashMap<>();
            Node node = model.getObject();
            try {
                NodeType pnt = node.getPrimaryNodeType();
                for (PropertyDefinition pd : pnt.getPropertyDefinitions()) {
                    List<PropertyDefinition> list = choices.get(pd.getName());
                    if (list == null) {
                        list = new ArrayList<>(5);
                    }/*ww w. j  a  v  a 2 s . c o m*/
                    list.add(pd);
                    choices.put(pd.getName(), list);
                }
                for (NodeType nt : node.getMixinNodeTypes()) {
                    for (PropertyDefinition pd : nt.getPropertyDefinitions()) {
                        List<PropertyDefinition> list = choices.get(pd.getName());
                        if (list == null) {
                            list = new ArrayList<>(5);
                        }
                        list.add(pd);
                        choices.put(pd.getName(), list);
                    }
                }
                // remove already set properties from suggestions:
                final Set<String> properties = new HashSet<>(choices.keySet());
                for (String property : properties) {
                    if (!isResidual(property) && node.hasProperty(property)) {
                        choices.remove(property);
                    }
                }
            } catch (RepositoryException e) {
                log.warn("Unable to populate autocomplete list for property names", e);
            }
            return choices;
        }
    };

    // checkbox for property ismultiple
    final CheckBox checkBox = new CheckBox("isMultiple", new Model<Boolean>() {

        @Override
        public void setObject(Boolean multiple) {
            PropertyDialog.this.isMultiple = multiple;
        }

        @Override
        public Boolean getObject() {
            if (PropertyDialog.this.name != null) {
                List<PropertyDefinition> propdefs = choiceModel.getObject().get(PropertyDialog.this.name);
                if (propdefs != null) {
                    for (PropertyDefinition pd : propdefs) {
                        if (PropertyType.nameFromValue(pd.getRequiredType()).equals(type)) {
                            // somehow need to set isMultiple here, otherwise it doesn't get picked up...
                            PropertyDialog.this.isMultiple = pd.isMultiple();
                            return pd.isMultiple();
                        }
                    }
                }
            }
            return PropertyDialog.this.isMultiple;
        }
    });
    checkBox.setOutputMarkupId(true);
    add(checkBox);

    // dropdown for property type
    final DropDownChoice<String> ddChoice = new DropDownChoice<String>("types") {
        @Override
        public List<? extends String> getChoices() {
            if (PropertyDialog.this.name != null) {
                List<PropertyDefinition> propdefs = choiceModel.getObject().get(PropertyDialog.this.name);
                if (propdefs != null) {
                    List<String> result = new ArrayList<>(propdefs.size());
                    for (PropertyDefinition pd : propdefs) {
                        result.add(PropertyType.nameFromValue(pd.getRequiredType()));
                    }
                    return result;
                }
            }
            return ALL_TYPES;

        }
    };
    ddChoice.setModel(new Model<String>() {
        @Override
        public void setObject(String object) {
            type = object;
        }

        @Override
        public String getObject() {
            List<? extends String> choices = ddChoice.getChoices();
            if (choices.size() == 1) {
                type = choices.iterator().next();
            }
            return type;
        }
    });

    ddChoice.setRequired(true);
    ddChoice.setOutputMarkupId(true);
    ddChoice.add(new AjaxFormComponentUpdatingBehavior("onchange") {
        @Override
        protected void onUpdate(AjaxRequestTarget target) {
        }
    });
    add(ddChoice);

    values = new LinkedList<>();
    values.add("");

    final WebMarkupContainer valuesContainer = new WebMarkupContainer("valuesContainer");
    valuesContainer.setOutputMarkupId(true);
    add(valuesContainer);

    valuesContainer.add(new ListView<String>("values", values) {

        @Override
        protected void populateItem(final ListItem<String> item) {
            final TextField textField = new TextField<>("val", item.getModel());
            textField.add(new OnChangeAjaxBehavior() {

                @Override
                protected void onUpdate(final AjaxRequestTarget target) {
                }

            });
            item.add(textField);

            if (focusOnLatestValue && item.getIndex() == (values.size() - 1)) {
                AjaxRequestTarget ajax = RequestCycle.get().find(AjaxRequestTarget.class);
                if (ajax != null) {
                    ajax.focusComponent(textField);
                }
                focusOnLatestValue = false;
            }

            final AjaxLink deleteLink = new AjaxLink("removeLink") {
                @Override
                public void onClick(final AjaxRequestTarget target) {
                    values.remove(item.getIndex());
                    target.add(valuesContainer);
                }

                @Override
                public boolean isVisible() {
                    return super.isVisible() && item.getIndex() > 0;
                }
            };

            deleteLink.add(TitleAttribute.set(getString("property.value.remove")));
            deleteLink.add(new InputBehavior(new KeyType[] { KeyType.Enter }, EventType.click) {
                @Override
                protected String getTarget() {
                    return "'" + deleteLink.getMarkupId() + "'";
                }
            });
            item.add(deleteLink);
        }
    });

    final AjaxLink addLink = new AjaxLink("addLink") {
        @Override
        public void onClick(final AjaxRequestTarget target) {
            values.add("");
            target.add(valuesContainer);
            focusOnLatestValue = true;
        }

        @Override
        public boolean isVisible() {
            return isMultiple;
        }
    };
    addLink.add(TitleAttribute.set(getString("property.value.add")));
    addLink.add(new InputBehavior(new KeyType[] { KeyType.Enter }, EventType.click) {
        @Override
        protected String getTarget() {
            return "'" + addLink.getMarkupId() + "'";
        }
    });
    valuesContainer.add(addLink);

    checkBox.add(new AjaxFormComponentUpdatingBehavior("onchange") {
        @Override
        protected void onUpdate(AjaxRequestTarget target) {
            target.add(valuesContainer);
            if (!isMultiple && values.size() > 1) {
                String first = values.get(0);
                values.clear();
                values.add(first);
            }
        }
    });

    // text field for property name
    AutoCompleteSettings settings = new AutoCompleteSettings();
    settings.setAdjustInputWidth(false);
    settings.setUseSmartPositioning(true);
    settings.setShowCompleteListOnFocusGain(true);
    settings.setShowListOnEmptyInput(true);
    // Setting a max height will trigger a correct recalculation of the height when the list of items is filtered
    settings.setMaxHeightInPx(400);

    final TextField<String> nameField = new AutoCompleteTextFieldWidget<String>("name",
            PropertyModel.of(this, "name"), settings) {

        @Override
        protected Iterator<String> getChoices(String input) {
            List<String> result = new ArrayList<>();
            for (String propName : choiceModel.getObject().keySet()) {
                if (propName.contains(input)) {
                    result.add(propName);
                }
            }
            return result.iterator();
        }

        @Override
        protected void onUpdate(final AjaxRequestTarget target) {
            super.onUpdate(target);

            target.add(ddChoice);
            target.add(checkBox);
            target.add(valuesContainer);
            focusOnLatestValue = true;
        }
    };

    nameField.setRequired(true);
    add(nameField);
    setFocus(nameField);
}