Package org.geoserver.web.translator.view

Source Code of org.geoserver.web.translator.view.TranslationEditPage$LocaleListDetachableModel

/* Copyright (c) 2001 - 2009 TOPP - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.web.translator.view;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;

import org.apache.wicket.Application;
import org.apache.wicket.Component;
import org.apache.wicket.MetaDataKey;
import org.apache.wicket.Session;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormSubmitBehavior;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.behavior.SimpleAttributeModifier;
import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.ResourceModel;
import org.geoserver.web.GeoServerApplication;
import org.geoserver.web.GeoServerBasePage;
import org.geoserver.web.translator.controller.TranslationController;
import org.geoserver.web.translator.model.TranslateBean;

/**
* Page to edit a translation, split in two panels, one to select the resource key to translate and
* anther to perform the translation.
*
* @author Gabriel Roldan
* @version $Id: TranslationEditPage.java 13241 2009-08-30 05:44:14Z groldan $
* @since 2.0
*/
public class TranslationEditPage extends GeoServerBasePage {

    /**
     * The key to store the current translation progress in the user's {@link Session}
     */
    public static final MetaDataKey TRANSLATION_BEAN = new MetaDataKey(TranslateBean.class) {
        private static final long serialVersionUID = 1L;
    };

    private Form toolbarForm;

    private Form filterForm;

    private Form translateForm;

    private TextField filter;

    private AjaxButton hiddenSubmit;

    private Form changeUILanguageForm;

    private ResourceKeyTreePanel keyTreePanel;

    final TranslationResourcePanel translationPanel;

    public TranslationEditPage() {
        this(null);
    }

    public TranslationEditPage(final Locale targetLocale) {
        super();

        final IModel translationModel;
        {
            TranslateBean translateBean;
            final GeoServerApplication application = getGeoServerApplication();
            translateBean = (TranslateBean) application.getMetaData(TRANSLATION_BEAN);
            if (translateBean == null) {
                TranslationController controller = getController();
                Map<Locale, Map<String, String>> translatedResources;
                translatedResources = controller.getTranslatedResources();

                // default locale is keyed by null
                Locale baseLocale = null;
                translateBean = new TranslateBean(baseLocale, translatedResources);
                application.setMetaData(TRANSLATION_BEAN, translateBean);
            }

            translateBean.setTargetLanguage(targetLocale);

            // translationModel = new Model(translateBean);
            translationModel = new LoadableDetachableModel() {
                private static final long serialVersionUID = 1L;

                @Override
                protected Object load() {
                    final Application application = getApplication();
                    TranslateBean translateState = (TranslateBean) application
                            .getMetaData(TRANSLATION_BEAN);
                    return translateState;
                }
            };
        }

        setModel(translationModel);
        add(toolbar());
        add(filter());

        add(translateForm = new Form("translateForm"));
        translateForm
                .add(keyTreePanel = new ResourceKeyTreePanel("keyTreePanel", translationModel));
        translateForm.add(translationPanel = new TranslationResourcePanel("resourcePanel",
                translationModel));
        add(changeUILocale());

        final IModel currentKeyModel = new PropertyModel(translationModel, "currentKey");
        keyTreePanel.getTree().add(new AjaxFormSubmitBehavior(translateForm, "onclick") {
            private static final long serialVersionUID = 1L;

            @Override
            protected void onSubmit(final AjaxRequestTarget target) {
                String selectedNodeKey = keyTreePanel.getSelectedNodeKey();
                currentKeyModel.setObject(selectedNodeKey);
                translationPanel.refresh(target);
            }

            @Override
            protected void onError(final AjaxRequestTarget target) {
                // TODO Auto-generated method stub
            }
        });
    }

    private Component changeUILocale() {
        changeUILanguageForm = new Form("changeUILanguageForm");
        changeUILanguageForm.add(changeUiLanguageChoice());
        return changeUILanguageForm;
    }

    private Component filter() {
        // build the filter form
        filterForm = new Form("filterForm");

        final IModel filterModel = new PropertyModel(getModel(), "filter");
        filterForm.add(filter = new TextField("filter", filterModel));
        filter.add(new SimpleAttributeModifier("title", String.valueOf(new ResourceModel(
                "ResourceKeyTreePanel.search", "Search").getObject())));
        filterForm.add(hiddenSubmit = hiddenSearchSubmit());
        filterForm.setDefaultButton(hiddenSubmit);

        return filterForm;
    }

    private Component toolbar() {
        toolbarForm = new Form("toolbarForm");
        toolbarForm.add(expandAllLink());
        toolbarForm.add(collapseAllLink());
        toolbarForm.add(treeViewLink());
        toolbarForm.add(flatViewLink());
        toolbarForm.add(showMissingOnlyComponent());
        return toolbarForm;
    }

    private CheckBox showMissingOnlyComponent() {
        final IModel model = new PropertyModel(getModel(), "showMissingOnly");
        final CheckBox checkBox = new CheckBox("showMissingOnly", model);

        checkBox.add(new AjaxFormSubmitBehavior(toolbarForm, "onChange") {
            private static final long serialVersionUID = 1L;

            @Override
            protected void onSubmit(final AjaxRequestTarget target) {
                keyTreePanel.refresh();
                target.addComponent(keyTreePanel);
            }

            @Override
            protected void onError(AjaxRequestTarget target) {
                // Ignore
            }

        });

        return checkBox;
    }

    /**
     * The hidden button that will submit the form when the user presses enter in the text field
     */
    private AjaxButton hiddenSearchSubmit() {
        return new AjaxButton("submit") {

            private static final long serialVersionUID = 1L;

            @Override
            protected void onSubmit(AjaxRequestTarget target, Form form) {
                keyTreePanel.refresh();
                target.addComponent(keyTreePanel);
            }
        };
    }

    private AjaxLink flatViewLink() {
        return new AjaxLink("flatView", new PropertyModel(getModel(), "flatView")) {
            private static final long serialVersionUID = 6747039733052048287L;

            @Override
            public void onClick(final AjaxRequestTarget target) {
                setModelObject(Boolean.TRUE);
                keyTreePanel.refresh();
                target.addComponent(keyTreePanel);
            }
        };
    }

    private AjaxLink treeViewLink() {
        return new AjaxLink("treeView", new PropertyModel(getModel(), "flatView")) {
            private static final long serialVersionUID = 6747039733052048287L;

            @Override
            public void onClick(final AjaxRequestTarget target) {
                setModelObject(Boolean.FALSE);
                keyTreePanel.refresh();
                target.addComponent(keyTreePanel);
            }
        };
    }

    private AjaxLink collapseAllLink() {
        return new AjaxLink("collapseAll") {
            private static final long serialVersionUID = 6747039733052048287L;

            @Override
            public void onClick(final AjaxRequestTarget target) {
                keyTreePanel.collapseAll(target);
            }
        };
    }

    private AjaxLink expandAllLink() {
        return new AjaxLink("expandAll") {
            private static final long serialVersionUID = 6747039733052048287L;

            @Override
            public void onClick(final AjaxRequestTarget target) {
                keyTreePanel.expandAll(target);
            }
        };
    }

    private Component changeUiLanguageChoice() {
        final IModel sessionModel = new Model(getSession());
        final IModel uiLocaleModel = new PropertyModel(sessionModel, "locale");
        IModel choices = new LocaleListDetachableModel(true, uiLocaleModel);

        final Component uiLanguageChoice = new LocaleDropDown("changeUiLanguage", uiLocaleModel,
                uiLocaleModel, choices);

        uiLanguageChoice.add(new AjaxFormSubmitBehavior(changeUILanguageForm, "onChange") {

            private static final long serialVersionUID = 1L;

            @Override
            protected void onSubmit(final AjaxRequestTarget target) {
                getGeoServerApplication().clearWicketCaches();
                setResponsePage(TranslationEditPage.this);
            }

            @Override
            protected void onError(final AjaxRequestTarget target) {
                //
            }
        });
        return uiLanguageChoice;
    }

    private TranslationController getController() {
        GeoServerApplication application = getGeoServerApplication();
        TranslationController controller = application.getBeanOfType(TranslationController.class);
        return controller;
    }

    /**
     * A model for the list of available translations
     */
    public static class LocaleListDetachableModel extends LoadableDetachableModel {

        private static final long serialVersionUID = 1L;

        private boolean includeDefault;

        private IModel uiLocaleModel;

        public LocaleListDetachableModel(final boolean includeDefault, final IModel uiLocaleModel) {
            this.includeDefault = includeDefault;
            this.uiLocaleModel = uiLocaleModel;
        }

        @Override
        protected Object load() {
            Set<Locale> availableTranslations;
            {
                final GeoServerApplication geoServerApplication = GeoServerApplication.get();
                final TranslateBean translateState = (TranslateBean) geoServerApplication
                        .getMetaData(TRANSLATION_BEAN);
                availableTranslations = translateState.getAvailableTranslations();
            }
            List<Locale> sorted = new ArrayList<Locale>(availableTranslations);
            if (includeDefault) {
                sorted.add(Locale.ENGLISH);
            }
            Collections.sort(sorted, new Comparator<Locale>() {
                public int compare(Locale o1, Locale o2) {
                    Locale uiLocale = (Locale) uiLocaleModel.getObject();
                    String displayName1 = o1.getDisplayName(uiLocale);
                    String displayName2 = o2.getDisplayName(uiLocale);
                    return displayName1.compareTo(displayName2);
                }
            });
            return sorted;
        }
    }
}
TOP

Related Classes of org.geoserver.web.translator.view.TranslationEditPage$LocaleListDetachableModel

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.