This commit is contained in:
Cassie Tarakajian 2016-12-06 21:33:12 -05:00
parent 29de5fce55
commit 49bdd9377f

View file

@ -40,11 +40,9 @@ class Editor extends React.Component {
this.widgets = []; this.widgets = [];
this._cm = CodeMirror(this.refs.container, { // eslint-disable-line this._cm = CodeMirror(this.refs.container, { // eslint-disable-line
theme: `p5-${this.props.theme}`, theme: `p5-${this.props.theme}`,
value: this.props.file.content,
lineNumbers: true, lineNumbers: true,
styleActiveLine: true, styleActiveLine: true,
inputStyle: 'contenteditable', inputStyle: 'contenteditable',
mode: 'javascript',
lineWrapping: false, lineWrapping: false,
fixedGutter: false, fixedGutter: false,
gutters: ['CodeMirror-lint-markers'], gutters: ['CodeMirror-lint-markers'],
@ -64,6 +62,9 @@ class Editor extends React.Component {
} }
}); });
this.initializeDocuments(this.props.files);
this._cm.swapDoc(this._docs[this.props.file.id]);
this._cm.on('change', debounce(() => { this._cm.on('change', debounce(() => {
this.props.setUnsavedChanges(true); this.props.setUnsavedChanges(true);
this.props.updateFileContent(this.props.file.name, this._cm.getValue()); this.props.updateFileContent(this.props.file.name, this._cm.getValue());
@ -89,10 +90,20 @@ class Editor extends React.Component {
this._cm.setOption('tabSize', this.props.indentationAmount); this._cm.setOption('tabSize', this.props.indentationAmount);
} }
componentWillUpdate(nextProps) {
// check if files have changed
if (this.props.files[0].id !== nextProps.files[0].id) {
// then need to make CodeMirror documents
this.initializeDocuments(nextProps.files);
}
}
componentDidUpdate(prevProps) { componentDidUpdate(prevProps) {
if (this.props.file.content !== prevProps.file.content && if (this.props.file.content !== prevProps.file.content &&
this.props.file.content !== this._cm.getValue()) { this.props.file.content !== this._cm.getValue()) {
this._cm.setValue(this.props.file.content); // eslint-disable-line no-underscore-dangle const oldDoc = this._cm.swapDoc(this._docs[this.props.file.id]);
this._docs[prevProps.file.id] = oldDoc;
this._cm.focus();
if (!prevProps.unsavedChanges) { if (!prevProps.unsavedChanges) {
setTimeout(() => this.props.setUnsavedChanges(false), 400); setTimeout(() => this.props.setUnsavedChanges(false), 400);
} }
@ -106,20 +117,6 @@ class Editor extends React.Component {
if (this.props.isTabIndent !== prevProps.isTabIndent) { if (this.props.isTabIndent !== prevProps.isTabIndent) {
this._cm.setOption('indentWithTabs', this.props.isTabIndent); this._cm.setOption('indentWithTabs', this.props.isTabIndent);
} }
if (this.props.file.name !== prevProps.name) {
if (this.props.file.name.match(/.+\.js$/i)) {
this._cm.setOption('mode', 'javascript');
} else if (this.props.file.name.match(/.+\.css$/i)) {
this._cm.setOption('mode', 'css');
} else if (this.props.file.name.match(/.+\.html$/i)) {
this._cm.setOption('mode', 'htmlmixed');
} else if (this.props.file.name.match(/.+\.json$/i)) {
this._cm.setOption('mode', 'application/json');
} else {
this._cm.setOption('mode', 'text/plain');
}
}
if (this.props.theme !== prevProps.theme) { if (this.props.theme !== prevProps.theme) {
this._cm.setOption('theme', `p5-${this.props.theme}`); this._cm.setOption('theme', `p5-${this.props.theme}`);
} }
@ -129,6 +126,31 @@ class Editor extends React.Component {
this._cm = null; this._cm = null;
} }
getFileMode(fileName) {
let mode;
if (fileName.match(/.+\.js$/i)) {
mode = 'javascript';
} else if (fileName.match(/.+\.css$/i)) {
mode = 'css';
} else if (fileName.match(/.+\.html$/i)) {
mode = 'htmlmixed';
} else if (fileName.match(/.+\.json$/i)) {
mode = 'application/json';
} else {
mode = 'text/plain';
}
return mode;
}
initializeDocuments(files) {
this._docs = {};
files.forEach(file => {
if (file.fileType === 'file') {
this._docs[file.id] = CodeMirror.Doc(file.content, this.getFileMode(file.name)); // eslint-disable-line
}
});
}
tidyCode() { tidyCode() {
const beautifyOptions = { const beautifyOptions = {
indent_size: this.props.indentationAmount, indent_size: this.props.indentationAmount,
@ -211,7 +233,8 @@ Editor.propTypes = {
fontSize: PropTypes.number.isRequired, fontSize: PropTypes.number.isRequired,
file: PropTypes.shape({ file: PropTypes.shape({
name: PropTypes.string.isRequired, name: PropTypes.string.isRequired,
content: PropTypes.string.isRequired content: PropTypes.string.isRequired,
id: PropTypes.string.isRequired
}), }),
editorOptionsVisible: PropTypes.bool.isRequired, editorOptionsVisible: PropTypes.bool.isRequired,
showEditorOptions: PropTypes.func.isRequired, showEditorOptions: PropTypes.func.isRequired,
@ -223,7 +246,8 @@ Editor.propTypes = {
isPlaying: PropTypes.bool.isRequired, isPlaying: PropTypes.bool.isRequired,
theme: PropTypes.string.isRequired, theme: PropTypes.string.isRequired,
unsavedChanges: PropTypes.bool.isRequired, unsavedChanges: PropTypes.bool.isRequired,
projectSavedTime: PropTypes.string.isRequired projectSavedTime: PropTypes.string.isRequired,
files: PropTypes.array.isRequired
}; };
export default Editor; export default Editor;