CCM NG: Editor component for LocalizedString for the Vaadin prototype

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@5009 8810af33-2d31-482b-a856-94f89814c4df
jensp 2017-09-27 05:56:38 +00:00
parent 582b180d94
commit 6393741280
1 changed files with 189 additions and 0 deletions

View File

@ -0,0 +1,189 @@
package org.libreccm.l10n.ui;
import com.vaadin.data.provider.QuerySortOrder;
import com.vaadin.server.SerializableSupplier;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.Grid;
import org.libreccm.l10n.GlobalizationHelper;
import org.libreccm.l10n.LocalizedString;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Stream;
/*
* Copyright (C) 2015 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
/**
* A editor widget for properties of type {@link LocalizedString}. The widget
* consists of the following components:
*
* <ul>
* <li>A table displaying a variants of the localised string.</li>
* <li>An editor for the values.</li>
* </ul>
*
* If the localised string is a single line string, the strings can be edited
* directly in the table. Otherwise a popup window with a text area is opened.
*
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class LocalizedStringEditor extends CustomComponent {
private static final long serialVersionUID = 1275927615085548961L;
private static final String COL_LOCALE = "col_locale";
private static final String COL_VALUE = "col_value";
private static final String COL_EDIT = "col_edit";
private static final String COL_REMOVE = "col_remove";
private final GlobalizationHelper globalizationHelper;
private boolean multiline;
private LocalizedString localizedString;
private final Grid<LocalizedStringValue> grid;
public LocalizedStringEditor(final GlobalizationHelper globalizationHelper) {
super();
this.globalizationHelper = globalizationHelper;
multiline = false;
grid = new Grid<>();
grid.setDataProvider(this::fetchValues,
() -> localizedString.getAvailableLocales().size());
grid.addColumn(LocalizedStringValue::getLocaleLabel)
.setCaption("Language")
.setId(COL_LOCALE);
}
public LocalizedStringEditor(final LocalizedString localizedString,
final GlobalizationHelper globalizationHelper) {
this(globalizationHelper);
this.localizedString = localizedString;
multiline = false;
}
public LocalizedStringEditor(final boolean multiline,
final GlobalizationHelper globalizationHelper) {
this(globalizationHelper);
this.multiline = multiline;
}
public LocalizedStringEditor(final LocalizedString localizedString,
final boolean multiline,
final GlobalizationHelper globalizationHelper) {
this(globalizationHelper);
this.localizedString = localizedString;
this.multiline = multiline;
}
public boolean isMultiline() {
return multiline;
}
public void setMultiline(final boolean multiline) {
this.multiline = multiline;
}
public LocalizedString getLocalizedString() {
return localizedString;
}
public void setLocalizedString(final LocalizedString localizedString) {
this.localizedString = localizedString;
}
private class LocalizedStringValue {
private Locale locale;
private String value;
public LocalizedStringValue(final Locale locale,
final String value) {
this.locale = locale;
this.value = value;
}
public Locale getLocale() {
return locale;
}
public String getLocaleLabel() {
return locale
.getDisplayName(globalizationHelper.getNegotiatedLocale());
}
public void setLocale(final Locale locale) {
this.locale = locale;
}
public String getValue() {
return value;
}
public String getText() {
if (multiline) {
final String withoutHtml = value
.replaceAll("<[\\w/]*>", " ")
.replaceAll("\\s{2,}", " ").trim();
return String.format("%s...", withoutHtml.substring(0, 256));
} else {
return value;
}
}
public void setValue(final String value) {
this.value = value;
}
}
private Stream<LocalizedStringValue> fetchValues(
final List<QuerySortOrder> sortOrder,
final int offset,
final int limit) {
final List<Locale> locales = new ArrayList<>(localizedString
.getAvailableLocales());
locales.sort((locale1, locale2) -> {
return Objects
.toString(locale1)
.compareTo(Objects.toString(locale2));
});
locales.subList(offset, limit);
return locales
.stream()
.map(locale -> new LocalizedStringValue(
locale, localizedString.getValue(locale)));
}
}