Skip to content

Commit

Permalink
Make Scratchpad the default user script editor.
Browse files Browse the repository at this point in the history
  • Loading branch information
arantius committed Jan 24, 2013
1 parent 819117a commit 4fab342
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 48 deletions.
5 changes: 4 additions & 1 deletion content/options.xul
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,10 @@
<vbox>
<groupbox>
<caption label="&options.editor;" />
<button oncommand="GM_util.getEditor(true)" label="&options.changeEditor;" />
<hbox>
<button oncommand="GM_util.setEditor(1)" label="&options.defaultEditor;" flex="1"/>
<button oncommand="GM_util.setEditor(0)" label="&options.browseForEditor;" flex="1"/>
</hbox>
</groupbox>

<groupbox>
Expand Down
3 changes: 2 additions & 1 deletion locale/en-US/greasemonkey.dtd
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@
<!ENTITY newscript.excludes "Excludes (One per line)">
<!ENTITY newscript.fromClipboard "Use Script From Clipboard">
<!ENTITY options.editor "Editor">
<!ENTITY options.changeEditor "Select Script Editor">
<!ENTITY options.defaultEditor "Use Default Editor">
<!ENTITY options.browseForEditor "Browse for Editor Program">
<!ENTITY options.globalExcludes "Global Excludes">
<!ENTITY Uninstall "Uninstall">
<!ENTITY AnonymousStatistics "Anonymous Statistics">
Expand Down
54 changes: 9 additions & 45 deletions modules/util/getEditor.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,62 +2,26 @@ Components.utils.import('resource://greasemonkey/prefmanager.js');
Components.utils.import('resource://greasemonkey/util.js');

var EXPORTED_SYMBOLS = ['getEditor'];
var stringBundle = Components
.classes["@mozilla.org/intl/stringbundle;1"]
.getService(Components.interfaces.nsIStringBundleService)
.createBundle("chrome://greasemonkey/locale/gm-browser.properties");
var EDITOR_PROMPT = stringBundle.GetStringFromName("editor.prompt");
var PICK_EXE = stringBundle.GetStringFromName("editor.please_pick_executable");

function getEditor(change) {
function getEditor() {
var editorPath = GM_prefRoot.getValue("editor");
if (!editorPath) return null;

var editor;
var editor = null;
try {
editor = Components.classes["@mozilla.org/file/local;1"]
.createInstance(Components.interfaces.nsIFile);
editor.followLinks = true;
editor.initWithPath(editorPath);
} catch (e) {
editor = null;
GM_util.logError(e, false, e.fileName, e.lineNumber);
}

if (!change && editorPath) {
// make sure the editor preference is still valid
if (editor && editor.exists() && editor.isExecutable()) {
return editor;
} else {
GM_prefRoot.remove("editor");
}
// make sure the editor preference is still valid
if (!editor || !editor.exists() || !editor.isExecutable()) {
GM_prefRoot.remove("editor");
editor = null;
}

// Ask the user to choose a new editor. Sometimes users get confused and
// pick a non-executable file, so we set this up in a loop so that if they do
// that we can give them an error and try again.
while (true) {
var nsIFilePicker = Components.interfaces.nsIFilePicker;
var filePicker = Components.classes["@mozilla.org/filepicker;1"]
.createInstance(nsIFilePicker);

filePicker.init(
GM_util.getBrowserWindow(), EDITOR_PROMPT, nsIFilePicker.modeOpen);
filePicker.appendFilters(nsIFilePicker.filterApps);

if (editor) {
filePicker.defaultString = editor.leafName;
filePicker.displayDirectory = editor.parent;
}

if (filePicker.show() != nsIFilePicker.returnOK) {
// The user canceled, return null.
return null;
}

if (filePicker.file.exists() && filePicker.file.isExecutable()) {
GM_prefRoot.setValue("editor", filePicker.file.path);
return filePicker.file;
} else {
GM_util.alert(PICK_EXE);
}
}
return editor;
}
7 changes: 6 additions & 1 deletion modules/util/openInEditor.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
Components.utils.import("resource:///modules/devtools/scratchpad-manager.jsm");
Components.utils.import('resource://greasemonkey/prefmanager.js');
Components.utils.import('resource://greasemonkey/util.js');

Expand All @@ -14,7 +15,11 @@ const COULD_NOT_LAUNCH = (function() {
function openInEditor(script) {
var editor = GM_util.getEditor();
if (!editor) {
// The user did not choose an editor.
ScratchpadManager.openScratchpad({
'filename': script.file.path,
'text': script.textContent,
'saved': true,
});
return;
}

Expand Down
49 changes: 49 additions & 0 deletions modules/util/setEditor.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
Components.utils.import('resource://greasemonkey/prefmanager.js');
Components.utils.import('resource://greasemonkey/util.js');

var EXPORTED_SYMBOLS = ['setEditor'];

var stringBundle = Components
.classes["@mozilla.org/intl/stringbundle;1"]
.getService(Components.interfaces.nsIStringBundleService)
.createBundle("chrome://greasemonkey/locale/gm-browser.properties");
var EDITOR_PROMPT = stringBundle.GetStringFromName("editor.prompt");
var PICK_EXE = stringBundle.GetStringFromName("editor.please_pick_executable");

function setEditor(aScratchpad) {
if (aScratchpad) {
GM_prefRoot.remove("editor");
return;
}

// Ask the user to choose a new editor. Sometimes users get confused and
// pick a non-executable file, so we set this up in a loop so that if they do
// that we can give them an error and try again.
while (true) {
var nsIFilePicker = Components.interfaces.nsIFilePicker;
var filePicker = Components.classes["@mozilla.org/filepicker;1"]
.createInstance(nsIFilePicker);

filePicker.init(
GM_util.getBrowserWindow(), EDITOR_PROMPT, nsIFilePicker.modeOpen);
filePicker.appendFilters(nsIFilePicker.filterApps);

var editor = GM_util.getEditor();
if (editor) {
filePicker.defaultString = editor.leafName;
filePicker.displayDirectory = editor.parent;
}

if (filePicker.show() != nsIFilePicker.returnOK) {
// The user canceled, return null.
return;
}

if (filePicker.file.exists() && filePicker.file.isExecutable()) {
GM_prefRoot.setValue("editor", filePicker.file.path);
return;
} else {
GM_util.alert(PICK_EXE);
}
}
}

0 comments on commit 4fab342

Please sign in to comment.