-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
304 lines (272 loc) · 10.1 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
var selectedSnippet ="",
editor,
menuCollapsed = false,
notepadCollapsed= true,
pinned = false;
//Snippets Container
var snippets = {};
//Create a new snippet with a given name.
//@name if the name already exists, a unique integer will be appended
//@content can be undefined
function createNewSnippet(name,content){
name = name || 'untitled';
var suffix = 1,
unique = name;
while(Object.keys(snippets).indexOf(unique) > -1){
unique = name + "_" + suffix++;
}
snippets[unique] = content || "'Hello World!'";
selectedSnippet = unique;
refreshSnippetsList();
$("#snippet-header").select();
}
//Updates the snippet name to whatever is in the snippet header
function updateSnippetName(){
var newName = $("#snippet-header").val();
if (newName.trim() != "" && selectedSnippet != newName && selectedSnippet != undefined){
var content = snippets[selectedSnippet];
delete snippets[selectedSnippet];
createNewSnippet(newName,content);
$(".snippets").addClass("selected");
}
}
//Delete the currently seelected snippet
function deleteCurrentSnippet(){
var prevSelect = $(".selected").prev();
delete snippets[selectedSnippet];
selectedSnippet="";
prevSelect.trigger("click");
refreshSnippetsList();
}
//Display currently selected snippet in editor
function displayCurrentSnippet(){
if (snippets[selectedSnippet]!=undefined){
editor.setValue(snippets[selectedSnippet]);
$("#snippet-header").val(selectedSnippet);
}
else {
editor.setValue("");
$("#snippet-header").val("");
}
}
//Toggles menu collapsed
function toggleMenu(){
menuCollapsed = !menuCollapsed;
var leftPane = $("#menu-container"),
margin = parseInt(leftPane.css("margin-left")),
width = parseInt(leftPane.css("width")),
borderWidth = parseInt(leftPane.css("border-left-width")),
newMargin= margin < 0 ? 0 : (-width - borderWidth);
$("#menu-container").animate({'margin-left':newMargin});
var button = $("#toggle-menu i")
if (menuCollapsed) {button.removeClass("fa-arrow-circle-left");
button.addClass("fa-arrow-circle-right");}
else {button.removeClass("fa-arrow-circle-right");
button.addClass("fa-arrow-circle-left");}
}
//Toggles Notepad collapsed
function toggleNotepad(){
notepadCollapsed = !notepadCollapsed;
var pane = $("#notepad"),
margin = parseInt(pane.css("margin-right")),
width = parseInt(pane.css("width")),
borderWidth = parseInt(pane.css("border-right-width")),
newMargin= margin < 0 ? 0 : (-width-borderWidth);
$("#notepad").animate({'margin-right':newMargin});
var button = $("#toggle-notepad i");
if (notepadCollapsed) {
button.removeClass("fa-arrow-circle-right");
button.addClass("fa-arrow-circle-left");
}
else {
button.removeClass("fa-arrow-circle-left");
button.addClass("fa-arrow-circle-right");
}
}
//Show the 'Settings' menu
function showSettings(){
$("#snippets-menu").hide();
$("#settings-menu").show();
}
//Hide the 'Settings' Menu
function hideSettings(){
$("#snippets-menu").show();
$("#settings-menu").hide();
}
//Apply options from the settings menu
function applySettings(){
editor.setTheme($("#theme").val());
editor.getSession().setMode($("#mode").val());
editor.renderer.setShowGutter($("#show_gutter").is(":checked"));
editor.renderer.setShowPrintMargin($("#display_print_margin").is(":checked"));
$("#snippet-editor").css('font-size',$("#fontsize").val());
}
//Filters out snippet names in list based on search string
function filterList(){
var filterText = $("#filter").val().toLowerCase();
var name,content;
$(".snippet").each(function(){
name = $(this).text();
content = snippets[name];
var match = name.toLowerCase().indexOf(filterText) > -1 ||
content.toLowerCase().indexOf(filterText) > -1;
if (match) $(this).show();
else $(this).hide();
});
}
//Update list of snippet names in left pane
function refreshSnippetsList(){
$("#filter").val("");
$('.snippet').remove();
for (name in snippets){
var elem = '<div class="snippet">' + name + '</div>';
$("#snippet-list").append(elem);
if (selectedSnippet == name){
$(".snippet").last().trigger("click");
}
}
displayCurrentSnippet();
}
//Toggle whether app is pinned (always on top)
function togglePinned(){
pinned = !pinned;
if (pinned){
$("#pin i").removeClass("rotate-45")
$("#pin i").addClass("fa-2x");
}
else {
$("#pin i").addClass("rotate-45");
$("#pin i").removeClass("fa-2x");
}
chrome.app.window.current().setAlwaysOnTop(pinned);
}
//http://www.html5rocks.com/en/tutorials/file/filesystem/
//Error callback used for google sync errors
function syncErrorCallback(e){
console.log(e.name + " : " + e.message);
}
//Load snippets from storage
function loadSnippets(){
//Use Chrome cloud storage (Web Store App)
if (chrome && chrome.syncFileSystem){
console.log("Load from google chrome filesystem");
//Retrieve sync file system
chrome.syncFileSystem.requestFileSystem(function(fs){
//Get file
fs.root.getFile('codesaver.json', {}, function(fileEntry) {
//File Reader
fileEntry.file(function(file) {
var reader = new FileReader();
reader.onloadend = function(e) {
//recreate save object
console.log("Loading from chrome.syncFileSystem: ",this.result);
var storageObject = JSON.parse(this.result);
snippets = storageObject.snippets || {};
$("#notepad textarea").val(storageObject.notes || "This is a notepad!");
if (storageObject.settings){
$("#theme").val(storageObject.settings.theme);
$("#show_gutter").attr('checked',storageObject.settings.showGutter);
$("#display_print_margin").attr('checked',storageObject.settings.showPrintMargin);
$("#fontsize").val(storageObject.settings.fontSize);
}
applySettings();
refreshSnippetsList();
};
reader.readAsText(file);
}, syncErrorCallback);
}, syncErrorCallback);
});
}
//Fallback to localstorage
//(localStorage is auto-periodically cleared in some environments/devices)
// ^Should be a word right?
else {
console.log("Could not load. Chrome Sync filesystem not found. localStorage not yet supported.");
}
}
//Save snippets to storage
function saveSnippets(callback){
var settingsObject = {'theme':$("#theme").val(),
'mode':$("#mode").val(),
'showGutter':$("#show_gutter").is(":checked"),
'showPrintMargin':$("#display_print_margin").is(":checked"),
'fontSize':$("#fontsize").val()};
var storageObject = {'snippets':snippets,
'notes':$("#notepad textarea").val(),
'settings':settingsObject};
if (chrome && chrome.syncFileSystem){
console.log("Saving to chrome.syncFileSystem: ",JSON.stringify(storageObject));
//Retrieve sync file system
chrome.syncFileSystem.requestFileSystem(function(fs){
//Create File
fs.root.getFile('codesaver.json', {create: true}, function(fileEntry) {
//Create File writer & save storage object
fileEntry.createWriter(function(fileWriter) {
var truncated = false;
fileWriter.onwriteend = function(e) {
if (truncated == false){
console.log("truncating file");
this.truncate(this.position);
truncated = true;
}
else{
console.log('WriteCompleted');
callback();
}
};
fileWriter.onerror = function(e) {console.log('Write failed: ' + e.toString());};
var blob = new Blob([JSON.stringify(storageObject)], {type: 'application/json'});
fileWriter.write(blob);
}, syncErrorCallback);
}, syncErrorCallback);
});
}
else {
console.log("Could not save. Chrome storage not found. localStorage not yet supported.");
}
}
$(document).ready(function(){
//Create Editor (Pretty sure this must be created before doing anything else)
editor = ace.edit("snippet-editor");
editor.$blockScrolling = Infinity; //<< Removes ace warning message (scroll to cursor on change)
applySettings();
//Editor save on change event
editor.getSession().on('change', function(e) {
if (selectedSnippet.trim() == "" && editor.getValue().trim != "") return;
snippets[selectedSnippet] = editor.getValue();
});
//Load snippets from storage on refresh
loadSnippets();
refreshSnippetsList();
//CLICK EVENTS
$("#settings-close").click(hideSettings);
$("#settings-apply").click(applySettings);
$("#new").click(function(){createNewSnippet("untitled")});
$("#delete").click(deleteCurrentSnippet);
$("#options").click(showSettings);
$("#save").click(saveSnippets);
$("#load").click(loadSnippets);
$("#toggle-menu").click(toggleMenu);
$("#toggle-notepad").click(toggleNotepad);
$("#filter").change(filterList);
$("#snippet-header").focus(function(){$('#snippet-header').select()});
$("#snippet-header").blur(updateSnippetName);
$("#snippet-header").mouseup(function(){return false;});
$("#pin").click(function(){console.log("clicked");togglePinned();});
$("#close").click(function(){saveSnippets(window.close);});
$("#minimize").click(function(){chrome.app.window.current().minimize()});
//Snippet name click event
$(document).on("click",".snippet",function(){
$('.snippet').removeClass("selected");
$(this).addClass("selected");
selectedSnippet = $(this).text();
displayCurrentSnippet();
});
//Keep panel margins where they should be on window resize
$(window).resize(function(){
var setMarginNote = notepadCollapsed ? parseInt($("#notepad").css('width'))*-1 : 0,
setMarginMenu = menuCollapsed ? parseInt($("#menu-container").css('width'))*-1 : 0;
$("#notepad").css({'margin-right':setMarginNote});
$("#menu-container").css({'margin-left':setMarginMenu});
});
});