123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- 'use strict';
- goog.provide('Blockly.Instances');
- goog.require('Blockly.Workspace');
- goog.require('goog.string');
- Blockly.Instances.NAME_TYPE = 'INSTANCE';
- Blockly.Instances.allInstancesOf = function(instanceType, workspace) {
- var blocks;
- if (workspace.getAllBlocks) {
- blocks = workspace.getAllBlocks();
- } else {
- throw 'Not a valid Workspace: ' + workspace;
- }
- var instanceHash = Object.create(null);
-
- for (var i = 0; i < blocks.length; i++) {
- var blockInstances = blocks[i].getInstances(instanceType);
- for (var j = 0; j < blockInstances.length; j++) {
- var instanceName = blockInstances[j];
-
- if (instanceName) {
- instanceHash[instanceName.toLowerCase()] = instanceName;
- }
- }
- }
-
- var instanceList = [];
- for (var name in instanceHash) {
- instanceList.push(instanceHash[name]);
- }
- return instanceList;
- };
- Blockly.Instances.allInstances = function(workspace) {
- return Blockly.Instances.allInstancesOf(undefined, workspace);
- };
- Blockly.Instances.getAnyInstanceOf = function(instanceType, workspace) {
- var blocks;
- if (workspace.getAllBlocks) {
- blocks = workspace.getAllBlocks();
- } else {
- throw 'Not a valid Workspace: ' + workspace;
- }
- for (var i = 0; i < blocks.length; i++) {
- var blockInstances = blocks[i].getInstances(instanceType);
- if (blockInstances.length) {
- return blockInstances[0];
- }
- }
- };
- Blockly.Instances.isInstancePresent = function(
- instanceName, instanceType, block) {
- var blocks;
- if (block.workspace && block.workspace.getAllBlocks) {
- blocks = block.workspace.getAllBlocks();
- } else {
- throw 'Not a valid block: ' + block;
- }
- for (var i = 0; i < blocks.length; i++) {
- var blockInstances = blocks[i].getInstances(instanceType);
- for (var j = 0; j < blockInstances.length; j++) {
- if ((blockInstances[j] === instanceName) && (blocks[i] !== block)) {
- return true;
- }
- }
- }
- return false;
- };
- Blockly.Instances.renameInstance = function(
- oldName, newName, instanceType, workspace) {
- Blockly.Events.setGroup(true);
- var blocks = workspace.getAllBlocks();
-
- for (var i = 0; i < blocks.length; i++) {
- blocks[i].renameInstance(oldName, newName, instanceType);
- }
- Blockly.Events.setGroup(false);
- };
- Blockly.Instances.generateUniqueName = function(workspace) {
- var combinedList = Blockly.Variables.allVariables(workspace).concat(
- Blockly.Instances.allInstances(workspace));
- var newName = '';
- if (combinedList.length) {
- var nameSuffix = 1;
- var letters = 'ijkmnopqrstuvwxyzabcdefgh';
- var letterIndex = 0;
- var potName = letters.charAt(letterIndex);
- while (!newName) {
- var inUse = false;
- for (var i = 0; i < combinedList.length; i++) {
- if (combinedList[i].toLowerCase() == potName) {
-
- inUse = true;
- break;
- }
- }
- if (inUse) {
-
- letterIndex++;
- if (letterIndex == letters.length) {
-
-
- letterIndex = 0;
- nameSuffix++;
- }
- potName = letters.charAt(letterIndex);
- if (nameSuffix > 1) {
- potName += nameSuffix;
- }
- } else {
-
- newName = potName;
- }
- }
- } else {
- newName = 'i';
- }
- return newName;
- };
- Blockly.Instances.convertToUniqueName = function(instanceName, workspace) {
- var combinedList = Blockly.Variables.allVariables(workspace).concat(
- Blockly.Instances.allInstances(workspace));
- return Blockly.Instances.appendToName_(instanceName, combinedList);
- };
- Blockly.Instances.convertToUniqueNameBlock = function(instanceName, block) {
- var blocks;
- if (block.workspace) {
- blocks = block.workspace.getAllBlocks();
- } else {
- throw 'Not a valid Workspace: ' + workspace;
- }
- var instanceHash = Object.create(null);
-
- for (var i = 0; i < blocks.length; i++) {
-
- if (blocks[i] !== block) {
- var blockInstances = blocks[i].getInstances();
- for (var j = 0; j < blockInstances.length; j++) {
- var blockInstanceName = blockInstances[j];
-
- if (blockInstanceName) {
- instanceHash[blockInstanceName.toLowerCase()] = blockInstanceName;
- }
- }
- }
- }
-
- var instanceList = [];
- for (var name in instanceHash) {
- instanceList.push(instanceHash[name]);
- }
- var combinedList = Blockly.Variables.allVariables(block.workspace).concat(
- instanceList);
- return Blockly.Instances.appendToName_(instanceName, combinedList);
- };
- Blockly.Instances.appendToName_ = function(instanceName, nameList) {
- if (!instanceName) {
- return Blockly.Instances.generateUniqueName(workspace);
- } else {
- var newName = instanceName;
- var nameSuffix = 2;
- if (instanceName.match(/_\d+$/)) {
-
- var instanceNameSuffix = instanceName.match(/\d+$/)[0];
- instanceName = instanceName.slice(
- 0, (instanceNameSuffix.length * -1) - 1);
- nameSuffix = parseInt(instanceNameSuffix, 10) + 1;
- newName = instanceName + '_' + nameSuffix;
- }
- while (nameList.indexOf(newName) !== -1) {
- newName = instanceName + '_' + nameSuffix++;
- }
- return newName;
- }
- };
|