1 /**
2  * Copyright (c) 2006-2017, JGraph Ltd
3  * Copyright (c) 2006-2017, Gaudenz Alder
4  */
5 /**
6  * Contains current settings.
7  */
8 var mxSettings =
9 {
10 	/**
11 	 * Defines current version of settings.
12 	 */
13 	currentVersion: 18,
14 
15 	defaultFormatWidth: (screen.width < 600) ? '0' : '240',
16 
17 	// NOTE: Hardcoded in index.html due to timing of JS loading
18 	key: Editor.settingsKey,
19 
20 	getLanguage: function()
21 	{
22 		return mxSettings.settings.language;
23 	},
24 	setLanguage: function(lang)
25 	{
26 		mxSettings.settings.language = lang;
27 	},
28 	getUi: function()
29 	{
30 		return mxSettings.settings.ui;
31 	},
32 	setUi: function(ui)
33 	{
34 		// Writes to main configuration
35 		var value = localStorage.getItem('.drawio-config');
36 
37 		if (value == null)
38 		{
39 			value = mxSettings.getDefaults();
40 		}
41 		else
42 		{
43 			value = JSON.parse(value);
44 		}
45 
46 		value.ui = ui;
47 
48 		delete value.isNew;
49 		value.version = mxSettings.currentVersion;
50 		localStorage.setItem('.drawio-config', JSON.stringify(value));
51 	},
52 	getShowStartScreen: function()
53 	{
54 		return mxSettings.settings.showStartScreen;
55 	},
56 	setShowStartScreen: function(showStartScreen)
57 	{
58 		mxSettings.settings.showStartScreen = showStartScreen;
59 	},
60 	getGridColor: function(darkMode)
61 	{
62 		return (darkMode) ? mxSettings.settings.darkGridColor : mxSettings.settings.gridColor;
63 	},
64 	setGridColor: function(gridColor, darkMode)
65 	{
66 		if (darkMode)
67 		{
68 			mxSettings.settings.darkGridColor = gridColor;
69 		}
70 		else
71 		{
72 			mxSettings.settings.gridColor = gridColor;
73 		}
74 	},
75 	getAutosave: function()
76 	{
77 		return mxSettings.settings.autosave;
78 	},
79 	setAutosave: function(autosave)
80 	{
81 		mxSettings.settings.autosave = autosave;
82 	},
83 	getResizeImages: function()
84 	{
85 		return mxSettings.settings.resizeImages;
86 	},
87 	setResizeImages: function(resizeImages)
88 	{
89 		mxSettings.settings.resizeImages = resizeImages;
90 	},
91 	getOpenCounter: function()
92 	{
93 		return mxSettings.settings.openCounter;
94 	},
95 	setOpenCounter: function(openCounter)
96 	{
97 		mxSettings.settings.openCounter = openCounter;
98 	},
99 	setCustomFonts: function(fonts)
100 	{
101 		mxSettings.settings.customFonts = fonts;
102 	},
103 	getCustomFonts: function()
104 	{
105 		//Convert from old format to the new one
106 		var custFonts = mxSettings.settings.customFonts || [];
107 
108 		for (var i = 0 ; i < custFonts.length; i++)
109 		{
110 			if (typeof custFonts[i] === 'string')
111 			{
112 				custFonts[i] = {name: custFonts[i], url: null};
113 			}
114 		}
115 
116 		return custFonts;
117 	},
118 	getLibraries: function()
119 	{
120 		return mxSettings.settings.libraries;
121 	},
122 	setLibraries: function(libs)
123 	{
124 		mxSettings.settings.libraries = libs;
125 	},
126 	addCustomLibrary: function(id)
127 	{
128 		// Makes sure to update the latest data from the localStorage
129 		mxSettings.load();
130 
131 		//If the setting is incorrect, reset it to an empty array
132 		if (!Array.isArray(mxSettings.settings.customLibraries))
133 		{
134 			mxSettings.settings.customLibraries = [];
135 		}
136 
137 		if (mxUtils.indexOf(mxSettings.settings.customLibraries, id) < 0)
138 		{
139 			// Makes sure scratchpad is below search in sidebar
140 			if (id === 'L.scratchpad')
141 			{
142 				mxSettings.settings.customLibraries.splice(0, 0, id);
143 			}
144 			else
145 			{
146 				mxSettings.settings.customLibraries.push(id);
147 			}
148 		}
149 
150 		mxSettings.save();
151 	},
152 	removeCustomLibrary: function(id)
153 	{
154 		// Makes sure to update the latest data from the localStorage
155 		mxSettings.load();
156 		mxUtils.remove(id, mxSettings.settings.customLibraries);
157 		mxSettings.save();
158 	},
159 	getCustomLibraries: function()
160 	{
161 		return mxSettings.settings.customLibraries;
162 	},
163 	getPlugins: function()
164 	{
165 		return mxSettings.settings.plugins;
166 	},
167 	setPlugins: function(plugins)
168 	{
169 		mxSettings.settings.plugins = plugins;
170 	},
171 	getRecentColors: function()
172 	{
173 		return mxSettings.settings.recentColors;
174 	},
175 	setRecentColors: function(recentColors)
176 	{
177 		mxSettings.settings.recentColors = recentColors;
178 	},
179 	getFormatWidth: function()
180 	{
181 		return parseInt(mxSettings.settings.formatWidth);
182 	},
183 	setFormatWidth: function(formatWidth)
184 	{
185 		mxSettings.settings.formatWidth = formatWidth;
186 	},
187 	isCreateTarget: function()
188 	{
189 		return mxSettings.settings.createTarget;
190 	},
191 	setCreateTarget: function(value)
192 	{
193 		mxSettings.settings.createTarget = value;
194 	},
195 	getPageFormat: function()
196 	{
197 		return mxSettings.settings.pageFormat;
198 	},
199 	setPageFormat: function(value)
200 	{
201 		mxSettings.settings.pageFormat = value;
202 	},
203 	getUnit: function()
204 	{
205 		return mxSettings.settings.unit || mxConstants.POINTS;
206 	},
207 	setUnit: function(value)
208 	{
209 		mxSettings.settings.unit = value;
210 	},
211 	isRulerOn: function()
212 	{
213 		return mxSettings.settings.isRulerOn;
214 	},
215 	setRulerOn: function(value)
216 	{
217 		mxSettings.settings.isRulerOn = value;
218 	},
219 	getDefaults: function()
220 	{
221 		return {
222 			language: '',
223 			configVersion: Editor.configVersion,
224 			customFonts: [],
225 			libraries: Sidebar.prototype.defaultEntries,
226 			customLibraries: Editor.defaultCustomLibraries,
227 			plugins: [],
228 			recentColors: [],
229 			formatWidth: mxSettings.defaultFormatWidth,
230 			createTarget: urlParams['sketch'] == '1',
231 			pageFormat: mxGraph.prototype.pageFormat,
232 			search: true,
233 			showStartScreen: true,
234 			gridColor: mxGraphView.prototype.defaultGridColor,
235 			darkGridColor: mxGraphView.prototype.defaultDarkGridColor,
236 			autosave: true,
237 			resizeImages: null,
238 			openCounter: 0,
239 			version: mxSettings.currentVersion,
240 			// Only defined and true for new settings which haven't been saved
241 			isNew: true,
242 			unit: mxConstants.POINTS,
243 			isRulerOn: false
244 		};
245 	},
246 	init: function()
247 	{
248 		mxSettings.settings = mxSettings.getDefaults();
249 	},
250 	save: function()
251 	{
252 		if (isLocalStorage && typeof(JSON) !== 'undefined')
253 		{
254 			try
255 			{
256 				delete mxSettings.settings.isNew;
257 				mxSettings.settings.version = mxSettings.currentVersion;
258 				localStorage.setItem(mxSettings.key, JSON.stringify(mxSettings.settings));
259 			}
260 			catch (e)
261 			{
262 				// ignores quota exceeded
263 			}
264 		}
265 	},
266 	load: function()
267 	{
268 		if (isLocalStorage && typeof(JSON) !== 'undefined')
269 		{
270 			mxSettings.parse(localStorage.getItem(mxSettings.key));
271 		}
272 
273 		if (mxSettings.settings == null)
274 		{
275 			mxSettings.init();
276 		}
277 	},
278 	parse: function(value)
279 	{
280 		var config = (value != null) ? JSON.parse(value) : null;
281 
282 		if (config == null || (config.configVersion != Editor.configVersion) ||
283 			(Editor.config != null && Editor.config.override))
284 		{
285 			mxSettings.settings = null;
286 			mxSettings.init();
287 		}
288 		else
289 		{
290 			mxSettings.settings = config;
291 
292 			if (mxSettings.settings.plugins == null)
293 			{
294 				mxSettings.settings.plugins = [];
295 			}
296 
297 			if (mxSettings.settings.recentColors == null)
298 			{
299 				mxSettings.settings.recentColors = [];
300 			}
301 
302 			if (mxSettings.settings.customFonts == null)
303 			{
304 				mxSettings.settings.customFonts = [];
305 			}
306 
307 			if (mxSettings.settings.libraries == null)
308 			{
309 				mxSettings.settings.libraries = Sidebar.prototype.defaultEntries;
310 			}
311 
312 			if (mxSettings.settings.customLibraries == null)
313 			{
314 				mxSettings.settings.customLibraries = Editor.defaultCustomLibraries;
315 			}
316 
317 			if (mxSettings.settings.ui == null)
318 			{
319 				mxSettings.settings.ui = '';
320 			}
321 
322 			if (mxSettings.settings.formatWidth == null)
323 			{
324 				mxSettings.settings.formatWidth = mxSettings.defaultFormatWidth;
325 			}
326 
327 			if (mxSettings.settings.lastAlert != null)
328 			{
329 				delete mxSettings.settings.lastAlert;
330 			}
331 
332 			if (mxSettings.settings.createTarget == null)
333 			{
334 				mxSettings.settings.createTarget = false;
335 			}
336 
337 			if (mxSettings.settings.pageFormat == null)
338 			{
339 				mxSettings.settings.pageFormat = mxGraph.prototype.pageFormat;
340 			}
341 
342 			if (mxSettings.settings.search == null)
343 			{
344 				mxSettings.settings.search = true;
345 			}
346 
347 			if (mxSettings.settings.showStartScreen == null)
348 			{
349 				mxSettings.settings.showStartScreen = true;
350 			}
351 
352 			if (mxSettings.settings.gridColor == null)
353 			{
354 				mxSettings.settings.gridColor = mxGraphView.prototype.defaultGridColor;
355 			}
356 
357 			if (mxSettings.settings.darkGridColor == null)
358 			{
359 				mxSettings.settings.darkGridColor = mxGraphView.prototype.defaultDarkGridColor;
360 			}
361 
362 			if (mxSettings.settings.autosave == null)
363 			{
364 				mxSettings.settings.autosave = true;
365 			}
366 
367 			if (mxSettings.settings.scratchpadSeen != null)
368 			{
369 				delete mxSettings.settings.scratchpadSeen;
370 			}
371 		}
372 	},
373 	clear: function()
374 	{
375 		if (isLocalStorage)
376 		{
377 			localStorage.removeItem(mxSettings.key);
378 		}
379 	}
380 }
381 
382 /**
383  * Variable: mxLoadSettings
384  *
385  * Optional global config variable to toggle loading the settings. Default is true.
386  *
387  * (code)
388  * <script type="text/javascript">
389  * 		var mxLoadSettings = false;
390  * </script>
391  * (end)
392  */
393 if (typeof(mxLoadSettings) == 'undefined' || mxLoadSettings)
394 {
395 	// Loads initial content
396 	mxSettings.load();
397 }
398