private void updateAllTagsListBoxContents() {
        final String filter = textBox.getText();
        allTagsListBox.clear();

        final Predicate<String> predicate;
        if (NullSafe.isBlankString(filter)) {
            predicate = ALWAYS_TRUE_PREDICATE;
        } else {
            final String lowerCaseFilter = cleanTag(filter);
            GWT.log("lowerCaseFilter: '" + lowerCaseFilter + "'");
            predicate = tag -> tag.contains(lowerCaseFilter);
        }

        // Include any newly added node tags in the list of all tags
        allTags.stream()
                .filter(tag -> !nodeTags.contains(tag)) // No point including ones we already have on the node
                .filter(predicate)
                .distinct()
                .sorted()
                .forEach(allTagsListBox::addItem);

        if (allTagsListBox.getItemCount() > 0) {
            if (selectedValue != null) {
                int selectedIdx = -1;
                for (int i = 0; i < allTagsListBox.getItemCount(); i++) {
                    if (Objects.equals(selectedValue, allTagsListBox.getValue(i))) {
                        selectedIdx = i;
                        break;
                    }
                }
                if (selectedIdx != -1) {
                    allTagsListBox.setSelectedIndex(selectedIdx);
                } else {
                    allTagsListBox.setSelectedIndex(0);
                }
            } else {
                allTagsListBox.setSelectedIndex(0);
            }
        }
        updateButtonStates();
//        updateAddFromAllTagsEnabledState();
    }
@return Trimmed and lower-cased tag.
stroom-core-client/src/main/java/stroom/explorer/client/view/ExplorerNodeEditTagsViewImpl.java