RetroZilla/extensions/editor/cascades/resources/content/specificCSSProps.js
2015-10-20 23:03:22 -04:00

320 lines
11 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 CaScadeS, a stylesheet editor for Composer.
*
* The Initial Developer of the Original Code is
* Daniel Glazman.
* Portions created by the Initial Developer are Copyright (C) 2002
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Original author: Daniel Glazman <daniel@glazman.org>
*
* Alternatively, the contents of this file may be used under the terms of
* either 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 ***** */
var gTimerID;
const styleStr = "style";
var textColor, backgroundColor;
var gHaveDocumentUrl = false;
var predefSelector = "";
var gPanel = "";
var gOriginalStyle = "";
// const COMPATIBILITY_TAB = 1;
const GENERAL_TAB = 2;
const TEXT_TAB = 3;
const BACKGROUND_TAB = 4;
const BORDER_TAB = 5;
const BOX_TAB = 6;
const AURAL_TAB = 7;
function doDump(text, value) {
dump("===> " + text + " : " + value + "\n");
}
// dialog initialization code
function Startup()
{
// are we in a pre-1.3 Mozilla ?
if (typeof window.InitEditorShell == "function") {
// yes, so let's get an editorshell
if (!InitEditorShell())
return;
}
else if (typeof window.GetCurrentEditor != "function" || !GetCurrentEditor()) {
window.close();
return;
}
var title = "Styles";
gDialog.selectionBased = false;
gDialog.isSelectionCollapsed = false;
gDialog.selectionInSingleLine = false;
// if a title was provided at window creation, let's use it
if ("arguments" in window && window.arguments.length >= 3) {
gPanel = window.arguments[0];
title = window.arguments[1];
gDialog.selectionBased = window.arguments[2];
}
var w = document.getElementById("specificCssPropsWindow");
if (!w || !gPanel) // we should never hit this but let's be paranoid...
return;
w.setAttribute("title", title);
// gDialog is declared in EdDialogCommon.js
// Set commonly-used widgets like this:
gDialog.textTab = document.getElementById("textTab");
gDialog.brownFoxLabel = document.getElementById("brownFoxLabel");
gDialog.backgroundImageInput = document.getElementById("backgroundImageInput");
gDialog.backgroundPreview = document.getElementById("backgroundPreview");
gDialog.sheetTabbox = document.getElementById("sheetTabbox");
gDialog.backgroundColorInput = document.getElementById("backgroundColorInput");
gDialog.textColorInput = document.getElementById("textColorInput");
gDialog.backgroundRepeatMenulist = document.getElementById("backgroundRepeatMenulist");
gDialog.backgroundAttachmentCheckbox = document.getElementById("backgroundAttachmentCheckbox");
gDialog.xBackgroundPositionRadiogroup = document.getElementById("xBackgroundPositionRadiogroup");
gDialog.yBackgroundPositionRadiogroup = document.getElementById("yBackgroundPositionRadiogroup");
gDialog.fontFamilyRadiogroup = document.getElementById("fontFamilyRadiogroup");
gDialog.customFontFamilyInput = document.getElementById("customFontFamilyInput");
gDialog.predefFontFamilyMenulist = document.getElementById("predefFontFamilyMenulist");
gDialog.fontSizeInput = document.getElementById("fontSizeInput");
gDialog.lineHeightInput = document.getElementById("lineHeightInput");
gDialog.textUnderlineCheckbox = document.getElementById("underlineTextDecorationCheckbox");
gDialog.textOverlineCheckbox = document.getElementById("overlineTextDecorationCheckbox");
gDialog.textLinethroughCheckbox = document.getElementById("linethroughTextDecorationCheckbox");
gDialog.textBlinkCheckbox = document.getElementById("blinkTextDecorationCheckbox");
gDialog.noDecorationCheckbox = document.getElementById("noneTextDecorationCheckbox");
gDialog.topBorderStyleMenulist = document.getElementById("topBorderStyleMenulist");
gDialog.topBorderWidthInput = document.getElementById("topBorderWidthInput");
gDialog.topBorderColorInput = document.getElementById("topBorderColorInput");
gDialog.leftBorderStyleMenulist = document.getElementById("leftBorderStyleMenulist");
gDialog.leftBorderWidthInput = document.getElementById("leftBorderWidthInput");
gDialog.leftBorderColorInput = document.getElementById("leftBorderColorInput");
gDialog.rightBorderStyleMenulist = document.getElementById("rightBorderStyleMenulist");
gDialog.rightBorderWidthInput = document.getElementById("rightBorderWidthInput");
gDialog.rightBorderColorInput = document.getElementById("rightBorderColorInput");
gDialog.bottomBorderStyleMenulist = document.getElementById("bottomBorderStyleMenulist");
gDialog.bottomBorderWidthInput = document.getElementById("bottomBorderWidthInput");
gDialog.bottomBorderColorInput = document.getElementById("bottomBorderColorInput");
gDialog.allFourBordersSame = document.getElementById("allFourBordersSame");
gDialog.borderPreview = document.getElementById("borderPreview");
gDialog.volumeScrollbar = document.getElementById("volumeScrollbar");
gDialog.volumeMenulist = document.getElementById("volumeMenulist");
gDialog.muteVolumeCheckbox = document.getElementById("muteVolumeCheckbox");
gDialog.opacityScrollbar = document.getElementById("opacityScrollbar");
gDialog.opacityLabel = document.getElementById("opacityLabel");
gDialog.modified = false;
gDialog.selectedIndex = -1;
var elt;
if (gDialog.selectionBased)
{
var editor = GetCurrentEditor();
var selection = editor.selection;
gDialog.isSelectionCollapsed = selection.isCollapsed;
if (gDialog.isSelectionCollapsed) {
elt = selection.focusNode;
while (!editor.nodeIsBlock(elt))
elt = elt.parentNode;
}
else
{
var range = selection.getRangeAt(0);
var startNode = range.startContainer;
var startOffset = range.startOffset;
if (startNode.nodeType != Node.TEXT_NODE)
elt = startNode.childNodes.item(startOffset);
else
elt = startNode;
}
}
else
{
elt = window.opener.gContextMenuFiringDocumentElement;
}
if (!elt) return;
if (elt.nodeType == Node.TEXT_NODE)
elt = elt.parentNode;
if (gDialog.selectionBased &&
gDialog.isSelectionCollapsed &&
elt.nodeName.toLowerCase() == "body")
{
// the selection is collapsed in a line directly contained in the BODY
gDialog.selectionInSingleLine = true;
elt = GetCurrentEditor().document.createElement("div");
}
gDialog.selectedObject = elt;
gDialog.selectedHasStyle = elt.hasAttribute("style");
if (gDialog.selectedHasStyle)
gDialog.selectedStyle = elt.getAttribute("style");
gDialog.selectedSheet = null;
InitDialog();
if (gDialog.selectionBased && !gDialog.isSelectionCollapsed)
{
gDialog.selectedObject = GetCurrentEditor().document.createElement("div");
}
// Set window location relative to parent window (based on persisted attributes)
SetWindowLocation();
// Set focus to first widget in dialog, e.g.:
}
function DisableTabIfNotSpecified(id, tabs, firstTab)
{
if (tabs.indexOf(id) == -1) {
/* disable the corresponding tab */
var elt = document.getElementById( id + "Tab" );
elt.setAttribute("collapsed", "true");
}
else
firstTab = id;
return firstTab;
}
function InitDialog()
{
switch (gPanel) {
case "border":
InitBorderTabPanel();
break;
case "text":
InitTextTabPanel();
break;
case "background":
InitBackgroundTabPanel();
break;
case "box":
InitBoxTabPanel();
break;
case "aural":
InitAuralTabPanel();
break;
default:
break;
}
}
function getSelectedBlock()
{
var anchorNode = editorShell.editorSelection.anchorNode;
if (!anchorNode) return null;
var node;
if (anchorNode.firstChild)
{
// Start at actual selected node
var offset = editorShell.editorSelection.anchorOffset;
// Note: If collapsed, offset points to element AFTER caret,
// thus node may be null
node = anchorNode.childNodes.item(offset);
}
if (!node)
node = anchorNode;
while (!nodeIsBlock(node) && node.nodeName.toLowerCase() != "body") {
node = node.parentNode;
}
if (node.nodeName.toLowerCase() == "body") {
node = null;
}
return node;
}
function nodeIsBlock(node)
{
// HR doesn't count because it's not a container
return !node || (node.localName != 'HR' && editorShell.NodeIsBlock(node));
}
function SetModifiedFlagOnStylesheet()
{
/* STUB */
}
function FlushChanges()
{
var editor = GetCurrentEditor();
editor.incrementModificationCount(1);
if (gDialog.selectionBased)
{
var selection = editor.selection;
// we still have to update the selection, the preview is not "live",
// with the styles hold by gDialog.selectedObject
var elt;
if (gDialog.isSelectionCollapsed)
{
// do we have to create a block here or not ?
editor.beginTransaction();
if (gDialog.selectionInSingleLine)
{
// yes, need to create a div around the line
editor.setParagraphFormat("div");
}
elt = selection.focusNode;
while (!editor.nodeIsBlock(elt))
elt = elt.parentNode;
editor.setAttribute(elt, styleStr, gDialog.selectedObject.getAttribute(styleStr));
editor.endTransaction();
}
else
{
// nope, the selection is already in a block, nothing to do here
// the preview is live
// let's reuse Absolute Positioning code here
editor.makeComplexBlock(gDialog.selectedObject.getAttribute(styleStr));
}
}
}
function CancelChanges()
{
if (gDialog.selectedHasStyle)
gDialog.selectedObject.setAttribute("style", gDialog.selectedStyle);
else
gDialog.selectedObject.removeAttribute("style");
}