Skip to content
This repository was archived by the owner on Sep 6, 2021. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 20 commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
1274227
Editor Preferences Validation - interim checkin
redmunds Mar 12, 2014
1b1a604
start ValidationUtils module
redmunds Mar 12, 2014
7f721fc
Merge remote-tracking branch 'origin/master' into randy/issue-7020
redmunds Mar 12, 2014
8d5482e
convert remaining editor prefs
redmunds Mar 13, 2014
bc7b0bf
cleanup
redmunds Mar 13, 2014
d0ef02f
fix range limit of zero
redmunds Mar 13, 2014
3719aa2
more tests; cleanup comments
redmunds Mar 13, 2014
cfb0cce
implement preference validator
redmunds Mar 13, 2014
3428312
update for preference validator
redmunds Mar 13, 2014
f476ac5
changes for code review
redmunds Mar 13, 2014
8268997
more code review changes
redmunds Mar 13, 2014
fd72a4f
fix unit test; use ValidationUtils for validating\!
redmunds Mar 14, 2014
0b441d9
fix validation
redmunds Mar 14, 2014
5d22e35
add unit test for validator
redmunds Mar 14, 2014
0824ff6
implement validator on set
redmunds Mar 14, 2014
a32a39b
code cleanup
redmunds Mar 14, 2014
b6fb768
add jsdoc info
redmunds Mar 14, 2014
3a158fa
merge latest master
redmunds Mar 18, 2014
35b18b8
add test for negative space units
redmunds Mar 18, 2014
2418344
restore original API as deprecated
redmunds Mar 18, 2014
bc71a60
return both and from set()
redmunds Mar 20, 2014
a845bab
merge latest master
redmunds Mar 20, 2014
d2d4c72
fix tests
redmunds Mar 20, 2014
9883d3c
merge with latest master
redmunds Mar 23, 2014
835bc45
use lodash to generate validator function
redmunds Mar 23, 2014
2062a78
revert to old API with a few small changes
redmunds Mar 27, 2014
3d82669
jsdoc updates
redmunds Mar 27, 2014
aca8a81
Merge remote-tracking branch 'origin/master' into randy/issue-7020
redmunds Mar 27, 2014
76a5b91
fix whitespace
redmunds Mar 28, 2014
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/editor/CSSInlineEditor.js
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ define(function (require, exports, module) {
*/
function _addRule(selectorName, inlineEditor, path) {
DocumentManager.getDocumentForPath(path).done(function (styleDoc) {
var newRuleInfo = CSSUtils.addRuleToDocument(styleDoc, selectorName, Editor.getUseTabChar(), Editor.getSpaceUnits());
var newRuleInfo = CSSUtils.addRuleToDocument(styleDoc, selectorName, inlineEditor.getUseTabChar(), inlineEditor.getSpaceUnits());
inlineEditor.addAndSelectRange(selectorName, styleDoc, newRuleInfo.range.from.line, newRuleInfo.range.to.line);
inlineEditor.editor.setCursorPos(newRuleInfo.pos.line, newRuleInfo.pos.ch);
});
Expand Down
186 changes: 176 additions & 10 deletions src/editor/Editor.js
Original file line number Diff line number Diff line change
Expand Up @@ -67,12 +67,14 @@ define(function (require, exports, module) {
var AnimationUtils = require("utils/AnimationUtils"),
Async = require("utils/Async"),
CodeMirror = require("thirdparty/CodeMirror2/lib/codemirror"),
DeprecationWarning = require("utils/DeprecationWarning"),
Menus = require("command/Menus"),
PerfUtils = require("utils/PerfUtils"),
PreferencesManager = require("preferences/PreferencesManager"),
Strings = require("strings"),
TextRange = require("document/TextRange").TextRange,
TokenUtils = require("utils/TokenUtils"),
ValidationUtils = require("utils/ValidationUtils"),
ViewUtils = require("utils/ViewUtils"),
_ = require("thirdparty/lodash");

Expand All @@ -91,6 +93,14 @@ define(function (require, exports, module) {

var cmOptions = {};

/** @type {number} Constants */
var MIN_SPACE_UNITS = 0,
MIN_TAB_SIZE = 1,
DEFAULT_SPACE_UNITS = 4,
DEFAULT_TAB_SIZE = 4,
MAX_SPACE_UNITS = 10,
MAX_TAB_SIZE = 10;

// Mappings from Brackets preferences to CodeMirror options
cmOptions[CLOSE_BRACKETS] = "autoCloseBrackets";
cmOptions[CLOSE_TAGS] = "autoCloseTags";
Expand All @@ -109,9 +119,17 @@ define(function (require, exports, module) {
PreferencesManager.definePreference(SHOW_LINE_NUMBERS, "boolean", true);
PreferencesManager.definePreference(SMART_INDENT, "boolean", true);
PreferencesManager.definePreference(SOFT_TABS, "boolean", true);
PreferencesManager.definePreference(SPACE_UNITS, "number", 4);
PreferencesManager.definePreference(SPACE_UNITS, "number", DEFAULT_SPACE_UNITS, {
validator: function (value) {
return ValidationUtils.isIntegerInRange(value, MIN_SPACE_UNITS, MAX_SPACE_UNITS);
}
});
PreferencesManager.definePreference(STYLE_ACTIVE_LINE, "boolean", false);
PreferencesManager.definePreference(TAB_SIZE, "number", 4);
PreferencesManager.definePreference(TAB_SIZE, "number", DEFAULT_TAB_SIZE, {
validator: function (value) {
return ValidationUtils.isIntegerInRange(value, MIN_TAB_SIZE, MAX_TAB_SIZE);
}
});
PreferencesManager.definePreference(USE_TAB_CHAR, "boolean", false);
PreferencesManager.definePreference(WORD_WRAP, "boolean", true);

Expand Down Expand Up @@ -884,7 +902,7 @@ define(function (require, exports, module) {
*/
Editor.prototype.getColOffset = function (pos) {
var line = this._codeMirror.getRange({line: pos.line, ch: 0}, pos),
tabSize = Editor.getTabSize(),
tabSize = this.getTabSize(),
column = 0,
i;

Expand Down Expand Up @@ -1878,103 +1896,251 @@ define(function (require, exports, module) {
// Global settings that affect Editor instances that share the same preference locations

/**
* @deprecated Use Editor instance method instead
* Sets whether to use tab characters (vs. spaces) when inserting new text.
* Affects any editors that share the same preference location.
* @param {boolean} value
*/
Editor.setUseTabChar = function (value) {
DeprecationWarning.deprecationWarning("Editor.setUseTabChar was called, use Editor.prototype.setUseTabChar (on Editor instance) instead.");
PreferencesManager.set(USE_TAB_CHAR, value);
};

/** @type {boolean} Gets whether the current editor uses tab characters (vs. spaces) when inserting new text */
/**
* @deprecated Use Editor instance method instead
* @type {boolean} Gets whether the current editor uses tab characters (vs. spaces) when inserting new text
*/
Editor.getUseTabChar = function () {
DeprecationWarning.deprecationWarning("Editor.getUseTabChar was called, use Editor.prototype.getUseTabChar (on Editor instance) instead.");
return PreferencesManager.get(USE_TAB_CHAR);
};

/**
* @deprecated Use Editor instance method instead
* Sets tab character width.
* Affects any editors that share the same preference location.
* @param {number} value
*/
Editor.setTabSize = function (value) {
DeprecationWarning.deprecationWarning("Editor.setTabSize was called, use Editor.prototype.setTabSize (on Editor instance) instead.");
PreferencesManager.set(TAB_SIZE, value);
};

/** @type {number} Get indent unit */
/**
* @deprecated Use Editor instance method instead
* @type {number} Get indent unit
*/
Editor.getTabSize = function () {
DeprecationWarning.deprecationWarning("Editor.getTabSize was called, use Editor.prototype.getTabSize (on Editor instance) instead.");
return PreferencesManager.get(TAB_SIZE);
};

/**
* @deprecated Use Editor instance method instead
* Sets indentation width.
* Affects any editors that share the same preference location.
* @param {number} value
*/
Editor.setSpaceUnits = function (value) {
DeprecationWarning.deprecationWarning("Editor.setSpaceUnits was called, use Editor.prototype.setSpaceUnits (on Editor instance) instead.");
PreferencesManager.set(SPACE_UNITS, value);
};

/** @type {number} Get indentation width */
/**
* @deprecated Use Editor instance method instead
* @type {number} Get indentation width
*/
Editor.getSpaceUnits = function () {
DeprecationWarning.deprecationWarning("Editor.getSpaceUnits was called, use Editor.prototype.getSpaceUnits (on Editor instance) instead.");
return PreferencesManager.get(SPACE_UNITS);
};

/**
* @deprecated Use Editor instance method instead
* Sets the auto close brackets.
* Affects any editors that share the same preference location.
* @param {boolean} value
*/
Editor.setCloseBrackets = function (value) {
DeprecationWarning.deprecationWarning("Editor.setCloseBrackets was called, use Editor.prototype.setCloseBrackets (on Editor instance) instead.");
PreferencesManager.set(CLOSE_BRACKETS, value);
};

/** @type {boolean} Gets whether the current editor uses auto close brackets */
/**
* @deprecated Use Editor instance method instead
* @type {boolean} Gets whether the current editor uses auto close brackets
*/
Editor.getCloseBrackets = function () {
DeprecationWarning.deprecationWarning("Editor.getCloseBrackets was called, use Editor.prototype.getCloseBrackets (on Editor instance) instead.");
return PreferencesManager.get(CLOSE_BRACKETS);
};

/**
* @deprecated Use Editor instance method instead
* Sets show line numbers option.
* Affects any editors that share the same preference location.
* @param {boolean} value
*/
Editor.setShowLineNumbers = function (value) {
DeprecationWarning.deprecationWarning("Editor.setShowLineNumbers was called, use Editor.prototype.setShowLineNumbers (on Editor instance) instead.");
PreferencesManager.set(SHOW_LINE_NUMBERS, value);
};

/** @type {boolean} Returns true if show line numbers is enabled for the current editor */
/**
* @deprecated Use Editor instance method instead
* @type {boolean} Returns true if show line numbers is enabled for the current editor
*/
Editor.getShowLineNumbers = function () {
DeprecationWarning.deprecationWarning("Editor.getShowLineNumbers was called, use Editor.prototype.getShowLineNumbers (on Editor instance) instead.");
return PreferencesManager.get(SHOW_LINE_NUMBERS);
};

/**
* @deprecated Use Editor instance method instead
* Sets show active line option.
* Affects any editors that share the same preference location.
* @param {boolean} value
*/
Editor.setShowActiveLine = function (value) {
DeprecationWarning.deprecationWarning("Editor.setShowActiveLine was called, use Editor.prototype.setShowActiveLine (on Editor instance) instead.");
PreferencesManager.set(STYLE_ACTIVE_LINE, value);
};

/** @type {boolean} Returns true if show active line is enabled for the current editor */
/**
* @deprecated Use Editor instance method instead
* @type {boolean} Returns true if show active line is enabled for the current editor
*/
Editor.getShowActiveLine = function () {
DeprecationWarning.deprecationWarning("Editor.getShowActiveLine was called, use Editor.prototype.getShowActiveLine (on Editor instance) instead.");
return PreferencesManager.get(STYLE_ACTIVE_LINE);
};

/**
* @deprecated Use Editor instance method instead
* Sets word wrap option.
* Affects any editors that share the same preference location.
* @param {boolean} value
*/
Editor.setWordWrap = function (value) {
DeprecationWarning.deprecationWarning("Editor.setWordWrap was called, use Editor.prototype.setWordWrap (on Editor instance) instead.");
PreferencesManager.set(WORD_WRAP, value);
};

/** @type {boolean} Returns true if word wrap is enabled for the current editor */
/**
* @deprecated Use Editor instance method instead
* @type {boolean} Returns true if word wrap is enabled for the current editor
*/
Editor.getWordWrap = function () {
DeprecationWarning.deprecationWarning("Editor.getWordWrap was called, use Editor.prototype.getWordWrap (on Editor instance) instead.");
return PreferencesManager.get(WORD_WRAP);
};


/**
* Sets whether to use tab characters (vs. spaces) when inserting new text.
* Affects any editors that share the same preference location.
* @param {boolean} value
* @return {boolean} true if value was set
*/
Editor.prototype.setUseTabChar = function (value) {
return PreferencesManager.set(USE_TAB_CHAR, value);
};

/** @type {boolean} Gets whether the current editor uses tab characters (vs. spaces) when inserting new text */
Editor.prototype.getUseTabChar = function () {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are these moving from Editor to Editor.prototype? We'd have to look at the backwards compatibility implications of this.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I did this so we have this.document.file.fullPath.

Yes, I had to rework the code in EditorStatusBar. One implication (of the new preferences changes in general, and not this change in particular) is that the status bar now updates for the focused editor. So, if you happen to have different prefs for .html and .css files, then when you switch focus between main and inline css editor, the prefs in status bar with change for the current file being edited. Or should status bar always show prefs for main editor?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That seems like a positive change to me.

Still, this is a change to public API, which means we should probably deprecate the old API and not just remove it. You could use the Brackets Extension Grabber to see if there are any extensions that call Editor.set* or Editor.get*, or you could just add deprecation warnings.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@redmunds The status bar already behaves this way (e.g. the language indicator updates). Are you saying there was a bug where the indent indicator didn't update on focus change before?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just tested in master and the status bar already updates the indent indicator too when focus switches between the inline editor and the full-size editor -- so the behavior isn't changing here.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@peterflynn Agreed. Thanks for doing the search!

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just tested in master and the status bar already updates the indent indicator too when focus switches between the inline editor and the full-size editor -- so the behavior isn't changing here.

Yes, the PreferencesManager uses the current file when a file is not passed as a param, but I can see that being a problem with split view or multiple window support.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I will restore the original API. Any tips or sample code I can look at for displaying "deprecated" messages to console?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Original API restored and deprecated.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@redmunds Good points. Pretty sure the old static APIs would still work fine with split views as well, for the same reason inlines do today (activeEditor changes with focus, and there's only one statusbar shared between the views)... but it's definitely much cleaner to be explicitly calling out an Editor instance and thus explicitly requesting a file-specific pref.

return PreferencesManager.get(USE_TAB_CHAR, this.document.file.fullPath);
};

/**
* Sets tab character width.
* Affects any editors that share the same preference location.
* @param {number} value
* @return {boolean} true if value was set
*/
Editor.prototype.setTabSize = function (value) {
return PreferencesManager.set(TAB_SIZE, value);
};

/** @type {number} Get tab character width */
Editor.prototype.getTabSize = function () {
return PreferencesManager.get(TAB_SIZE, this.document.file.fullPath);
};

/**
* Sets indentation width.
* Affects any editors that share the same preference location.
* @param {number} value
* @return {boolean} true if value was set
*/
Editor.prototype.setSpaceUnits = function (value) {
return PreferencesManager.set(SPACE_UNITS, value);
};

/** @type {number} Get indentation width */
Editor.prototype.getSpaceUnits = function () {
return PreferencesManager.get(SPACE_UNITS, this.document.file.fullPath);
};

/**
* Sets the auto close brackets.
* Affects any editors that share the same preference location.
* @param {boolean} value
* @return {boolean} true if value was set
*/
Editor.prototype.setCloseBrackets = function (value) {
return PreferencesManager.set(CLOSE_BRACKETS, value);
};

/** @type {boolean} Gets whether the current editor uses auto close brackets */
Editor.prototype.getCloseBrackets = function () {
return PreferencesManager.get(CLOSE_BRACKETS, this.document.file.fullPath);
};

/**
* Sets show line numbers option.
* Affects any editors that share the same preference location.
* @param {boolean} value
* @return {boolean} true if value was set
*/
Editor.prototype.setShowLineNumbers = function (value) {
return PreferencesManager.set(SHOW_LINE_NUMBERS, value);
};

/** @type {boolean} Returns true if show line numbers is enabled for the current editor */
Editor.prototype.getShowLineNumbers = function () {
return PreferencesManager.get(SHOW_LINE_NUMBERS, this.document.file.fullPath);
};

/**
* Sets show active line option.
* Affects any editors that share the same preference location.
* @param {boolean} value
* @return {boolean} true if value was set
*/
Editor.prototype.setShowActiveLine = function (value) {
return PreferencesManager.set(STYLE_ACTIVE_LINE, value);
};

/** @type {boolean} Returns true if show active line is enabled for the current editor */
Editor.prototype.getShowActiveLine = function () {
return PreferencesManager.get(STYLE_ACTIVE_LINE, this.document.file.fullPath);
};

/**
* Sets word wrap option.
* Affects any editors that share the same preference location.
* @param {boolean} value
* @return {boolean} true if value was set
*/
Editor.prototype.setWordWrap = function (value) {
return PreferencesManager.set(WORD_WRAP, value);
};

/** @type {boolean} Returns true if word wrap is enabled for the current editor */
Editor.prototype.getWordWrap = function () {
return PreferencesManager.get(WORD_WRAP, this.document.file.fullPath);
};

// Set up listeners for preference changes
editorOptions.forEach(function (prefName) {
PreferencesManager.on("change", prefName, function () {
Expand Down
Loading