/*
* Copyright 2010, 2012 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package cc.kune.gspace.client.i18n;
import cc.kune.common.client.log.Log;
import cc.kune.common.client.tooltip.Tooltip;
import cc.kune.common.shared.i18n.I18nTranslationService;
import cc.kune.common.shared.utils.TextUtils;
import cc.kune.core.shared.dto.I18nLanguageSimpleDTO;
import cc.kune.core.shared.dto.I18nTranslationDTO;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PushButton;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.Widget;
// TODO: Auto-generated Javadoc
/**
* A form used for editing translations.
*
* @author vjrj@ourproject.org (Vicente J. Ruiz Jurado)
*/
public class I18nTranslatorForm extends Composite {
/**
* The Interface Binder.
*
* @author vjrj@ourproject.org (Vicente J. Ruiz Jurado)
*/
interface Binder extends UiBinder<Widget, I18nTranslatorForm> {
}
/** The ui binder. */
private static Binder uiBinder = GWT.create(Binder.class);
/** The copy icon. */
@UiField
PushButton copyIcon;
/** The data provider. */
private I18nTranslationDataProvider dataProvider;
/** The i18n. */
private I18nTranslationService i18n;
/** The item. */
private I18nTranslationDTO item;
/** The keyboard recomendation. */
@UiField
Label keyboardRecomendation;
/** The keyboard recomendation title. */
@UiField
Label keyboardRecomendationTitle;
/** The keyboard timer. */
private final Timer keyboardTimer;
/** The note for translators. */
@UiField
Label noteForTranslators;
/** The note for translators tittle. */
@UiField
Label noteForTranslatorsTittle;
/** The saver. */
private I18nTranslatorSaver saver;
/** The to language title. */
@UiField
Label toLanguageTitle;
/** The to translate. */
@UiField
Label toTranslate;
/** The to translate title. */
@UiField
Label toTranslateTitle;
/** The translation. */
@UiField
TextArea translation;
/**
* Instantiates a new i18n translator form.
*/
public I18nTranslatorForm() {
initWidget(uiBinder.createAndBindUi(this));
keyboardTimer = new Timer() {
@Override
public void run() {
saveIfNeeded();
}
};
}
/**
* Copy translation.
*/
private void copyTranslation() {
translation.setText(toTranslate.getText());
}
/**
* Focus to translate.
*/
public void focusToTranslate() {
translation.setFocus(true);
}
/**
* Handle blur.
*
* @param event
* the event
*/
@UiHandler("translation")
void handleBlur(final BlurEvent event) {
saveIfNeeded();
}
/**
* Handle click on copy icon.
*
* @param e
* the e
*/
@UiHandler("copyIcon")
void handleClickOnCopyIcon(final ClickEvent e) {
copyTranslation();
translation.setFocus(true);
updateWithTimer();
}
/**
* Handle key press.
*
* @param event
* the event
*/
@UiHandler("translation")
void handleKeyPress(final ChangeEvent event) {
updateWithTimer();
}
/**
* Handle key press.
*
* @param event
* the event
*/
@UiHandler("translation")
void handleKeys(final KeyUpEvent event) {
Log.debug("Translator key " + event.getNativeKeyCode());
Log.debug("Translator is Alt " + event.isAltKeyDown());
if (event.isAltKeyDown()
&& event.getNativeEvent().getKeyCode() == com.google.gwt.event.dom.client.KeyCodes.KEY_PAGEUP) {
Log.debug("Translator pageup");
saveIfNeeded();
dataProvider.selectPrevious();
} else if (event.isAltKeyDown()
&& event.getNativeEvent().getKeyCode() == com.google.gwt.event.dom.client.KeyCodes.KEY_PAGEDOWN) {
Log.debug("Translator pagedown");
saveIfNeeded();
dataProvider.selectNext();
} else if (event.isAltKeyDown() && event.getNativeKeyCode() == 86) {
Log.debug("Translator copy");
copyTranslation();
updateWithTimer();
}
}
/**
* Inits the.
*
* @param dataProvider
* the data provider
* @param i18n
* the i18n
* @param saver
* the saver
*/
public void init(final I18nTranslationDataProvider dataProvider, final I18nTranslationService i18n,
final I18nTranslatorSaver saver) {
this.dataProvider = dataProvider;
this.i18n = i18n;
this.saver = saver;
Tooltip.to(copyIcon, i18n.t("Copy the text to translate"));
toTranslateTitle.setText(i18n.t("translate this:"));
noteForTranslatorsTittle.setText(i18n.t("Notes:"));
keyboardRecomendationTitle.setText(i18n.t("Tip:"));
keyboardRecomendation.setText(i18n.t("You can resize the above textarea.")
+ " "
+ i18n.t("Click Alt+PageUp or Alt+PageDown to move up/down in the list while translating, and Alt-V to copy the original text. The translations are autosaved"));
}
/**
* Save if needed.
*/
private void saveIfNeeded() {
keyboardTimer.cancel();
final String newTranslation = translation.getText();
if (item != null && TextUtils.notEmpty(newTranslation) && !newTranslation.equals(item.getText())) {
item.setText(translation.getText());
item.setDirty(true);
dataProvider.refreshDisplays();
saver.save(new I18nTranslationDTO(item.getId(), item.getTrKey(), null, newTranslation,
item.getParentId(), item.getParentTrKey(), item.getNoteForTranslators()));
}
}
/**
* Sets the info.
*
* @param item
* the new info
*/
public void setInfo(final I18nTranslationDTO item) {
saveIfNeeded();
this.item = item;
final String trKey = item.getTrKey();
toTranslate.setText(trKey == null ? item.getParentTrKey() : trKey);
translation.setText(item.getText());
final boolean hasNT = TextUtils.notEmpty(item.getNoteForTranslators());
noteForTranslators.setVisible(hasNT);
noteForTranslatorsTittle.setVisible(hasNT);
if (hasNT) {
noteForTranslators.setText(item.getNoteForTranslators());
}
}
/**
* Sets the to language.
*
* @param language
* the new to language
*/
public void setToLanguage(final I18nLanguageSimpleDTO language) {
toLanguageTitle.setText(i18n.tWithNT("to [%s]:", "For example, 'to Spanish':",
language.getEnglishName()));
toTranslate.setText("");
translation.setText("");
noteForTranslators.setVisible(false);
}
/**
* Update with timer.
*/
private void updateWithTimer() {
keyboardTimer.cancel();
keyboardTimer.schedule(3000);
}
}