326 lines
9.8 KiB
Java
326 lines
9.8 KiB
Java
// Copyright (C) 2010 The Android Open Source Project
|
|
//
|
|
// 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 com.google.gerrit.client.patches;
|
|
|
|
import com.google.gerrit.client.ErrorDialog;
|
|
import com.google.gerrit.client.Gerrit;
|
|
import com.google.gerrit.client.account.Util;
|
|
import com.google.gerrit.client.rpc.GerritCallback;
|
|
import com.google.gerrit.client.ui.ListenableAccountDiffPreference;
|
|
import com.google.gerrit.client.ui.NpIntTextBox;
|
|
import com.google.gerrit.reviewdb.AccountDiffPreference;
|
|
import com.google.gerrit.reviewdb.AccountDiffPreference.Whitespace;
|
|
import com.google.gwt.core.client.GWT;
|
|
import com.google.gwt.event.dom.client.ClickEvent;
|
|
import com.google.gwt.event.dom.client.KeyCodes;
|
|
import com.google.gwt.event.dom.client.KeyPressEvent;
|
|
import com.google.gwt.event.dom.client.KeyPressHandler;
|
|
import com.google.gwt.event.logical.shared.HasValueChangeHandlers;
|
|
import com.google.gwt.event.logical.shared.ValueChangeEvent;
|
|
import com.google.gwt.event.logical.shared.ValueChangeHandler;
|
|
import com.google.gwt.event.shared.HandlerRegistration;
|
|
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.Composite;
|
|
import com.google.gwt.user.client.ui.FocusWidget;
|
|
import com.google.gwt.user.client.ui.HasWidgets;
|
|
import com.google.gwt.user.client.ui.ListBox;
|
|
import com.google.gwt.user.client.ui.Widget;
|
|
import com.google.gwtjsonrpc.client.VoidResult;
|
|
|
|
public class PatchScriptSettingsPanel extends Composite implements
|
|
HasValueChangeHandlers<AccountDiffPreference> {
|
|
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
|
|
|
|
interface MyUiBinder extends UiBinder<Widget, PatchScriptSettingsPanel> {
|
|
}
|
|
|
|
private ListenableAccountDiffPreference listenablePrefs;
|
|
private boolean enableIntralineDifference = true;
|
|
private boolean enableSmallFileFeatures = true;
|
|
|
|
@UiField
|
|
ListBox ignoreWhitespace;
|
|
|
|
@UiField
|
|
NpIntTextBox tabWidth;
|
|
|
|
@UiField
|
|
NpIntTextBox colWidth;
|
|
|
|
@UiField
|
|
CheckBox syntaxHighlighting;
|
|
|
|
@UiField
|
|
CheckBox intralineDifference;
|
|
|
|
@UiField
|
|
ListBox context;
|
|
|
|
@UiField
|
|
CheckBox whitespaceErrors;
|
|
|
|
@UiField
|
|
CheckBox showTabs;
|
|
|
|
@UiField
|
|
CheckBox reviewed;
|
|
|
|
@UiField
|
|
CheckBox skipDeleted;
|
|
|
|
@UiField
|
|
CheckBox skipUncommented;
|
|
|
|
@UiField
|
|
CheckBox expandAllComments;
|
|
|
|
|
|
@UiField
|
|
Button update;
|
|
|
|
/**
|
|
* Counts +1 for every setEnabled(true) and -1 for every setEnabled(false)
|
|
*
|
|
* The purpose is to prevent enabling widgets too early. It might happen that
|
|
* setEnabled(false) is called from this class and from an event handler
|
|
* of ValueChangeEvent in another class. The first setEnabled(true) would then
|
|
* enable widgets too early i.e. before the second setEnabled(true) is called.
|
|
*
|
|
* With this counter the setEnabled(true) will enable widgets only when
|
|
* setEnabledCounter == 0. Until it is less than zero setEnabled(true) will
|
|
* not enable the widgets.
|
|
*/
|
|
private int setEnabledCounter;
|
|
|
|
public PatchScriptSettingsPanel(ListenableAccountDiffPreference prefs) {
|
|
listenablePrefs = prefs;
|
|
initWidget(uiBinder.createAndBindUi(this));
|
|
initIgnoreWhitespace(ignoreWhitespace);
|
|
initContext(context);
|
|
if (!Gerrit.isSignedIn()) {
|
|
reviewed.setVisible(false);
|
|
}
|
|
|
|
KeyPressHandler onEnter = new KeyPressHandler() {
|
|
@Override
|
|
public void onKeyPress(KeyPressEvent event) {
|
|
if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
|
|
update();
|
|
}
|
|
}
|
|
};
|
|
tabWidth.addKeyPressHandler(onEnter);
|
|
colWidth.addKeyPressHandler(onEnter);
|
|
|
|
display();
|
|
}
|
|
|
|
@Override
|
|
public HandlerRegistration addValueChangeHandler(
|
|
ValueChangeHandler<AccountDiffPreference> handler) {
|
|
return super.addHandler(handler, ValueChangeEvent.getType());
|
|
}
|
|
|
|
public void setEnabled(final boolean on) {
|
|
if (on) {
|
|
setEnabledCounter++;
|
|
} else {
|
|
setEnabledCounter--;
|
|
}
|
|
if (on && setEnabledCounter == 0 || !on) {
|
|
for (Widget w : (HasWidgets) getWidget()) {
|
|
if (w instanceof FocusWidget) {
|
|
((FocusWidget) w).setEnabled(on);
|
|
}
|
|
}
|
|
toggleEnabledStatus(on);
|
|
};
|
|
}
|
|
|
|
public void setEnableSmallFileFeatures(final boolean on) {
|
|
enableSmallFileFeatures = on;
|
|
if (enableSmallFileFeatures) {
|
|
syntaxHighlighting.setValue(getValue().isSyntaxHighlighting());
|
|
} else {
|
|
syntaxHighlighting.setValue(false);
|
|
}
|
|
toggleEnabledStatus(update.isEnabled());
|
|
}
|
|
|
|
public void setEnableIntralineDifference(final boolean on) {
|
|
enableIntralineDifference = on;
|
|
if (enableIntralineDifference) {
|
|
intralineDifference.setValue(getValue().isIntralineDifference());
|
|
} else {
|
|
intralineDifference.setValue(false);
|
|
}
|
|
toggleEnabledStatus(update.isEnabled());
|
|
}
|
|
|
|
private void toggleEnabledStatus(final boolean on) {
|
|
intralineDifference.setEnabled(on & enableIntralineDifference);
|
|
syntaxHighlighting.setEnabled(on & enableSmallFileFeatures);
|
|
|
|
final String title =
|
|
enableSmallFileFeatures ? null : PatchUtil.C.disabledOnLargeFiles();
|
|
syntaxHighlighting.setTitle(title);
|
|
}
|
|
|
|
public CheckBox getReviewedCheckBox() {
|
|
return reviewed;
|
|
}
|
|
|
|
public AccountDiffPreference getValue() {
|
|
return listenablePrefs.get();
|
|
}
|
|
|
|
public void setValue(final AccountDiffPreference dp) {
|
|
listenablePrefs.set(dp);
|
|
display();
|
|
}
|
|
|
|
protected void display() {
|
|
final AccountDiffPreference dp = getValue();
|
|
setIgnoreWhitespace(dp.getIgnoreWhitespace());
|
|
if (enableSmallFileFeatures) {
|
|
syntaxHighlighting.setValue(dp.isSyntaxHighlighting());
|
|
} else {
|
|
syntaxHighlighting.setValue(false);
|
|
}
|
|
setContext(dp.getContext());
|
|
|
|
tabWidth.setIntValue(dp.getTabSize());
|
|
colWidth.setIntValue(dp.getLineLength());
|
|
intralineDifference.setValue(dp.isIntralineDifference());
|
|
whitespaceErrors.setValue(dp.isShowWhitespaceErrors());
|
|
showTabs.setValue(dp.isShowTabs());
|
|
skipDeleted.setValue(dp.isSkipDeleted());
|
|
skipUncommented.setValue(dp.isSkipUncommented());
|
|
expandAllComments.setValue(dp.isExpandAllComments());
|
|
}
|
|
|
|
@UiHandler("update")
|
|
void onUpdate(ClickEvent event) {
|
|
update();
|
|
}
|
|
|
|
private void update() {
|
|
if (colWidth.getIntValue() <= 0) {
|
|
new ErrorDialog(PatchUtil.C.illegalNumberOfColumns()).center();
|
|
return;
|
|
}
|
|
|
|
AccountDiffPreference dp = new AccountDiffPreference(getValue());
|
|
dp.setIgnoreWhitespace(getIgnoreWhitespace());
|
|
dp.setContext(getContext());
|
|
dp.setTabSize(tabWidth.getIntValue());
|
|
dp.setLineLength(colWidth.getIntValue());
|
|
dp.setSyntaxHighlighting(syntaxHighlighting.getValue());
|
|
dp.setIntralineDifference(intralineDifference.getValue());
|
|
dp.setShowWhitespaceErrors(whitespaceErrors.getValue());
|
|
dp.setShowTabs(showTabs.getValue());
|
|
dp.setSkipDeleted(skipDeleted.getValue());
|
|
dp.setSkipUncommented(skipUncommented.getValue());
|
|
dp.setExpandAllComments(expandAllComments.getValue());
|
|
|
|
listenablePrefs.set(dp);
|
|
|
|
if (Gerrit.isSignedIn()) {
|
|
persistDiffPreferences();
|
|
}
|
|
}
|
|
|
|
private void persistDiffPreferences() {
|
|
setEnabled(false);
|
|
Util.ACCOUNT_SVC.changeDiffPreferences(getValue(),
|
|
new GerritCallback<VoidResult>() {
|
|
@Override
|
|
public void onSuccess(VoidResult result) {
|
|
Gerrit.setAccountDiffPreference(getValue());
|
|
setEnabled(true);
|
|
}
|
|
|
|
@Override
|
|
public void onFailure(Throwable caught) {
|
|
setEnabled(true);
|
|
}
|
|
});
|
|
}
|
|
|
|
private void initIgnoreWhitespace(ListBox ws) {
|
|
ws.addItem(PatchUtil.C.whitespaceIGNORE_NONE(), //
|
|
Whitespace.IGNORE_NONE.name());
|
|
ws.addItem(PatchUtil.C.whitespaceIGNORE_SPACE_AT_EOL(), //
|
|
Whitespace.IGNORE_SPACE_AT_EOL.name());
|
|
ws.addItem(PatchUtil.C.whitespaceIGNORE_SPACE_CHANGE(), //
|
|
Whitespace.IGNORE_SPACE_CHANGE.name());
|
|
ws.addItem(PatchUtil.C.whitespaceIGNORE_ALL_SPACE(), //
|
|
Whitespace.IGNORE_ALL_SPACE.name());
|
|
}
|
|
|
|
private void initContext(ListBox context) {
|
|
for (final short v : AccountDiffPreference.CONTEXT_CHOICES) {
|
|
final String label;
|
|
if (v == AccountDiffPreference.WHOLE_FILE_CONTEXT) {
|
|
label = Util.C.contextWholeFile();
|
|
} else {
|
|
label = Util.M.lines(v);
|
|
}
|
|
context.addItem(label, String.valueOf(v));
|
|
}
|
|
}
|
|
|
|
private Whitespace getIgnoreWhitespace() {
|
|
final int sel = ignoreWhitespace.getSelectedIndex();
|
|
if (0 <= sel) {
|
|
return Whitespace.valueOf(ignoreWhitespace.getValue(sel));
|
|
}
|
|
return getValue().getIgnoreWhitespace();
|
|
}
|
|
|
|
private void setIgnoreWhitespace(Whitespace s) {
|
|
for (int i = 0; i < ignoreWhitespace.getItemCount(); i++) {
|
|
if (ignoreWhitespace.getValue(i).equals(s.name())) {
|
|
ignoreWhitespace.setSelectedIndex(i);
|
|
return;
|
|
}
|
|
}
|
|
ignoreWhitespace.setSelectedIndex(0);
|
|
}
|
|
|
|
private short getContext() {
|
|
final int sel = context.getSelectedIndex();
|
|
if (0 <= sel) {
|
|
return Short.parseShort(context.getValue(sel));
|
|
}
|
|
return (short) getValue().getContext();
|
|
}
|
|
|
|
private void setContext(int ctx) {
|
|
String v = String.valueOf(ctx);
|
|
for (int i = 0; i < context.getItemCount(); i++) {
|
|
if (context.getValue(i).equals(v)) {
|
|
context.setSelectedIndex(i);
|
|
return;
|
|
}
|
|
}
|
|
context.setSelectedIndex(0);
|
|
}
|
|
}
|