/** * Copyright (c) 2011-2018 by Andrew Mustun. All rights reserved. * * This file is part of the QCAD project. * * QCAD is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * QCAD 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with QCAD. */ include("../WidgetFactory.js"); /** * \class BlockDialog * \ingroup ecma_block * * Creates a dialog to edit the attributes of a block (currently name only). * * \param document RDocument the block is in. * \param block RBlock object to edit or undefined to create and return a new block. */ function BlockDialog(document, block, allowOverwrite, allowSameName) { if (isNull(allowOverwrite)) { allowOverwrite = true; } if (isNull(allowSameName)) { allowSameName = false; } this.dialog = null; this.document = document; this.block = block; this.allowOverwrite = allowOverwrite; this.allowSameName = allowSameName; } BlockDialog.includeBasePath = includeBasePath; BlockDialog.prototype.show = function() { var lt; this.dialog = WidgetFactory.createDialog(BlockDialog.includeBasePath, "BlockDialog.ui", EAction.getMainWindow()); var widgets = getWidgets(this.dialog); var leBlockName = widgets["BlockName"]; var rx = new RegExp("[^<>/\\\\\":;\?\*|,=`]{1,255}"); this.validator = new QRegExpValidator(rx, leBlockName); leBlockName.setValidator(this.validator); leBlockName.textChanged.connect(this, this.validate); var creatingBlock = isNull(this.block); if (!creatingBlock) { // user is editing an existing block: // init dialog to show attributes of given block: leBlockName.text = this.block.getName(); if (leBlockName.text.startsWith("*")) { leBlockName.enabled = false; } if (!this.allowSameName) { // creating copy of block: // select name: leBlockName.selectAll(); } } this.dialog.show(); if (creatingBlock) { var c = 0; while (!this.validate()) { ++c; leBlockName.text = qsTr("block", "default block name prefix") + " " + c; } leBlockName.selectAll(); } if (!this.dialog.exec()) { destr(this.dialog); EAction.activateMainWindow(); return undefined; } var text = leBlockName.text.trim(); if (!creatingBlock) { // rename block: destr(this.dialog); EAction.activateMainWindow(); this.block.setName(text); return this.block; } else { // create new block: var block = new RBlock(this.document, text, new RVector(0,0)); destr(this.dialog); EAction.activateMainWindow(); return block; } }; /** * Block name validation. */ BlockDialog.prototype.validate = function() { var widgets = getWidgets(this.dialog); var leBlockName = widgets["BlockName"]; return BlockDialog.validate(this.block, leBlockName.text, this.document, this.dialog, this.validator, this.allowOverwrite, this.allowSameName); }; BlockDialog.validate = function(block, blockName, document, dialog, validator, allowOverwrite, allowSameName) { var creatingBlock = isNull(block); var widgets = getWidgets(dialog); var leBlockName = widgets["BlockName"]; if (isNull(leBlockName)) { return false; } var message = widgets["Message"]; var pos = 0; var acceptable = true; message.clear(); if (leBlockName.text!==leBlockName.text.trim()) { message.text = "" + qsTr("Leading or trailing spaces.") + ""; acceptable = false; } if (leBlockName.text.isEmpty()) { message.text = "" + qsTr("Block name is empty.") + ""; acceptable = false; } else { if (validator.validate(leBlockName.text, pos) != QValidator.Acceptable) { message.text = "" + qsTr("Block name is invalid.") + ""; acceptable = false; } } var ret = acceptable; // block already exists: if (document.hasBlock(leBlockName.text)) { if (creatingBlock && allowOverwrite===true) { // warning: overwriting an existing block: message.text += "" + qsTr("Block \"%1\" already exists
and will be overwritten.").arg(leBlockName.text.toString()) + "
"; acceptable = true; } else if ((isNull(block) || block.getName().toLowerCase() !== leBlockName.text.toLowerCase()) && !allowSameName) { // error: renaming existing block to existing block name (not allowed): message.text = "" + qsTr("Block already exists.") + ""; acceptable = false; } ret = false; } if (!isNull(widgets["ButtonBox"])) { widgets["ButtonBox"].button(QDialogButtonBox.Ok).enabled = acceptable; } return ret; };