package org.aperteworkflow.editor.processeditor.tab.message; import com.vaadin.ui.*; import org.aperteworkflow.editor.domain.Language; import org.aperteworkflow.editor.vaadin.DataHandler; import org.aperteworkflow.util.vaadin.VaadinUtility; import pl.net.bluesoft.rnd.util.i18n.I18NSource; import pl.net.bluesoft.util.lang.Lang; import java.util.Collection; import java.util.HashMap; import java.util.Map; public class MessageEditor extends VerticalLayout implements TabSheet.CloseHandler, DataHandler { /** * The window which allows to define and add new language to the editor */ private class NewLanguageWindow extends Window { private LanguageForm languageForm; private Button addButton; public NewLanguageWindow() { initComponent(); initLayout(); } private void initComponent() { I18NSource messages = I18NSource.ThreadUtil.getThreadI18nSource(); setCaption(messages.getMessage("messages.language.new.caption")); languageForm = new LanguageForm(); addButton = VaadinUtility.button( messages.getMessage("messages.language.new.add"), new Runnable() { @Override public void run() { languageForm.commit(); Language lang = languageForm.getLanguage(); if (languageProperties.containsKey(lang)) { I18NSource messages = I18NSource.ThreadUtil.getThreadI18nSource(); VaadinUtility.errorNotification( getApplication(), messages, messages.getMessage("messages.language.new.exists") ); return; } addLanguageTab(lang, null); NewLanguageWindow.this.close(); } } ); } private void initLayout() { addComponent(languageForm); addComponent(addButton); setModal(true); setSpacing(true); } } private Map<Language, String> languageMessages; private Map<Language, PropertiesArea> languageProperties; private Button newLanguageButton; private Select defaultLanguageSelect; private Label languageDescriptionLabel; private TabSheet languageTabs; public MessageEditor() { languageProperties = new HashMap<Language, PropertiesArea>(); languageMessages = new HashMap<Language, String>(); initComponent(); initLayout(); } public Map<Language, String> getLanguageMessages() { return languageMessages; } public void setLanguageMessages(Map<Language, String> languageMessages) { this.languageMessages = languageMessages; if (languageMessages != null) { for (Language language : languageMessages.keySet()) { addAvailableDefaultLanguage(language.getCode()); } } } @Override public void onTabClose(TabSheet tabsheet, final Component tabContent) { I18NSource messages = I18NSource.ThreadUtil.getThreadI18nSource(); String langCode = "UNKNOWN"; if (tabContent instanceof PropertiesArea) { PropertiesArea props = (PropertiesArea) tabContent; langCode = props.getLanguage().getCode(); } ConfirmWindow confirmWindow = new ConfirmWindow(); confirmWindow.setMessageValue(messages.getMessage( "messages.language.delete.warning", new Object[]{langCode}) ); confirmWindow.setConfirmCaption(messages.getMessage("messages.language.delete.yes")); confirmWindow.setCancelCaption(messages.getMessage("messages.language.delete.no")); confirmWindow.addConfirmListener(new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { removeLanguageTab(tabContent); } }); // size the message window, otherwise it looks silly confirmWindow.setWidth("300px"); confirmWindow.getContent().setSizeFull(); getApplication().getMainWindow().addWindow(confirmWindow); } private void initLayout() { setSpacing(true); addComponent(languageDescriptionLabel); addComponent(newLanguageButton); addComponent(defaultLanguageSelect); addComponent(languageTabs); } private void initComponent() { I18NSource messages = I18NSource.ThreadUtil.getThreadI18nSource(); newLanguageButton = VaadinUtility.button( messages.getMessage("messages.language.new.button"), new Runnable() { @Override public void run() { Window window = new NewLanguageWindow(); MessageEditor.this.getApplication().getMainWindow().addWindow(window); } } ); defaultLanguageSelect = new Select(messages.getMessage("messages.default.language")); defaultLanguageSelect.setWidth(150, UNITS_PIXELS); languageDescriptionLabel = new Label(messages.getMessage("messages.language.description")); languageTabs = new TabSheet(); languageTabs.setCloseHandler(this); } private void addLanguageTab(Language language, String messagesContent) { PropertiesArea area = new PropertiesArea(); area.setValue(messagesContent); area.setLanguage(language); languageProperties.put(language, area); TabSheet.Tab tab = languageTabs.addTab(area, language.getCode()); tab.setClosable(true); addAvailableDefaultLanguage(language.getCode()); if (getAvailableDefaultLanguageCount() == 1 && getDefaultLanguage() == null) { setDefaultLanguage(language.getCode()); } } private void removeLanguageTab(Component c) { PropertiesArea area = (PropertiesArea) c; Language language = area.getLanguage(); languageProperties.remove(language); languageTabs.removeComponent(c); if (Lang.equals(getDefaultLanguage(), language.getCode())) { setDefaultLanguage(null); } removeAvailableDefaultLanguage(language.getCode()); } public String getDefaultLanguage() { return (String)defaultLanguageSelect.getValue(); } public void setDefaultLanguage(String languageCode) { defaultLanguageSelect.setValue(languageCode); } private void addAvailableDefaultLanguage(String languageCode) { defaultLanguageSelect.getContainerDataSource().addItem(languageCode); } private void removeAvailableDefaultLanguage(String languageCode) { defaultLanguageSelect.getContainerDataSource().removeItem(languageCode); } private int getAvailableDefaultLanguageCount() { return defaultLanguageSelect.getContainerDataSource().getItemIds().size(); } @Override public void loadData() { languageProperties.clear(); languageTabs.removeAllComponents(); if (languageMessages == null || languageMessages.isEmpty()) { // nothing to load return; } for (Language lang : languageMessages.keySet()) { String messagesContent = Native2AsciiUtil.ascii2Native(languageMessages.get(lang)); addLanguageTab(lang, messagesContent); } } @Override public void saveData() { languageMessages = null; // don't use clear(), we can get null from the outside if (languageProperties == null || languageProperties.isEmpty()) { // nothing to save return; } languageMessages = new HashMap<Language, String>(); for (Language lang : languageProperties.keySet()) { PropertiesArea area = languageProperties.get(lang); String messagesContent = Native2AsciiUtil.native2Ascii((String) area.getValue()); languageMessages.put(lang, messagesContent); } } @Override public Collection<String> validateData() { return null; } }