2011-10-01 21:48:00 +00:00
function setEditorSize ( ) {
// Sets the size of the text editor window.
2011-10-04 19:01:05 +00:00
fillWindow ( $ ( '#editor' ) ) ;
2011-10-01 21:48:00 +00:00
}
function getFileExtension ( file ) {
var parts = file . split ( '.' ) ;
return parts [ parts . length - 1 ] ;
}
function setSyntaxMode ( ext ) {
// Loads the syntax mode files and tells the editor
2011-10-04 19:01:05 +00:00
var filetype = new Array ( ) ;
2012-03-10 14:00:57 +00:00
// add file extensions like this: filetype["extension"] = "filetype":
2012-03-11 12:03:41 +00:00
filetype [ "h" ] = "c_cpp" ;
filetype [ "c" ] = "c_cpp" ;
filetype [ "clj" ] = "clojure" ;
filetype [ "coffee" ] = "coffee" ; // coffescript can be compiled to javascript
filetype [ "coldfusion" ] = "cfc" ;
filetype [ "cpp" ] = "c_cpp" ;
filetype [ "cs" ] = "csharp" ;
2011-10-01 21:48:00 +00:00
filetype [ "css" ] = "css" ;
2012-03-11 12:03:41 +00:00
filetype [ "groovy" ] = "groovy" ;
filetype [ "haxe" ] = "hx" ;
2011-10-04 22:23:16 +00:00
filetype [ "html" ] = "html" ;
2012-03-11 12:03:41 +00:00
filetype [ "java" ] = "java" ;
2011-10-04 22:23:16 +00:00
filetype [ "js" ] = "javascript" ;
2012-03-11 12:03:41 +00:00
filetype [ "json" ] = "json" ;
filetype [ "latex" ] = "latex" ;
2012-03-10 14:00:57 +00:00
filetype [ "ly" ] = "latex" ;
filetype [ "ily" ] = "latex" ;
2012-03-11 12:03:41 +00:00
filetype [ "lua" ] = "lua" ;
filetype [ "markdown" ] = "markdown" ;
filetype [ "md" ] = "markdown" ;
filetype [ "mdown" ] = "markdown" ;
filetype [ "mdwn" ] = "markdown" ;
2012-03-10 14:00:57 +00:00
filetype [ "mkd" ] = "markdown" ;
2012-03-11 12:03:41 +00:00
filetype [ "ml" ] = "ocaml" ;
filetype [ "mli" ] = "ocaml" ;
2011-10-01 21:48:00 +00:00
filetype [ "pl" ] = "perl" ;
2011-10-04 22:23:16 +00:00
filetype [ "php" ] = "php" ;
2012-01-01 20:04:46 +00:00
filetype [ "powershell" ] = "ps1" ;
2011-10-01 21:48:00 +00:00
filetype [ "py" ] = "python" ;
2011-10-04 22:23:16 +00:00
filetype [ "rb" ] = "ruby" ;
2012-03-11 12:03:41 +00:00
filetype [ "scad" ] = "scad" ; // seems to be something like 3d model files printed with e.g. reprap
filetype [ "scala" ] = "scala" ;
filetype [ "scss" ] = "scss" ; // "sassy css"
filetype [ "sql" ] = "sql" ;
filetype [ "svg" ] = "svg" ;
filetype [ "textile" ] = "textile" ; // related to markdown
2011-10-01 21:48:00 +00:00
filetype [ "xml" ] = "xml" ;
if ( filetype [ ext ] != null ) {
// Then it must be in the array, so load the custom syntax mode
// Set the syntax mode
OC . addScript ( 'files_texteditor' , 'aceeditor/mode-' + filetype [ ext ] , function ( ) {
var SyntaxMode = require ( "ace/mode/" + filetype [ ext ] ) . Mode ;
window . aceEditor . getSession ( ) . setMode ( new SyntaxMode ( ) ) ;
} ) ;
}
}
2012-01-09 17:22:51 +00:00
function showControls ( filename , writeperms ) {
2011-10-01 21:48:00 +00:00
// Loads the control bar at the top.
2012-02-14 21:49:51 +00:00
// Load the new toolbar.
var editorbarhtml = '<div id="editorcontrols" style="display: none;"><div class="crumb svg last" id="breadcrumb_file" style="background-image:url("../core/img/breadcrumb.png")"><p>' + filename + '</p></div>' ;
if ( writeperms == "true" ) {
editorbarhtml += '<button id="editor_save">' + t ( 'files_texteditor' , 'Save' ) + '</button><div class="separator"></div>' ;
}
editorbarhtml += '<label for="gotolineval">Go to line:</label><input stype="text" id="gotolineval"><label for="editorseachval">Search:</label><input type="text" name="editorsearchval" id="editorsearchval"><div class="separator"></div><button id="editor_close">' + t ( 'files_texteditor' , 'Close' ) + '</button></div>' ;
// Change breadcrumb classes
$ ( '#controls .last' ) . removeClass ( 'last' ) ;
$ ( '#controls' ) . append ( editorbarhtml ) ;
$ ( '#editorcontrols' ) . fadeIn ( 'slow' ) ;
2011-10-01 21:48:00 +00:00
}
2011-10-03 21:59:40 +00:00
2011-10-01 21:48:00 +00:00
function bindControlEvents ( ) {
2011-11-29 22:11:42 +00:00
$ ( "#editor_save" ) . die ( 'click' , doFileSave ) . live ( 'click' , doFileSave ) ;
2012-04-02 17:44:15 +00:00
$ ( '#editor_close' ) . die ( 'click' , closeBtnClick ) . live ( 'click' , closeBtnClick ) ;
2012-01-09 22:42:28 +00:00
$ ( '#gotolineval' ) . die ( 'keyup' , goToLine ) . live ( 'keyup' , goToLine ) ;
2012-01-09 22:22:12 +00:00
$ ( '#editorsearchval' ) . die ( 'keyup' , doSearch ) . live ( 'keyup' , doSearch ) ;
$ ( '#clearsearchbtn' ) . die ( 'click' , resetSearch ) . live ( 'click' , resetSearch ) ;
$ ( '#nextsearchbtn' ) . die ( 'click' , nextSearchResult ) . live ( 'click' , nextSearchResult ) ;
2011-11-29 22:11:42 +00:00
}
2012-01-09 21:16:41 +00:00
// returns true or false if the editor is in view or not
2011-11-29 22:11:42 +00:00
function editorIsShown ( ) {
// Not working as intended. Always returns true.
return is _editor _shown ;
2011-10-03 21:59:40 +00:00
}
2012-01-09 21:16:41 +00:00
// Moves the editor view to the line number speificed in #gotolineval
function goToLine ( ) {
// Go to the line specified
window . aceEditor . gotoLine ( $ ( '#gotolineval' ) . val ( ) ) ;
}
2012-01-09 22:22:12 +00:00
//resets the search
function resetSearch ( ) {
$ ( '#editorsearchval' ) . val ( '' ) ;
$ ( '#nextsearchbtn' ) . remove ( ) ;
$ ( '#clearsearchbtn' ) . remove ( ) ;
window . aceEditor . gotoLine ( 0 ) ;
}
// moves the cursor to the next search resukt
function nextSearchResult ( ) {
window . aceEditor . findNext ( ) ;
}
// Performs the initial search
function doSearch ( ) {
// check if search box empty?
if ( $ ( '#editorsearchval' ) . val ( ) == '' ) {
// Hide clear button
window . aceEditor . gotoLine ( 0 ) ;
$ ( '#nextsearchbtn' ) . remove ( ) ;
$ ( '#clearsearchbtn' ) . remove ( ) ;
} else {
// New search
// Reset cursor
window . aceEditor . gotoLine ( 0 ) ;
// Do search
window . aceEditor . find ( $ ( '#editorsearchval' ) . val ( ) , {
backwards : false ,
wrap : false ,
caseSensitive : false ,
wholeWord : false ,
regExp : false
} ) ;
// Show next and clear buttons
// check if already there
if ( $ ( '#nextsearchbtn' ) . length == 0 ) {
var nextbtnhtml = '<button id="nextsearchbtn">Next</button>' ;
var clearbtnhtml = '<button id="clearsearchbtn">Clear</button>' ;
$ ( '#editorsearchval' ) . after ( nextbtnhtml ) . after ( clearbtnhtml ) ;
}
}
}
2012-01-09 21:16:41 +00:00
// Tries to save the file.
2011-10-03 21:59:40 +00:00
function doFileSave ( ) {
2011-11-29 22:11:42 +00:00
if ( editorIsShown ( ) ) {
2012-04-02 17:27:06 +00:00
// Changed contents?
if ( $ ( '#editor' ) . attr ( 'data-edited' ) == 'true' ) {
// Get file path
var path = $ ( '#editor' ) . attr ( 'data-dir' ) + '/' + $ ( '#editor' ) . attr ( 'data-filename' ) ;
// Get original mtime
var mtime = $ ( '#editor' ) . attr ( 'data-mtime' ) ;
// Show saving spinner
$ ( "#editor_save" ) . die ( 'click' , doFileSave ) ;
$ ( '#save_result' ) . remove ( ) ;
$ ( '#editor_save' ) . text ( t ( 'files_texteditor' , 'Saving...' ) ) ;
// Get the data
var filecontents = window . aceEditor . getSession ( ) . getValue ( ) ;
// Send the data
$ . post ( OC . filePath ( 'files_texteditor' , 'ajax' , 'savefile.php' ) , { filecontents : filecontents , path : path , mtime : mtime } , function ( jsondata ) {
if ( jsondata . status != 'success' ) {
// Save failed
$ ( '#editor_save' ) . text ( t ( 'files_texteditor' , 'Save' ) ) ;
$ ( '#editor_save' ) . after ( '<p id="save_result" style="float: left">Failed to save file</p>' ) ;
$ ( "#editor_save" ) . live ( 'click' , doFileSave ) ;
} else {
// Save OK
// Update mtime
$ ( '#editor' ) . attr ( 'data-mtime' , jsondata . data . mtime ) ;
$ ( '#editor_save' ) . text ( t ( 'files_texteditor' , 'Save' ) ) ;
$ ( "#editor_save" ) . live ( 'click' , doFileSave ) ;
// Update titles
$ ( '#editor' ) . attr ( 'data-edited' , 'false' ) ;
$ ( '#breadcrumb_file' ) . text ( $ ( '#editor' ) . attr ( 'data-filename' ) ) ;
document . title = $ ( '#editor' ) . attr ( 'data-filename' ) + ' - ownCloud' ;
}
} , 'json' ) ;
}
2012-01-08 23:30:50 +00:00
}
2011-10-03 21:59:40 +00:00
} ;
2012-01-09 21:16:41 +00:00
// Gives the editor focus
2011-11-29 22:11:42 +00:00
function giveEditorFocus ( ) {
window . aceEditor . focus ( ) ;
} ;
2012-01-09 21:16:41 +00:00
// Loads the file editor. Accepts two parameters, dir and filename.
2011-10-01 21:48:00 +00:00
function showFileEditor ( dir , filename ) {
2011-11-29 22:11:42 +00:00
if ( ! editorIsShown ( ) ) {
2011-10-08 14:46:38 +00:00
// Loads the file editor and display it.
2012-02-23 19:35:48 +00:00
$ ( '#content' ) . append ( '<div id="editor"></div>' ) ;
2012-01-14 20:58:16 +00:00
var data = $ . getJSON (
OC . filePath ( 'files_texteditor' , 'ajax' , 'loadfile.php' ) ,
{ file : filename , dir : dir } ,
function ( result ) {
if ( result . status == 'success' ) {
// Save mtime
$ ( '#editor' ) . attr ( 'data-mtime' , result . data . mtime ) ;
// Initialise the editor
2012-02-14 21:49:51 +00:00
$ ( '.actions,#file_action_panel' ) . fadeOut ( 'slow' ) ;
2012-01-14 20:58:16 +00:00
$ ( 'table' ) . fadeOut ( 'slow' , function ( ) {
2012-02-14 21:49:51 +00:00
// Show the control bar
showControls ( filename , result . data . write ) ;
2012-01-14 20:58:16 +00:00
// Update document title
2012-04-02 17:27:06 +00:00
document . title = filename + ' - ownCloud' ;
2012-01-14 20:58:16 +00:00
$ ( '#editor' ) . text ( result . data . filecontents ) ;
$ ( '#editor' ) . attr ( 'data-dir' , dir ) ;
$ ( '#editor' ) . attr ( 'data-filename' , filename ) ;
2012-04-02 17:27:06 +00:00
$ ( '#editor' ) . attr ( 'data-edited' , 'false' ) ;
2012-01-14 20:58:16 +00:00
window . aceEditor = ace . edit ( "editor" ) ;
aceEditor . setShowPrintMargin ( false ) ;
2012-03-10 14:32:57 +00:00
aceEditor . getSession ( ) . setUseWrapMode ( true ) ;
2012-01-14 20:58:16 +00:00
if ( result . data . write == 'false' ) {
aceEditor . setReadOnly ( true ) ;
}
setEditorSize ( ) ;
setSyntaxMode ( getFileExtension ( filename ) ) ;
OC . addScript ( 'files_texteditor' , 'aceeditor/theme-clouds' , function ( ) {
window . aceEditor . setTheme ( "ace/theme/clouds" ) ;
2011-10-08 14:46:38 +00:00
} ) ;
2012-04-02 17:27:06 +00:00
window . aceEditor . getSession ( ) . on ( 'change' , function ( ) {
if ( $ ( '#editor' ) . attr ( 'data-edited' ) != 'true' ) {
$ ( '#editor' ) . attr ( 'data-edited' , 'true' ) ;
$ ( '#breadcrumb_file' ) . text ( $ ( '#breadcrumb_file' ) . text ( ) + ' *' ) ;
document . title = $ ( '#editor' ) . attr ( 'data-filename' ) + ' * - ownCloud' ;
}
} ) ;
2012-01-14 20:58:16 +00:00
} ) ;
} else {
// Failed to get the file.
2012-04-02 16:35:11 +00:00
OC . dialogs . alert ( result . data . message , t ( 'files_texteditor' , 'An error occurred!' ) ) ;
2011-10-08 14:46:38 +00:00
}
2012-01-14 20:58:16 +00:00
// End success
}
// End ajax
) ;
2011-10-19 20:42:44 +00:00
is _editor _shown = true ;
2011-10-08 14:46:38 +00:00
}
2011-10-01 21:48:00 +00:00
}
2012-04-02 17:44:15 +00:00
function closeBtnClick ( ) {
if ( $ ( '#editor' ) . attr ( 'data-edited' ) == 'true' ) {
// Show confirm
OC . dialogs . confirm ( t ( 'files_texteditor' , 'You have unsaved changes that will be lost! Do you still want to close?' ) , t ( 'files_texteditor' , 'Really close?' ) , function ( close ) {
if ( close ) {
hideFileEditor ( ) ;
}
} ) ;
} else {
hideFileEditor ( ) ;
}
}
2012-01-09 21:16:41 +00:00
// Fades out the editor.
2011-10-01 21:48:00 +00:00
function hideFileEditor ( ) {
2012-01-09 22:22:12 +00:00
// Fades out editor controls
2012-02-14 21:49:51 +00:00
$ ( '#editorcontrols' ) . fadeOut ( 'slow' , function ( ) {
2012-01-09 22:22:12 +00:00
$ ( this ) . remove ( ) ;
2012-02-14 21:55:51 +00:00
$ ( ".crumb:last" ) . addClass ( 'last' ) ;
2012-01-09 22:22:12 +00:00
} ) ;
2011-11-29 22:11:42 +00:00
// Fade out editor
$ ( '#editor' ) . fadeOut ( 'slow' , function ( ) {
2012-01-09 22:22:12 +00:00
$ ( this ) . remove ( ) ;
2012-01-09 22:38:19 +00:00
// Reset document title
document . title = "ownCloud" ;
2011-11-29 22:11:42 +00:00
var editorhtml = '<div id="editor"></div>' ;
$ ( 'table' ) . after ( editorhtml ) ;
$ ( '.actions,#file_access_panel' ) . fadeIn ( 'slow' ) ;
$ ( 'table' ) . fadeIn ( 'slow' ) ;
} ) ;
is _editor _shown = false ;
2011-10-01 21:48:00 +00:00
}
2011-11-11 20:46:06 +00:00
// Keyboard Shortcuts
var ctrlBtn = false ;
2012-01-09 21:16:41 +00:00
2012-01-23 20:59:37 +00:00
// TODO fix detection of ctrl keyup
2012-01-09 21:16:41 +00:00
// returns true if ctrl+s or cmd+s is being pressed
2011-11-11 20:46:06 +00:00
function checkForSaveKeyPress ( e ) {
2011-12-31 12:28:25 +00:00
if ( e . which == 17 || e . which == 91 ) ctrlBtn = true ;
if ( e . which == 83 && ctrlBtn == true ) {
e . preventDefault ( ) ;
$ ( '#editor_save' ) . trigger ( 'click' ) ;
return false ;
}
2011-11-11 20:46:06 +00:00
}
2012-01-09 21:16:41 +00:00
// resizes the editor window
2011-10-01 21:48:00 +00:00
$ ( window ) . resize ( function ( ) {
2011-10-05 15:10:11 +00:00
setEditorSize ( ) ;
2011-10-04 22:23:16 +00:00
} ) ;
2011-10-19 20:42:44 +00:00
var is _editor _shown = false ;
2011-10-05 00:36:27 +00:00
$ ( document ) . ready ( function ( ) {
if ( typeof FileActions !== 'undefined' ) {
FileActions . register ( 'text' , 'Edit' , '' , function ( filename ) {
showFileEditor ( $ ( '#dir' ) . val ( ) , filename ) ;
} ) ;
FileActions . setDefault ( 'text' , 'Edit' ) ;
FileActions . register ( 'application/xml' , 'Edit' , '' , function ( filename ) {
showFileEditor ( $ ( '#dir' ) . val ( ) , filename ) ;
} ) ;
FileActions . setDefault ( 'application/xml' , 'Edit' ) ;
}
2011-10-05 00:44:24 +00:00
OC . search . customResults . Text = function ( row , item ) {
var text = item . link . substr ( item . link . indexOf ( 'file=' ) + 5 ) ;
var a = row . find ( 'a' ) ;
a . data ( 'file' , text ) ;
a . attr ( 'href' , '#' ) ;
a . click ( function ( ) {
var file = text . split ( '/' ) . pop ( ) ;
var dir = text . substr ( 0 , text . length - file . length - 1 ) ;
showFileEditor ( dir , file ) ;
} ) ;
2012-02-23 19:35:48 +00:00
} ;
2012-01-09 21:16:41 +00:00
// Binds the file save and close editor events, and gotoline button
2011-10-05 15:10:11 +00:00
bindControlEvents ( ) ;
2012-02-23 19:35:48 +00:00
$ ( '#editor' ) . remove ( ) ;
2011-11-11 20:46:06 +00:00
// Binds the save keyboard shortcut events
2012-01-23 20:59:37 +00:00
//$(document).unbind('keydown').bind('keydown',checkForSaveKeyPress);
2012-04-02 17:27:06 +00:00
2011-11-29 22:11:42 +00:00
} ) ;