/* 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;
}
}
}