/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.plugin.svn.ide.property;
import com.google.common.base.Strings;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
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.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.SuggestOracle;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.eclipse.che.plugin.svn.ide.SubversionExtensionLocalizationConstants;
import org.eclipse.che.plugin.svn.ide.SubversionExtensionResources;
import org.eclipse.che.plugin.svn.shared.Depth;
import org.eclipse.che.ide.ui.window.Window;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Implementation of {@link PropertyEditorView}.
*
* @author Vladyslav Zhukovskyi
* @author Stephane Tournie
*/
@Singleton
public class PropertyEditorViewImpl extends Window implements PropertyEditorView {
interface PropertyEditorViewImplUiBinder extends UiBinder<Widget, PropertyEditorViewImpl> {
}
Button btnOk;
Button btnCancel;
@UiField(provided = true)
SuggestBox propertyList;
@UiField
RadioButton editProperty;
@UiField
RadioButton deleteProperty;
@UiField
TextArea propertyValue;
@UiField
ListBox depth;
@UiField
CheckBox force;
@UiField
TextArea propertyCurrentValue;
@UiField(provided = true)
SubversionExtensionResources resources;
@UiField(provided = true)
SubversionExtensionLocalizationConstants constants;
private PropertyEditorView.ActionDelegate delegate;
private List<String> existingProperties;
@Inject
public PropertyEditorViewImpl(SubversionExtensionResources resources,
SubversionExtensionLocalizationConstants constants,
PropertyEditorViewImplUiBinder uiBinder) {
this.resources = resources;
this.constants = constants;
this.ensureDebugId("svn-property-edit-window");
this.setTitle("Properties");
existingProperties = new ArrayList<String>();
btnCancel = createButton(constants.buttonCancel(), "svn-property-edit-cancel", new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
delegate.onCancelClicked();
}
});
btnCancel.setTabIndex(6);
addButtonToFooter(btnCancel);
btnOk = createButton("Ok", "svn-property-edit-ok", new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
delegate.onOkClicked();
}
});
btnOk.setTabIndex(5);
addButtonToFooter(btnOk);
final String[] props = new String[] {
"svn:ignore",
"svn:keywords",
"svn:mime-type",
"svn:mergeinfo"
};
propertyList = new SuggestBox(new SuggestOracle() {
@Override
public void requestSuggestions(final Request request, Callback callback) {
final List<Suggestion> suggestions = new ArrayList<>();
for (final String prop : props) {
if (!prop.startsWith(request.getQuery())) {
continue;
}
suggestions.add(new SuggestOracle.Suggestion() {
/** {@inheritDoc} */
@Override
public String getDisplayString() {
return prop;
}
/** {@inheritDoc} */
@Override
public String getReplacementString() {
return prop;
}
});
}
callback.onSuggestionsReady(request, new Response(suggestions));
}
});
propertyList.getValueBox().addKeyUpHandler(new KeyUpHandler() {
/** {@inheritDoc} */
@Override
public void onKeyUp(KeyUpEvent event) {
String propertyListValue = propertyList.getValue();
int keyCode = event.getNativeKeyCode();
if (keyCode >= KeyCodes.KEY_A && keyCode <= KeyCodes.KEY_Z
|| keyCode >= KeyCodes.KEY_ZERO && keyCode <= KeyCodes.KEY_NINE
|| keyCode >= KeyCodes.KEY_NUM_ZERO && keyCode <= KeyCodes.KEY_NUM_NINE
|| keyCode == KeyCodes.KEY_ENTER
|| keyCode == KeyCodes.KEY_BACKSPACE) {
setPropertyCurrentValue(Arrays.asList(""));
if (!Strings.isNullOrEmpty(propertyListValue) && existingProperties.contains(propertyListValue)) {
btnOk.setEnabled(editProperty.getValue() && !Strings.isNullOrEmpty(propertyValue.getText())
|| deleteProperty.getValue());
delegate.onPropertyNameChanged(propertyListValue);
}
}
}
});
this.setWidget(uiBinder.createAndBindUi(this));
for (Depth depth : Depth.values()) {
this.depth.addItem(depth.getDescription(), depth.getValue());
}
propertyCurrentValue.setReadOnly(true);
propertyCurrentValue.getElement().setAttribute("placeHolder", "(current value of property)");
propertyCurrentValue.getElement().setAttribute("resize", "none");
}
/** {@inheritDoc} */
@Override
public void setDelegate(ActionDelegate delegate) {
this.delegate = delegate;
}
/** {@inheritDoc} */
@Override
public void onClose() {
hide();
propertyList.setEnabled(false);
}
/** {@inheritDoc} */
@Override
public void onShow() {
propertyCurrentValue.setText(null);
editProperty.setValue(true);
propertyValue.setEnabled(true);
propertyValue.setText(null);
deleteProperty.setValue(false);
propertyList.setEnabled(true);
btnOk.setEnabled(false);
force.setValue(false);
depth.setSelectedIndex(0);
delegate.obtainExistingPropertiesForPath();
Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
@Override
public void execute() {
String defaultPropertyListValue = "svn:ignore";
propertyList.getValueBox().setValue(defaultPropertyListValue);
propertyList.setFocus(true);
delegate.onPropertyNameChanged(defaultPropertyListValue);
}
});
show();
}
/** {@inheritDoc} */
@Override
public String getSelectedProperty() {
return propertyList.getValue();
}
/** {@inheritDoc} */
@Override
public Depth getDepth() {
return Depth.from(depth.getSelectedValue());
}
/** {@inheritDoc} */
@Override
public String getPropertyValue() {
return propertyValue.getText();
}
/** {@inheritDoc} */
@Override
public boolean isEditPropertySelected() {
return editProperty.getValue();
}
/** {@inheritDoc} */
@Override
public boolean isDeletePropertySelected() {
return deleteProperty.getValue();
}
/** {@inheritDoc} */
@Override
public boolean isForceSelected() {
return force.getValue();
}
@UiHandler({"editProperty", "deleteProperty"})
@SuppressWarnings("unused")
public void onModeChanged(ClickEvent event) {
if (editProperty.getValue()) {
propertyValue.setEnabled(true);
btnOk.setEnabled(!Strings.isNullOrEmpty(propertyList.getValue())
&& !Strings.isNullOrEmpty(propertyValue.getText()));
} else if (deleteProperty.getValue()) {
propertyValue.setEnabled(false);
btnOk.setEnabled(!Strings.isNullOrEmpty(propertyList.getValue()));
}
}
@UiHandler("propertyValue")
public void onPropertyValueChanged(KeyUpEvent event) {
btnOk.setEnabled(!Strings.isNullOrEmpty(propertyList.getValue())
&& !Strings.isNullOrEmpty(propertyValue.getText()));
}
@Override
public void setPropertyCurrentValue(List<String> values) {
String text = "";
for (String value : values) {
if (value != null && value.length() > 0) {
text += value + "\n";
}
}
propertyCurrentValue.setText(text);
}
@Override
public void setExistingPropertiesForPath(List<String> properties) {
existingProperties.clear();
for (String property : properties) {
existingProperties.add(property);
}
}
}