this.handleDoubleClick(e)} className={'MarkdownPreview' + (this.props.className != null ? ' ' + this.props.className : '') + (isEmpty ? ' empty' : '')} dangerouslySetInnerHTML={{__html: ' ' + markdown(content)}}/>
+
this.handleClick(e)}
+ onDoubleClick={e => this.handleDoubleClick(e)}
+ onMouseDown={e => this.handleMouseDown(e)}
+ onMouseMove={e => this.handleMouseMove(e)}
+ onMouseUp={e => this.handleMouseUp(e)}
+ dangerouslySetInnerHTML={{__html: ' ' + markdown(content)}}
+ />
)
}
}
@@ -70,6 +106,9 @@ export default class MarkdownPreview extends React.Component {
MarkdownPreview.propTypes = {
onClick: PropTypes.func,
onDoubleClick: PropTypes.func,
+ onMouseUp: PropTypes.func,
+ onMouseDown: PropTypes.func,
+ onMouseMove: PropTypes.func,
className: PropTypes.string,
content: PropTypes.string
}
diff --git a/browser/main/HomePage/ArticleDetail/ArticleEditor.js b/browser/main/HomePage/ArticleDetail/ArticleEditor.js
new file mode 100644
index 00000000..a55f7a4d
--- /dev/null
+++ b/browser/main/HomePage/ArticleDetail/ArticleEditor.js
@@ -0,0 +1,91 @@
+import React, { PropTypes } from 'react'
+import ReactDOM from 'react-dom'
+import MarkdownPreview from 'browser/components/MarkdownPreview'
+import CodeEditor from 'browser/components/CodeEditor'
+
+export const PREVIEW_MODE = 'PREVIEW_MODE'
+export const EDIT_MODE = 'EDIT_MODE'
+
+export default class ArticleEditor extends React.Component {
+ constructor (props) {
+ super(props)
+ this.isMouseDown = false
+ this.state = {
+ status: PREVIEW_MODE
+ }
+ }
+
+ componentWillReceiveProps (nextProps) {
+ }
+
+ switchPreviewMode () {
+ this.setState({
+ status: PREVIEW_MODE
+ })
+ }
+
+ switchEditMode () {
+ this.setState({
+ status: EDIT_MODE
+ }, function () {
+ this.refs.editor.editor.focus()
+ })
+ }
+
+ handlePreviewMouseDown (e) {
+ if (e.button === 2) return true
+ this.isDrag = false
+ this.isMouseDown = true
+ }
+
+ handlePreviewMouseMove () {
+ if (this.isMouseDown) this.isDrag = true
+ }
+
+ handlePreviewMouseUp () {
+ this.isMouseDown = false
+ if (!this.isDrag) {
+ this.switchEditMode()
+ }
+ }
+
+ handleBlurCodeEditor () {
+ if (this.props.mode === 'markdown') {
+ this.switchPreviewMode()
+ }
+ }
+
+ render () {
+ if (this.props.mode === 'markdown' && this.state.status === PREVIEW_MODE) {
+ return (
+
+
this.handlePreviewMouseUp(e)}
+ onMouseDown={e => this.handlePreviewMouseDown(e)}
+ onMouseMove={e => this.handlePreviewMouseMove(e)}
+ content={this.props.content}
+ />
+ Click to Edit
+
+ )
+ }
+
+ return (
+
+
this.handleBlurCodeEditor(e)}
+ onChange={this.props.onChange}
+ mode={this.props.mode}
+ code={this.props.content}
+ />
+ Press ESC to watch Preview
+
+ )
+ }
+}
+
+ArticleEditor.propTypes = {
+ content: PropTypes.string,
+ mode: PropTypes.string,
+ onChange: PropTypes.func
+}
diff --git a/browser/main/HomePage/ArticleDetail/index.js b/browser/main/HomePage/ArticleDetail/index.js
index 2131059a..7ab3019a 100644
--- a/browser/main/HomePage/ArticleDetail/index.js
+++ b/browser/main/HomePage/ArticleDetail/index.js
@@ -2,8 +2,6 @@ import React, { PropTypes } from 'react'
import ReactDOM from 'react-dom'
import moment from 'moment'
import _ from 'lodash'
-import MarkdownPreview from 'browser/components/MarkdownPreview'
-import CodeEditor from 'browser/components/CodeEditor'
import {
switchFolder,
cacheArticle,
@@ -16,7 +14,7 @@ import ModeSelect from 'browser/components/ModeSelect'
import ShareButton from './ShareButton'
import { openModal, isModalOpen } from 'browser/lib/modal'
import DeleteArticleModal from '../../modal/DeleteArticleModal'
-
+import ArticleEditor from './ArticleEditor'
const electron = require('electron')
const ipc = electron.ipcRenderer
const remote = electron.remote
@@ -275,9 +273,7 @@ export default class ArticleDetail extends React.Component {
handleModeSelectKeyDown (e) {
if (e.keyCode === 9 && !e.shiftKey) {
e.preventDefault()
- this.setState({previewMode: false}, function () {
- this.refs.code.editor.focus()
- })
+ this.refs.editor.switchEditMode()
}
if (e.keyCode === 9 && e.shiftKey) {
e.preventDefault()
@@ -285,14 +281,6 @@ export default class ArticleDetail extends React.Component {
}
}
- handlePreviewDoubleClick (e) {
- this.setState({
- previewMode: false
- }, function () {
- this.refs.code.editor.focus()
- })
- }
-
render () {
let { folders, status, tags, activeArticle, modified, user } = this.props
if (activeArticle == null) return this.renderEmpty()
@@ -369,27 +357,12 @@ export default class ArticleDetail extends React.Component {
/>
{status.isTutorialOpen ? modeSelectTutorialElement : null}
-