diff options
| author | Gubolin <gubolin@fantasymail.de> | 2015-03-04 17:46:52 +0100 |
|---|---|---|
| committer | Gubolin <gubolin@fantasymail.de> | 2015-03-04 17:46:52 +0100 |
| commit | 4b2ca15547c88ff9a785d4716011079cf6c7ae09 (patch) | |
| tree | fb0ca1de511927cb4e3f3abc0bcf068b2acf2814 /binary.js | |
| parent | 3af7d0d6100fba5fcc0ce062597d3dea61ef2ea7 (diff) | |
| download | snap-4b2ca15547c88ff9a785d4716011079cf6c7ae09.tar.gz snap-4b2ca15547c88ff9a785d4716011079cf6c7ae09.zip | |
drop "binary mode" support (too difficult to mantain)
Diffstat (limited to 'binary.js')
| -rwxr-xr-x | binary.js | 1099 |
1 files changed, 0 insertions, 1099 deletions
diff --git a/binary.js b/binary.js deleted file mode 100755 index d1a9b21..0000000 --- a/binary.js +++ /dev/null @@ -1,1099 +0,0 @@ -/* - - gui.js - - a programming environment - based on morphic.js, blocks.js, threads.js and objects.js - inspired by Scratch - - written by Jens Mönig - jens@moenig.org - - Copyright (C) 2014 by Jens Mönig - - This file is part of Snap!. - - Snap! is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as - published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. - - - prerequisites: - -------------- - needs blocks.js, threads.js, objects.js and morphic.js - - - toc - --- - the following list shows the order in which all constructors are - defined. Use this list to locate code in this document: - - IDE_Morph - - - credits - ------- - Nathan Dinsmore contributed saving and loading of projects, - ypr-Snap! project conversion and countless bugfixes - Ian Reynolds contributed handling and visualization of sounds - -*/ - -/*global modules, Morph, SpriteMorph, Color, newCanvas, -VariableFrame, Point, MenuMorph, -morphicVersion, DialogBoxMorph, ToggleButtonMorph, contains, -StageMorph, PushButtonMorph, Process, SnapSerializer, MorphicPreferences, -SymbolMorph, -BlockImportDialogMorph, SnapTranslator, localize, List */ - -// Global stuff //////////////////////////////////////////////////////// - -modules.gui = '2014-July-30'; - -// Declarations - -var IDE_Morph; - -// IDE_Morph /////////////////////////////////////////////////////////// - -// I am SNAP's top-level frame, the Editor window - -// IDE_Morph inherits from Morph: - -IDE_Morph.prototype = new Morph(); -IDE_Morph.prototype.constructor = IDE_Morph; -IDE_Morph.uber = Morph.prototype; - -// IDE_Morph preferences settings and skins - -IDE_Morph.prototype.setDefaultDesign = function () { - MorphicPreferences.isFlat = false; - SpriteMorph.prototype.paletteColor = new Color(55, 55, 55); - SpriteMorph.prototype.paletteTextColor = new Color(230, 230, 230); - StageMorph.prototype.paletteTextColor - = SpriteMorph.prototype.paletteTextColor; - StageMorph.prototype.paletteColor = SpriteMorph.prototype.paletteColor; - SpriteMorph.prototype.sliderColor - = SpriteMorph.prototype.paletteColor.lighter(30); - - IDE_Morph.prototype.buttonContrast = 30; - IDE_Morph.prototype.backgroundColor = new Color(40, 40, 40); - IDE_Morph.prototype.frameColor = SpriteMorph.prototype.paletteColor; - - IDE_Morph.prototype.groupColor - = SpriteMorph.prototype.paletteColor.lighter(8); - IDE_Morph.prototype.sliderColor = SpriteMorph.prototype.sliderColor; - IDE_Morph.prototype.buttonLabelColor = new Color(255, 255, 255); - IDE_Morph.prototype.tabColors = [ - IDE_Morph.prototype.groupColor.darker(40), - IDE_Morph.prototype.groupColor.darker(60), - IDE_Morph.prototype.groupColor - ]; - IDE_Morph.prototype.rotationStyleColors = IDE_Morph.prototype.tabColors; - IDE_Morph.prototype.appModeColor = new Color(); - IDE_Morph.prototype.scriptsPaneTexture = 'scriptsPaneTexture.gif'; - IDE_Morph.prototype.padding = 5; -}; - -IDE_Morph.prototype.setFlatDesign = function () { - MorphicPreferences.isFlat = true; - SpriteMorph.prototype.paletteColor = new Color(255, 255, 255); - SpriteMorph.prototype.paletteTextColor = new Color(70, 70, 70); - StageMorph.prototype.paletteTextColor - = SpriteMorph.prototype.paletteTextColor; - StageMorph.prototype.paletteColor = SpriteMorph.prototype.paletteColor; - SpriteMorph.prototype.sliderColor = SpriteMorph.prototype.paletteColor; - - IDE_Morph.prototype.buttonContrast = 30; - IDE_Morph.prototype.backgroundColor = new Color(200, 200, 200); - IDE_Morph.prototype.frameColor = new Color(255, 255, 255); - - IDE_Morph.prototype.groupColor = new Color(230, 230, 230); - IDE_Morph.prototype.sliderColor = SpriteMorph.prototype.sliderColor; - IDE_Morph.prototype.buttonLabelColor = new Color(70, 70, 70); - IDE_Morph.prototype.tabColors = [ - IDE_Morph.prototype.groupColor.lighter(60), - IDE_Morph.prototype.groupColor.darker(10), - IDE_Morph.prototype.groupColor - ]; - IDE_Morph.prototype.rotationStyleColors = [ - IDE_Morph.prototype.groupColor, - IDE_Morph.prototype.groupColor.darker(10), - IDE_Morph.prototype.groupColor.darker(30) - ]; - IDE_Morph.prototype.appModeColor = IDE_Morph.prototype.frameColor; - IDE_Morph.prototype.scriptsPaneTexture = null; - IDE_Morph.prototype.padding = 1; -}; - -IDE_Morph.prototype.setDefaultDesign(); - -// IDE_Morph instance creation: - -function IDE_Morph(isAutoFill) { - this.init(isAutoFill); -} - -IDE_Morph.prototype.init = function (isAutoFill) { - // global font setting - MorphicPreferences.globalFontFamily = 'Helvetica, Arial'; - - // restore saved user preferences - this.userLanguage = null; - - // additional properties: - this.source = 'local'; - this.serializer = new SnapSerializer(); - - this.globalVariables = new VariableFrame(); - this.currentSprite = new SpriteMorph(this.globalVariables); - this.sprites = new List([this.currentSprite]); - this.currentCategory = 'motion'; - this.currentTab = 'scripts'; - this.projectName = ''; - this.projectNotes = ''; - - this.logo = null; - this.controlBar = null; - this.stage = null; - - this.isAutoFill = isAutoFill || true; - - this.filePicker = null; - this.hasChangedMedia = false; - - this.isAnimating = true; - this.stageRatio = 1; // for IDE animations, e.g. when zooming - - this.loadNewProject = false; // flag when starting up translated - this.shield = null; - - // initialize inherited properties: - IDE_Morph.uber.init.call(this); - - // override inherited properites: - this.color = this.appModeColor; -}; - -IDE_Morph.prototype.openIn = function (world) { - var hash; - - this.buildPanes(); - world.add(this); - - this.reactToWorldResize(world.bounds); - - function getURL(url) { - try { - var request = new XMLHttpRequest(); - request.open('GET', url, false); - request.send(); - if (request.status === 200) { - return request.responseText; - } - throw new Error('unable to retrieve ' + url); - } catch (err) { - return; - } - } - - function interpretUrlAnchors() { - if (location.hash.substr(0, 6) === '#open:') { - hash = location.hash.substr(6); - if (hash.charAt(0) === '%' - || hash.search(/\%(?:[0-9a-f]{2})/i) > -1) { - hash = decodeURIComponent(hash); - } - if (contains( - ['project', 'blocks', 'sprites', 'snapdata'].map( - function (each) { - return hash.substr(0, 8).indexOf(each); - } - ), - 1 - )) { - this.droppedText(hash); - } else { - this.droppedText(getURL(hash)); - } - } - } - - if (this.userLanguage) { - this.setLanguage(this.userLanguage, interpretUrlAnchors); - } else { - interpretUrlAnchors.call(this); - } -}; - -// IDE_Morph construction - -IDE_Morph.prototype.buildPanes = function () { - this.createLogo(); - this.createControlBar(); - this.createStage(); -}; - -IDE_Morph.prototype.createLogo = function () { - var myself = this; - - if (this.logo) { - this.logo.destroy(); - } - - this.logo = new Morph(); - this.logo.texture = 'snap_logo_sm.png'; - this.logo.drawNew = function () { - this.image = newCanvas(this.extent()); - var context = this.image.getContext('2d'); - context.fillStyle = this.color; - context.fillRect(0, 0, this.width(), this.height()); - if (this.texture) { - this.drawTexture(this.texture); - } - }; - - this.logo.drawCachedTexture = function () { - var context = this.image.getContext('2d'); - context.drawImage( - this.cachedTexture, - 5, - Math.round((this.height() - this.cachedTexture.height) / 2) - ); - this.changed(); - }; - - this.logo.mouseClickLeft = function () { - myself.snapMenu(); - }; - - this.logo.color = new Color(); - this.logo.setExtent(new Point(200, 28)); // dimensions are fixed - this.add(this.logo); -}; - -IDE_Morph.prototype.createControlBar = function () { - // assumes the logo has already been created - var padding = 5, - button, - stopButton, - pauseButton, - startButton, - x, - colors = [ - this.groupColor, - this.frameColor.darker(50), - this.frameColor.darker(50) - ], - myself = this; - - if (this.controlBar) { - this.controlBar.destroy(); - } - - this.controlBar = new Morph(); - this.controlBar.color = this.appModeColor; - this.controlBar.setHeight(this.logo.height()); // height is fixed - this.controlBar.mouseClickLeft = function () { - this.world().fillPage(); - }; - this.add(this.controlBar); - - // stopButton - button = new PushButtonMorph( - this, - 'stopAllScripts', - new SymbolMorph('octagon', 14) - ); - button.corner = 12; - button.color = colors[0]; - button.highlightColor = colors[1]; - button.pressColor = colors[2]; - button.labelMinExtent = new Point(36, 18); - button.padding = 0; - button.labelShadowOffset = new Point(-1, -1); - button.labelShadowColor = colors[1]; - button.labelColor = new Color(200, 0, 0); - button.contrast = this.buttonContrast; - button.drawNew(); - // button.hint = 'stop\nevery-\nthing'; - button.fixLayout(); - stopButton = button; - this.controlBar.add(stopButton); - - //pauseButton - button = new ToggleButtonMorph( - null, //colors, - myself, // the IDE is the target - 'togglePauseResume', - [ - new SymbolMorph('pause', 12), - new SymbolMorph('pointRight', 14) - ], - function () { // query - return myself.isPaused(); - } - ); - - button.corner = 12; - button.color = colors[0]; - button.highlightColor = colors[1]; - button.pressColor = colors[2]; - button.labelMinExtent = new Point(36, 18); - button.padding = 0; - button.labelShadowOffset = new Point(-1, -1); - button.labelShadowColor = colors[1]; - button.labelColor = new Color(255, 220, 0); - button.contrast = this.buttonContrast; - button.drawNew(); - // button.hint = 'pause/resume\nall scripts'; - button.fixLayout(); - button.refresh(); - pauseButton = button; - this.controlBar.add(pauseButton); - this.controlBar.pauseButton = pauseButton; // for refreshing - - // startButton - button = new PushButtonMorph( - this, - 'pressStart', - new SymbolMorph('flag', 14) - ); - button.corner = 12; - button.color = colors[0]; - button.highlightColor = colors[1]; - button.pressColor = colors[2]; - button.labelMinExtent = new Point(36, 18); - button.padding = 0; - button.labelShadowOffset = new Point(-1, -1); - button.labelShadowColor = colors[1]; - button.labelColor = new Color(0, 200, 0); - button.contrast = this.buttonContrast; - button.drawNew(); - // button.hint = 'start green\nflag scripts'; - button.fixLayout(); - startButton = button; - this.controlBar.add(startButton); - this.controlBar.startButton = startButton; - - this.controlBar.fixLayout = function () { - x = this.right() - padding; - [stopButton, pauseButton, startButton].forEach( - function (button) { - button.setCenter(myself.controlBar.center()); - button.setRight(x); - x -= button.width(); - x -= padding; - } - ); - - x = myself.right() - StageMorph.prototype.dimensions.x; - - this.updateLabel(); - }; - - this.controlBar.updateLabel = function () { - if (this.label) { - this.label.destroy(); - } - }; -}; - -IDE_Morph.prototype.createStage = function () { - // assumes that the logo pane has already been created - if (this.stage) { - this.stage.destroy(); - } - StageMorph.prototype.frameRate = 0; - this.stage = new StageMorph(this.globalVariables); - this.stage.setExtent(this.stage.dimensions); // dimensions are fixed - if (this.currentSprite instanceof SpriteMorph) { - this.currentSprite.setPosition( - this.stage.center().subtract( - this.currentSprite.extent().divideBy(2) - ) - ); - this.stage.add(this.currentSprite); - } - this.add(this.stage); -}; - -IDE_Morph.prototype.createCorral = function () { -}; - -// IDE_Morph resizing - -IDE_Morph.prototype.setExtent = function (point) { - var minExt, - ext; - - // determine the minimum dimensions making sense for the current mode - minExt = StageMorph.prototype.dimensions.add( - this.controlBar.height() + 10 - ); - ext = point.max(minExt); - IDE_Morph.uber.setExtent.call(this, ext); - this.fixLayout(); -}; - -// IDE_Morph events - -IDE_Morph.prototype.reactToWorldResize = function (rect) { - if (this.isAutoFill) { - this.setPosition(rect.origin); - this.setExtent(rect.extent()); - } - if (this.filePicker) { - document.body.removeChild(this.filePicker); - this.filePicker = null; - } -}; - -// IDE_Morph layout - -IDE_Morph.prototype.fixLayout = function () { - var padding = this.padding; - - Morph.prototype.trackChanges = false; - - // controlBar - this.controlBar.setPosition(this.logo.topRight()); - this.controlBar.setWidth(this.right() - this.controlBar.left()); - this.controlBar.fixLayout(); - - // stage - this.stage.setScale(Math.floor(Math.min( - (this.width() - padding * 2) / this.stage.dimensions.x, - (this.height() - this.controlBar.height() * 2 - padding * 2) - / this.stage.dimensions.y - ) * 10) / 10); - this.stage.setCenter(this.center()); - - Morph.prototype.trackChanges = true; - this.changed(); -}; - -IDE_Morph.prototype.droppedText = function (aString, name) { - var lbl = name ? name.split('.')[0] : ''; - if (aString.indexOf('<project') === 0) { - return this.openProjectString(aString); - } - if (aString.indexOf('<snapdata') === 0) { - return this.openCloudDataString(aString); - } - if (aString.indexOf('<blocks') === 0) { - return this.openBlocksString(aString, lbl, true); - } - if (aString.indexOf('<sprites') === 0) { - return this.openSpritesString(aString); - } - if (aString.indexOf('<media') === 0) { - return this.openMediaString(aString); - } -}; - -// IDE_Morph events - -IDE_Morph.prototype.pressStart = function () { - if (this.world().currentKey === 16) { // shiftClicked - this.toggleFastTracking(); - } else { - this.runScripts(); - } -}; - -IDE_Morph.prototype.toggleFastTracking = function () { - if (this.stage.isFastTracked) { - this.stopFastTracking(); - } else { - this.startFastTracking(); - } -}; - -IDE_Morph.prototype.toggleVariableFrameRate = function () { - if (StageMorph.prototype.frameRate) { - StageMorph.prototype.frameRate = 0; - this.stage.fps = 0; - } else { - StageMorph.prototype.frameRate = 30; - this.stage.fps = 30; - } -}; - -IDE_Morph.prototype.startFastTracking = function () { - this.stage.isFastTracked = true; - this.stage.fps = 0; - this.controlBar.startButton.labelString = new SymbolMorph('flash', 14); - this.controlBar.startButton.drawNew(); - this.controlBar.startButton.fixLayout(); -}; - -IDE_Morph.prototype.stopFastTracking = function () { - this.stage.isFastTracked = false; - this.stage.fps = this.stage.frameRate; - this.controlBar.startButton.labelString = new SymbolMorph('flag', 14); - this.controlBar.startButton.drawNew(); - this.controlBar.startButton.fixLayout(); -}; - -IDE_Morph.prototype.runScripts = function () { - this.stage.fireGreenFlagEvent(); -}; - -IDE_Morph.prototype.togglePauseResume = function () { - if (this.stage.threads.isPaused()) { - this.stage.threads.resumeAll(this.stage); - } else { - this.stage.threads.pauseAll(this.stage); - } - this.controlBar.pauseButton.refresh(); -}; - -IDE_Morph.prototype.isPaused = function () { - if (!this.stage) {return false; } - return this.stage.threads.isPaused(); -}; - -IDE_Morph.prototype.stopAllScripts = function () { - this.stage.fireStopAllEvent(); -}; - -IDE_Morph.prototype.selectSprite = function (sprite) { - this.currentSprite = sprite; - this.currentSprite.scripts.fixMultiArgs(); -}; - -// IDE_Morph menus - -IDE_Morph.prototype.snapMenu = function () { - var menu, - world = this.world(); - - menu = new MenuMorph(this); - menu.addItem('About...', 'aboutSnap'); - menu.addLine(); - menu.addItem( - 'Reference manual', - function () { - window.open('help/SnapManual.pdf', 'SnapReferenceManual'); - } - ); - menu.addItem( - 'Snap! website', - function () { - window.open('http://snap.berkeley.edu/', 'SnapWebsite'); - } - ); - menu.addItem( - 'Download source', - function () { - window.open( - 'http://snap.berkeley.edu/snapsource/snap.zip', - 'SnapSource' - ); - } - ); - if (world.isDevMode) { - menu.addLine(); - menu.addItem( - 'Switch back to user mode', - 'switchToUserMode', - 'disable deep-Morphic\ncontext menus' - + '\nand show user-friendly ones', - new Color(0, 100, 0) - ); - } else if (world.currentKey === 16) { // shift-click - menu.addLine(); - menu.addItem( - 'Switch to dev mode', - 'switchToDevMode', - 'enable Morphic\ncontext menus\nand inspectors,' - + '\nnot user-friendly!', - new Color(100, 0, 0) - ); - } - menu.popup(world, this.logo.bottomLeft()); -}; - -// IDE_Morph menu actions - -IDE_Morph.prototype.aboutSnap = function () { - var dlg, aboutTxt, noticeTxt, creditsTxt, versions = '', translations, - module, btn1, btn2, btn3, btn4, licenseBtn, translatorsBtn, - world = this.world(); - - aboutTxt = 'Snap! 4.0\nBuild Your Own Blocks\n\n--- beta ---\n\n' - + 'Copyright \u24B8 2014 Jens M\u00F6nig and ' - + 'Brian Harvey\n' - + 'jens@moenig.org, bh@cs.berkeley.edu\n\n' - - + 'Snap! is developed by the University of California, Berkeley\n' - + ' with support from the National Science Foundation ' - + 'and MioSoft. \n' - - + 'The design of Snap! is influenced and inspired by Scratch,\n' - + 'from the Lifelong Kindergarten group at the MIT Media Lab\n\n' - - + 'for more information see http://snap.berkeley.edu\n' - + 'and http://scratch.mit.edu'; - - noticeTxt = localize('License') - + '\n\n' - + 'Snap! is free software: you can redistribute it and/or modify\n' - + 'it under the terms of the GNU Affero General Public License as\n' - + 'published by the Free Software Foundation, either version 3 of\n' - + 'the License, or (at your option) any later version.\n\n' - - + 'This program is distributed in the hope that it will be useful,\n' - + 'but WITHOUT ANY WARRANTY; without even the implied warranty of\n' - + 'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n' - + 'GNU Affero General Public License for more details.\n\n' - - + 'You should have received a copy of the\n' - + 'GNU Affero General Public License along with this program.\n' - + 'If not, see http://www.gnu.org/licenses/'; - - creditsTxt = localize('Contributors') - + '\n\nNathan Dinsmore: Saving/Loading, Snap-Logo Design, ' - + 'countless bugfixes' - + '\nKartik Chandra: Paint Editor' - + '\nMichael Ball: Time/Date UI, many bugfixes' - + '\n"Ava" Yuan Yuan: Graphic Effects' - + '\nKyle Hotchkiss: Block search design' - + '\nIan Reynolds: UI Design, Event Bindings, ' - + 'Sound primitives' - + '\nIvan Motyashov: Initial Squeak Porting' - + '\nDavide Della Casa: Morphic Optimizations' - + '\nAchal Dave: Web Audio' - + '\nJoe Otto: Morphic Testing and Debugging'; - - for (module in modules) { - if (Object.prototype.hasOwnProperty.call(modules, module)) { - versions += ('\n' + module + ' (' + - modules[module] + ')'); - } - } - if (versions !== '') { - versions = localize('current module versions:') + ' \n\n' + - 'morphic (' + morphicVersion + ')' + - versions; - } - translations = localize('Translations') + '\n' + SnapTranslator.credits(); - - dlg = new DialogBoxMorph(); - dlg.inform('About Snap', aboutTxt, world); - btn1 = dlg.buttons.children[0]; - translatorsBtn = dlg.addButton( - function () { - dlg.body.text = translations; - dlg.body.drawNew(); - btn1.show(); - btn2.show(); - btn3.hide(); - btn4.hide(); - licenseBtn.hide(); - translatorsBtn.hide(); - dlg.fixLayout(); - dlg.drawNew(); - dlg.setCenter(world.center()); - }, - 'Translators...' - ); - btn2 = dlg.addButton( - function () { - dlg.body.text = aboutTxt; - dlg.body.drawNew(); - btn1.show(); - btn2.hide(); - btn3.show(); - btn4.show(); - licenseBtn.show(); - translatorsBtn.hide(); - dlg.fixLayout(); - dlg.drawNew(); - dlg.setCenter(world.center()); - }, - 'Back...' - ); - btn2.hide(); - licenseBtn = dlg.addButton( - function () { - dlg.body.text = noticeTxt; - dlg.body.drawNew(); - btn1.show(); - btn2.show(); - btn3.hide(); - btn4.hide(); - licenseBtn.hide(); - translatorsBtn.hide(); - dlg.fixLayout(); - dlg.drawNew(); - dlg.setCenter(world.center()); - }, - 'License...' - ); - btn3 = dlg.addButton( - function () { - dlg.body.text = versions; - dlg.body.drawNew(); - btn1.show(); - btn2.show(); - btn3.hide(); - btn4.hide(); - licenseBtn.hide(); - translatorsBtn.hide(); - dlg.fixLayout(); - dlg.drawNew(); - dlg.setCenter(world.center()); - }, - 'Modules...' - ); - btn4 = dlg.addButton( - function () { - dlg.body.text = creditsTxt; - dlg.body.drawNew(); - btn1.show(); - btn2.show(); - translatorsBtn.show(); - btn3.hide(); - btn4.hide(); - licenseBtn.hide(); - dlg.fixLayout(); - dlg.drawNew(); - dlg.setCenter(world.center()); - }, - 'Credits...' - ); - translatorsBtn.hide(); - dlg.fixLayout(); - dlg.drawNew(); -}; - -IDE_Morph.prototype.openProjectString = function (str) { - var msg, - myself = this; - this.nextSteps([ - function () { - msg = myself.showMessage('Opening project...'); - }, - function () { - myself.rawOpenProjectString(str); - }, - function () { - msg.destroy(); - } - ]); -}; - -IDE_Morph.prototype.rawOpenProjectString = function (str) { - StageMorph.prototype.hiddenPrimitives = {}; - StageMorph.prototype.codeMappings = {}; - StageMorph.prototype.codeHeaders = {}; - StageMorph.prototype.enableCodeMapping = false; - if (Process.prototype.isCatchingErrors) { - try { - this.serializer.openProject(this.serializer.load(str), this); - } catch (err) { - this.showMessage('Load failed: ' + err); - } - } else { - this.serializer.openProject(this.serializer.load(str), this); - } - this.stopFastTracking(); -}; - -IDE_Morph.prototype.openBlocksString = function (str, name, silently) { - var msg, - myself = this; - this.nextSteps([ - function () { - msg = myself.showMessage('Opening blocks...'); - }, - function () { - myself.rawOpenBlocksString(str, name, silently); - }, - function () { - msg.destroy(); - } - ]); -}; - -IDE_Morph.prototype.rawOpenBlocksString = function (str, name, silently) { - // name is optional (string), so is silently (bool) - var blocks, - myself = this; - if (Process.prototype.isCatchingErrors) { - try { - blocks = this.serializer.loadBlocks(str, myself.stage); - } catch (err) { - this.showMessage('Load failed: ' + err); - } - } else { - blocks = this.serializer.loadBlocks(str, myself.stage); - } - if (silently) { - blocks.forEach(function (def) { - def.receiver = myself.stage; - myself.stage.globalBlocks.push(def); - myself.stage.replaceDoubleDefinitionsFor(def); - }); - this.showMessage( - 'Imported Blocks Module' + (name ? ': ' + name : '') + '.', - 2 - ); - } else { - new BlockImportDialogMorph(blocks, this.stage, name).popUp(); - } -}; - -IDE_Morph.prototype.openSpritesString = function (str) { - var msg, - myself = this; - this.nextSteps([ - function () { - msg = myself.showMessage('Opening sprite...'); - }, - function () { - myself.rawOpenSpritesString(str); - }, - function () { - msg.destroy(); - } - ]); -}; - -IDE_Morph.prototype.rawOpenSpritesString = function (str) { - if (Process.prototype.isCatchingErrors) { - try { - this.serializer.loadSprites(str, this); - } catch (err) { - this.showMessage('Load failed: ' + err); - } - } else { - this.serializer.loadSprites(str, this); - } -}; - -IDE_Morph.prototype.openMediaString = function (str) { - if (Process.prototype.isCatchingErrors) { - try { - this.serializer.loadMedia(str); - } catch (err) { - this.showMessage('Load failed: ' + err); - } - } else { - this.serializer.loadMedia(str); - } - this.showMessage('Imported Media Module.', 2); -}; - -IDE_Morph.prototype.openProject = function (name) { - var str; - if (name) { - this.showMessage('opening project\n' + name); - str = localStorage['-snap-project-' + name]; - this.openProjectString(str); - location.hash = '#open:' + str; - } -}; - -IDE_Morph.prototype.switchToUserMode = function () { - var world = this.world(); - - world.isDevMode = false; - Process.prototype.isCatchingErrors = true; - this.controlBar.updateLabel(); - this.isAutoFill = true; - this.isDraggable = false; - this.siblings().forEach(function (morph) { - if (morph instanceof DialogBoxMorph) { - world.add(morph); // bring to front - } else { - morph.destroy(); - } - }); - this.flushBlocksCache(); - // prevent non-DialogBoxMorphs from being dropped - // onto the World in user-mode - world.reactToDropOf = function (morph) { - if (!(morph instanceof DialogBoxMorph)) { - world.hand.grab(morph); - } - }; - this.showMessage('entering user mode', 1); - -}; - -IDE_Morph.prototype.switchToDevMode = function () { - var world = this.world(); - - world.isDevMode = true; - Process.prototype.isCatchingErrors = false; - this.controlBar.updateLabel(); - this.isAutoFill = false; - this.isDraggable = true; - this.setExtent(world.extent().subtract(100)); - this.setPosition(world.position().add(20)); - this.flushBlocksCache(); - // enable non-DialogBoxMorphs to be dropped - // onto the World in dev-mode - delete world.reactToDropOf; - this.showMessage( - 'entering development mode.\n\n' - + 'error catching is turned off,\n' - + 'use the browser\'s web console\n' - + 'to see error messages.' - ); -}; - -IDE_Morph.prototype.flushBlocksCache = function (category) { - // if no category is specified, the whole cache gets flushed - if (category) { - this.stage.blocksCache[category] = null; - this.stage.children.forEach(function (m) { - if (m instanceof SpriteMorph) { - m.blocksCache[category] = null; - } - }); - } else { - this.stage.blocksCache = {}; - this.stage.children.forEach(function (m) { - if (m instanceof SpriteMorph) { - m.blocksCache = {}; - } - }); - } -}; - -// IDE_Morph localization - -IDE_Morph.prototype.setLanguage = function (lang, callback) { - var translation = document.getElementById('language'), - src = 'lang-' + lang + '.js', - myself = this; - SnapTranslator.unload(); - if (translation) { - document.head.removeChild(translation); - } - if (lang === 'en') { - return this.reflectLanguage('en', callback); - } - myself.userLanguage = lang; - translation = document.createElement('script'); - translation.id = 'language'; - translation.onload = function () { - myself.reflectLanguage(lang, callback); - }; - document.head.appendChild(translation); - translation.src = src; -}; - -IDE_Morph.prototype.reflectLanguage = function (lang, callback) { - var projectData; - SnapTranslator.language = lang; - if (!this.loadNewProject) { - if (Process.prototype.isCatchingErrors) { - try { - projectData = this.serializer.serialize(this.stage); - } catch (err) { - this.showMessage('Serialization failed: ' + err); - } - } else { - projectData = this.serializer.serialize(this.stage); - } - } - SpriteMorph.prototype.initBlocks(); - this.fixLayout(); - if (this.loadNewProject) { - this.newProject(); - } else { - this.openProjectString(projectData); - } - this.saveSetting('language', lang); - if (callback) {callback.call(this); } -}; - -// IDE_Morph synchronous Http data fetching - -IDE_Morph.prototype.getURL = function (url) { - var request = new XMLHttpRequest(), - myself = this; - try { - request.open('GET', url, false); - request.send(); - if (request.status === 200) { - return request.responseText; - } - throw new Error('unable to retrieve ' + url); - } catch (err) { - myself.showMessage(err); - return; - } -}; - -IDE_Morph.prototype.getURLsbeOrRelative = function (url) { - var request = new XMLHttpRequest(), - myself = this; - try { - request.open('GET', 'http://snap.berkeley.edu/snapsource/' + - url, false); - request.send(); - if (request.status === 200) { - return request.responseText; - } - return myself.getURL(url); - } catch (err) { - myself.showMessage(err); - return; - } -}; - -// IDE_Morph user dialog shortcuts - -IDE_Morph.prototype.showMessage = function (message, secs) { - var m = new MenuMorph(null, message), - intervalHandle; - m.popUpCenteredInWorld(this.world()); - if (secs) { - intervalHandle = setInterval(function () { - m.destroy(); - clearInterval(intervalHandle); - }, secs * 1000); - } - return m; -}; - -IDE_Morph.prototype.inform = function (title, message) { - new DialogBoxMorph().inform( - title, - localize(message), - this.world() - ); -}; - -IDE_Morph.prototype.confirm = function (message, title, action) { - new DialogBoxMorph(null, action).askYesNo( - title, - localize(message), - this.world() - ); -}; - -IDE_Morph.prototype.prompt = function (message, callback, choices, key) { - (new DialogBoxMorph(null, callback)).withKey(key).prompt( - message, - '', - this.world(), - null, - choices - ); -}; |
