gecko/editor/ui/dialogs/content/EdInsertTable.js

253 lines
8.3 KiB
JavaScript

/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Communicator client code, released
* March 31, 1998.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998-1999
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
//Cancel() is in EdDialogCommon.js
var gTableElement = null;
var gRows;
var gColumns;
var gActiveEditor;
// dialog initialization code
function Startup()
{
gActiveEditor = GetCurrentTableEditor();
if (!gActiveEditor)
{
dump("Failed to get active editor!\n");
window.close();
return;
}
try {
gTableElement = gActiveEditor.createElementWithDefaults("table");
} catch (e) {}
if(!gTableElement)
{
dump("Failed to create a new table!\n");
window.close();
return;
}
gDialog.rowsInput = document.getElementById("rowsInput");
gDialog.columnsInput = document.getElementById("columnsInput");
gDialog.widthInput = document.getElementById("widthInput");
gDialog.borderInput = document.getElementById("borderInput");
gDialog.widthPixelOrPercentMenulist = document.getElementById("widthPixelOrPercentMenulist");
gDialog.OkButton = document.documentElement.getButton("accept");
// Make a copy to use for AdvancedEdit
globalElement = gTableElement.cloneNode(false);
try {
if (GetPrefs().getBoolPref("editor.use_css") && IsHTMLEditor()
&& !(gActiveEditor.flags & Components.interfaces.nsIPlaintextEditor.eEditorMailMask))
{
// only for Composer and not for htmlmail
globalElement.setAttribute("style", "text-align: left;");
}
} catch (e) {}
// Initialize all widgets with image attributes
InitDialog();
// Set initial number to 2 rows, 2 columns:
// Note, these are not attributes on the table,
// so don't put them in InitDialog(),
// else the user's values will be trashed when they use
// the Advanced Edit dialog
gDialog.rowsInput.value = 2;
gDialog.columnsInput.value = 2;
// If no default value on the width, set to 100%
if (gDialog.widthInput.value.length == 0)
{
gDialog.widthInput.value = "100";
gDialog.widthPixelOrPercentMenulist.selectedIndex = 1;
}
SetTextboxFocusById("rowsInput");
SetWindowLocation();
}
// Set dialog widgets with attribute data
// We get them from globalElement copy so this can be used
// by AdvancedEdit(), which is shared by all property dialogs
function InitDialog()
{
// Get default attributes set on the created table:
// Get the width attribute of the element, stripping out "%"
// This sets contents of menu combobox list
// 2nd param = null: Use current selection to find if parent is table cell or window
gDialog.widthInput.value = InitPixelOrPercentMenulist(globalElement, null, "width", "widthPixelOrPercentMenulist", gPercent);
gDialog.borderInput.value = globalElement.getAttribute("border");
}
function ChangeRowOrColumn(id)
{
// Allow only integers
forceInteger(id);
// Enable OK only if both rows and columns have a value > 0
var enable = gDialog.rowsInput.value.length > 0 &&
gDialog.rowsInput.value > 0 &&
gDialog.columnsInput.value.length > 0 &&
gDialog.columnsInput.value > 0;
SetElementEnabled(gDialog.OkButton, enable);
SetElementEnabledById("AdvancedEditButton1", enable);
}
// Get and validate data from widgets.
// Set attributes on globalElement so they can be accessed by AdvancedEdit()
function ValidateData()
{
gRows = ValidateNumber(gDialog.rowsInput, null, 1, gMaxRows, null, null, true)
if (gValidationError)
return false;
gColumns = ValidateNumber(gDialog.columnsInput, null, 1, gMaxColumns, null, null, true)
if (gValidationError)
return false;
// Set attributes: NOTE: These may be empty strings (last param = false)
ValidateNumber(gDialog.borderInput, null, 0, gMaxPixels, globalElement, "border", false);
// TODO: Deal with "BORDER" without value issue
if (gValidationError) return false;
ValidateNumber(gDialog.widthInput, gDialog.widthPixelOrPercentMenulist,
1, gMaxTableSize, globalElement, "width", false);
if (gValidationError)
return false;
return true;
}
function onAccept()
{
if (ValidateData())
{
gActiveEditor.beginTransaction();
try {
gActiveEditor.cloneAttributes(gTableElement, globalElement);
// Create necessary rows and cells for the table
var tableBody = gActiveEditor.createElementWithDefaults("tbody");
if (tableBody)
{
gTableElement.appendChild(tableBody);
// Create necessary rows and cells for the table
for (var i = 0; i < gRows; i++)
{
var newRow = gActiveEditor.createElementWithDefaults("tr");
if (newRow)
{
tableBody.appendChild(newRow);
for (var j = 0; j < gColumns; j++)
{
var newCell = gActiveEditor.createElementWithDefaults("td");
if (newCell)
{
newRow.appendChild(newCell);
}
}
}
}
}
// Detect when entire cells are selected:
// Get number of cells selected
var tagNameObj = { value: "" };
var countObj = { value: 0 };
var element = gActiveEditor.getSelectedOrParentTableElement(tagNameObj, countObj);
var deletePlaceholder = false;
if (tagNameObj.value == "table")
{
//Replace entire selected table with new table, so delete the table
gActiveEditor.deleteTable();
}
else if (tagNameObj.value == "td")
{
if (countObj.value >= 1)
{
if (countObj.value > 1)
{
// Assume user wants to replace a block of
// contiguous cells with a table, so
// join the selected cells
gActiveEditor.joinTableCells(false);
// Get the cell everything was merged into
element = gActiveEditor.getFirstSelectedCell();
// Collapse selection into just that cell
gActiveEditor.selection.collapse(element,0);
}
if (element)
{
// Empty just the contents of the cell
gActiveEditor.deleteTableCellContents();
// Collapse selection to start of empty cell...
gActiveEditor.selection.collapse(element,0);
// ...but it will contain a <br> placeholder
deletePlaceholder = true;
}
}
}
// true means delete selection when inserting
gActiveEditor.insertElementAtSelection(gTableElement, true);
if (deletePlaceholder && gTableElement && gTableElement.nextSibling)
{
// Delete the placeholder <br>
gActiveEditor.deleteNode(gTableElement.nextSibling);
}
} catch (e) {}
gActiveEditor.endTransaction();
SaveWindowLocation();
return true;
}
return false;
}