| // Copyright (C) 2014 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.editor; |
| |
| import com.google.gerrit.client.Gerrit; |
| import com.google.gerrit.client.account.AccountApi; |
| import com.google.gerrit.client.account.EditPreferences; |
| import com.google.gerrit.client.rpc.GerritCallback; |
| import com.google.gerrit.client.ui.NpIntTextBox; |
| import com.google.gerrit.extensions.client.EditPreferencesInfo; |
| import com.google.gerrit.extensions.client.KeyMapType; |
| import com.google.gerrit.extensions.client.Theme; |
| import com.google.gwt.core.client.GWT; |
| import com.google.gwt.dom.client.Element; |
| import com.google.gwt.dom.client.Style.Visibility; |
| import com.google.gwt.event.dom.client.ChangeEvent; |
| import com.google.gwt.event.dom.client.ClickEvent; |
| import com.google.gwt.event.logical.shared.ValueChangeEvent; |
| import com.google.gwt.resources.client.CssResource; |
| 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.Anchor; |
| import com.google.gwt.user.client.ui.Button; |
| import com.google.gwt.user.client.ui.Composite; |
| import com.google.gwt.user.client.ui.HTMLPanel; |
| import com.google.gwt.user.client.ui.ListBox; |
| import com.google.gwt.user.client.ui.PopupPanel; |
| import com.google.gwt.user.client.ui.ToggleButton; |
| import com.google.gwt.user.client.ui.UIObject; |
| import net.codemirror.theme.ThemeLoader; |
| |
| /** Displays current edit preferences. */ |
| public class EditPreferencesBox extends Composite { |
| interface Binder extends UiBinder<HTMLPanel, EditPreferencesBox> {} |
| |
| private static final Binder uiBinder = GWT.create(Binder.class); |
| |
| public interface Style extends CssResource { |
| String dialog(); |
| } |
| |
| private final EditScreen view; |
| private EditPreferences prefs; |
| |
| @UiField Style style; |
| @UiField Element header; |
| @UiField Anchor close; |
| @UiField NpIntTextBox tabWidth; |
| @UiField NpIntTextBox lineLength; |
| @UiField NpIntTextBox indentUnit; |
| @UiField NpIntTextBox cursorBlinkRate; |
| @UiField ToggleButton topMenu; |
| @UiField ToggleButton syntaxHighlighting; |
| @UiField ToggleButton showTabs; |
| @UiField ToggleButton whitespaceErrors; |
| @UiField ToggleButton lineNumbers; |
| @UiField ToggleButton matchBrackets; |
| @UiField ToggleButton lineWrapping; |
| @UiField ToggleButton indentWithTabs; |
| @UiField ToggleButton autoCloseBrackets; |
| @UiField ToggleButton showBase; |
| @UiField ListBox theme; |
| @UiField ListBox keyMap; |
| @UiField Button apply; |
| @UiField Button save; |
| |
| public EditPreferencesBox(EditScreen view) { |
| this.view = view; |
| initWidget(uiBinder.createAndBindUi(this)); |
| initTheme(); |
| initKeyMapType(); |
| |
| if (view == null) { |
| UIObject.setVisible(header, false); |
| apply.getElement().getStyle().setVisibility(Visibility.HIDDEN); |
| } |
| } |
| |
| public Style getStyle() { |
| return style; |
| } |
| |
| public void set(EditPreferences prefs) { |
| this.prefs = prefs; |
| |
| tabWidth.setIntValue(prefs.tabSize()); |
| lineLength.setIntValue(prefs.lineLength()); |
| indentUnit.setIntValue(prefs.indentUnit()); |
| cursorBlinkRate.setIntValue(prefs.cursorBlinkRate()); |
| topMenu.setValue(!prefs.hideTopMenu()); |
| syntaxHighlighting.setValue(prefs.syntaxHighlighting()); |
| showTabs.setValue(prefs.showTabs()); |
| whitespaceErrors.setValue(prefs.showWhitespaceErrors()); |
| lineNumbers.setValue(prefs.hideLineNumbers()); |
| matchBrackets.setValue(prefs.matchBrackets()); |
| lineWrapping.setValue(prefs.lineWrapping()); |
| indentWithTabs.setValue(prefs.indentWithTabs()); |
| autoCloseBrackets.setValue(prefs.autoCloseBrackets()); |
| showBase.setValue(prefs.showBase()); |
| setTheme(prefs.theme()); |
| setKeyMapType(prefs.keyMapType()); |
| } |
| |
| @UiHandler("tabWidth") |
| void onTabWidth(ValueChangeEvent<String> e) { |
| String v = e.getValue(); |
| if (v != null && v.length() > 0) { |
| prefs.tabSize(Math.max(1, Integer.parseInt(v))); |
| if (view != null) { |
| view.setOption("tabSize", v); |
| } |
| } |
| } |
| |
| @UiHandler("lineLength") |
| void onLineLength(ValueChangeEvent<String> e) { |
| String v = e.getValue(); |
| if (v != null && v.length() > 0) { |
| prefs.lineLength(Math.max(1, Integer.parseInt(v))); |
| if (view != null) { |
| view.setLineLength(prefs.lineLength()); |
| } |
| } |
| } |
| |
| @UiHandler("indentUnit") |
| void onIndentUnit(ValueChangeEvent<String> e) { |
| String v = e.getValue(); |
| if (v != null && v.length() > 0) { |
| prefs.indentUnit(Math.max(0, Integer.parseInt(v))); |
| if (view != null) { |
| view.setIndentUnit(prefs.indentUnit()); |
| } |
| } |
| } |
| |
| @UiHandler("cursorBlinkRate") |
| void onCursoBlinkRate(ValueChangeEvent<String> e) { |
| String v = e.getValue(); |
| if (v != null && v.length() > 0) { |
| // A negative value hides the cursor entirely: |
| // don't let user shoot himself in the foot. |
| prefs.cursorBlinkRate(Math.max(0, Integer.parseInt(v))); |
| if (view != null) { |
| view.setOption("cursorBlinkRate", prefs.cursorBlinkRate()); |
| } |
| } |
| } |
| |
| @UiHandler("topMenu") |
| void onTopMenu(ValueChangeEvent<Boolean> e) { |
| prefs.hideTopMenu(!e.getValue()); |
| if (view != null) { |
| Gerrit.setHeaderVisible(!prefs.hideTopMenu()); |
| view.adjustHeight(); |
| } |
| } |
| |
| @UiHandler("showTabs") |
| void onShowTabs(ValueChangeEvent<Boolean> e) { |
| prefs.showTabs(e.getValue()); |
| if (view != null) { |
| view.setShowTabs(prefs.showTabs()); |
| } |
| } |
| |
| @UiHandler("whitespaceErrors") |
| void onshowTrailingSpace(ValueChangeEvent<Boolean> e) { |
| prefs.showWhitespaceErrors(e.getValue()); |
| if (view != null) { |
| view.setShowWhitespaceErrors(prefs.showWhitespaceErrors()); |
| } |
| } |
| |
| @UiHandler("lineNumbers") |
| void onLineNumbers(ValueChangeEvent<Boolean> e) { |
| prefs.hideLineNumbers(e.getValue()); |
| if (view != null) { |
| view.setShowLineNumbers(prefs.hideLineNumbers()); |
| } |
| } |
| |
| @UiHandler("syntaxHighlighting") |
| void onSyntaxHighlighting(ValueChangeEvent<Boolean> e) { |
| prefs.syntaxHighlighting(e.getValue()); |
| if (view != null) { |
| view.setSyntaxHighlighting(prefs.syntaxHighlighting()); |
| } |
| } |
| |
| @UiHandler("matchBrackets") |
| void onMatchBrackets(ValueChangeEvent<Boolean> e) { |
| prefs.matchBrackets(e.getValue()); |
| if (view != null) { |
| view.setOption("matchBrackets", prefs.matchBrackets()); |
| } |
| } |
| |
| @UiHandler("lineWrapping") |
| void onLineWrapping(ValueChangeEvent<Boolean> e) { |
| prefs.lineWrapping(e.getValue()); |
| if (view != null) { |
| view.getEditor().setOption("lineWrapping", prefs.lineWrapping()); |
| } |
| } |
| |
| @UiHandler("indentWithTabs") |
| void onIndentWithTabs(ValueChangeEvent<Boolean> e) { |
| prefs.indentWithTabs(e.getValue()); |
| if (view != null) { |
| view.getEditor().setOption("indentWithTabs", prefs.indentWithTabs()); |
| } |
| } |
| |
| @UiHandler("autoCloseBrackets") |
| void onCloseBrackets(ValueChangeEvent<Boolean> e) { |
| prefs.autoCloseBrackets(e.getValue()); |
| if (view != null) { |
| view.getEditor().setOption("autoCloseBrackets", prefs.autoCloseBrackets()); |
| } |
| } |
| |
| @UiHandler("showBase") |
| void onShowBase(ValueChangeEvent<Boolean> e) { |
| Boolean value = e.getValue(); |
| prefs.showBase(value); |
| if (view != null) { |
| view.showBase.setValue(value, true); |
| } |
| } |
| |
| @UiHandler("theme") |
| void onTheme(@SuppressWarnings("unused") ChangeEvent e) { |
| final Theme newTheme = Theme.valueOf(theme.getValue(theme.getSelectedIndex())); |
| prefs.theme(newTheme); |
| if (view != null) { |
| ThemeLoader.loadTheme( |
| newTheme, |
| new GerritCallback<Void>() { |
| @Override |
| public void onSuccess(Void result) { |
| view.setTheme(newTheme); |
| } |
| }); |
| } |
| } |
| |
| @UiHandler("keyMap") |
| void onKeyMap(@SuppressWarnings("unused") ChangeEvent e) { |
| KeyMapType keyMapType = KeyMapType.valueOf(keyMap.getValue(keyMap.getSelectedIndex())); |
| prefs.keyMapType(keyMapType); |
| if (view != null) { |
| view.setOption("keyMap", keyMapType.name().toLowerCase()); |
| } |
| } |
| |
| @UiHandler("apply") |
| void onApply(@SuppressWarnings("unused") ClickEvent e) { |
| close(); |
| } |
| |
| @UiHandler("save") |
| void onSave(@SuppressWarnings("unused") ClickEvent e) { |
| AccountApi.putEditPreferences( |
| prefs, |
| new GerritCallback<EditPreferences>() { |
| @Override |
| public void onSuccess(EditPreferences p) { |
| Gerrit.setEditPreferences(p.copyTo(new EditPreferencesInfo())); |
| } |
| }); |
| close(); |
| } |
| |
| @UiHandler("close") |
| void onClose(ClickEvent e) { |
| e.preventDefault(); |
| close(); |
| } |
| |
| private void close() { |
| ((PopupPanel) getParent()).hide(); |
| } |
| |
| private void setTheme(Theme v) { |
| String name = v != null ? v.name() : Theme.DEFAULT.name(); |
| for (int i = 0; i < theme.getItemCount(); i++) { |
| if (theme.getValue(i).equals(name)) { |
| theme.setSelectedIndex(i); |
| return; |
| } |
| } |
| theme.setSelectedIndex(0); |
| } |
| |
| private void initTheme() { |
| for (Theme t : Theme.values()) { |
| theme.addItem(t.name().toLowerCase(), t.name()); |
| } |
| } |
| |
| private void setKeyMapType(KeyMapType v) { |
| String name = v != null ? v.name() : KeyMapType.DEFAULT.name(); |
| for (int i = 0; i < keyMap.getItemCount(); i++) { |
| if (keyMap.getValue(i).equals(name)) { |
| keyMap.setSelectedIndex(i); |
| return; |
| } |
| } |
| keyMap.setSelectedIndex(0); |
| } |
| |
| private void initKeyMapType() { |
| for (KeyMapType t : KeyMapType.values()) { |
| keyMap.addItem(t.name().toLowerCase(), t.name()); |
| } |
| } |
| } |