360 lines
11 KiB
Java
360 lines
11 KiB
Java
/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* ***** 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.org code.
|
|
*
|
|
* The Initial Developer of the Original Code is
|
|
* Netscape Communications Corporation.
|
|
* Portions created by the Initial Developer are Copyright (C) 1998
|
|
* the Initial Developer. All Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
*
|
|
* 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 ***** */
|
|
|
|
package netscape.plugin.composer.frameEdit;
|
|
|
|
import netscape.plugin.composer.*;
|
|
import netscape.plugin.composer.io.*;
|
|
import java.util.*;
|
|
import java.io.*;
|
|
|
|
import netscape.application.*;
|
|
import netscape.util.*;
|
|
|
|
/** The frame selection. Used to specify a part of the frame model and
|
|
* perform operations on the frame model.
|
|
*/
|
|
|
|
class FrameSelection {
|
|
/** Select top.
|
|
*/
|
|
|
|
public FrameSelection(FrameModel model){
|
|
this(model, model.frames());
|
|
}
|
|
public FrameSelection(FrameSelection selection){
|
|
this(selection.model(), selection.element());
|
|
}
|
|
public FrameSelection(FrameModel model, FrameElement element){
|
|
model_ = model;
|
|
element_ = element;
|
|
}
|
|
public boolean equals(Object other){
|
|
boolean result = false;
|
|
if ( other instanceof FrameSelection ){
|
|
FrameSelection o = (FrameSelection) other;
|
|
result = model_ == o.model_ && element_ == o.element_;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public void selectParent(){
|
|
Frameset parent = parent();
|
|
if ( parent != null ) {
|
|
model().select(new FrameSelection(model(), parent));
|
|
}
|
|
}
|
|
public void selectPreviousSibling(){
|
|
Frameset parent = parent();
|
|
if ( parent != null ) {
|
|
int index = index();
|
|
if ( index > 0 ) {
|
|
model().select(new FrameSelection(model(), parent.elementAt(index - 1)));
|
|
}
|
|
}
|
|
}
|
|
public void selectNextSibling(){
|
|
Frameset parent = parent();
|
|
if ( parent != null ) {
|
|
int index = index();
|
|
if ( index < parent.length() - 1 ) {
|
|
model().select(new FrameSelection(model(), parent.elementAt(index + 1)));
|
|
}
|
|
}
|
|
}
|
|
public void selectFirstChild(){
|
|
if ( element() instanceof Frameset ){
|
|
Frameset frameset = (Frameset) element();
|
|
if ( frameset.length() > 0 ) {
|
|
model().select(new FrameSelection(model(), frameset.elementAt(0)));
|
|
}
|
|
}
|
|
}
|
|
public void selectRoot(){
|
|
Frameset parent = parent();
|
|
Frameset lastFound = null;
|
|
while ( parent != null ){
|
|
lastFound = parent;
|
|
parent = parent.parent();
|
|
}
|
|
if ( lastFound != null ) {
|
|
model().select(new FrameSelection(model(), lastFound));
|
|
}
|
|
}
|
|
|
|
public void propertyChanged(){
|
|
model().propertyChanged(element());
|
|
}
|
|
public void sizeChanged(){
|
|
model().sizeChanged(element());
|
|
}
|
|
public void replace(FrameElement newElement){
|
|
begin();
|
|
try {
|
|
Frameset parent = parent();
|
|
FrameElement element = element();
|
|
if ( parent != null) {
|
|
parent.setElementAt(newElement, index());
|
|
}
|
|
else {
|
|
model().setFrames((Frameset) newElement);
|
|
}
|
|
if ( element != null && newElement instanceof Frameset ) {
|
|
Frameset newFrameset = (Frameset) newElement;
|
|
newFrameset.setElementAt(element, 0);
|
|
model().select(newFrameset.elementAt(1));
|
|
}
|
|
else {
|
|
model().select(newElement);
|
|
}
|
|
model().sync(FrameModel.NOTE_STRUCTURE);
|
|
} finally {
|
|
end();
|
|
}
|
|
}
|
|
public void replaceInline(Frameset frameset){
|
|
begin();
|
|
Frameset parent = parent();
|
|
FrameElement element = element();
|
|
String size = element.size();
|
|
int index = parent.indexOf(element);
|
|
parent.replace(frameset, element);
|
|
parent.setElementAt(element, index);
|
|
element.setSize(size);
|
|
model().select(parent.elementAt(index + 1));
|
|
model().sync(FrameModel.NOTE_STRUCTURE);
|
|
end();
|
|
}
|
|
public void delete(){
|
|
begin();
|
|
Frameset parent = parent();
|
|
if ( parent != null) {
|
|
int index = index();
|
|
parent.removeElementAt(index());
|
|
int length = parent.length();
|
|
if ( index > 0 ) {
|
|
index--;
|
|
}
|
|
if ( index < length){
|
|
model().select(new FrameSelection(model(), parent.elementAt(index)));
|
|
}
|
|
else {
|
|
model().select(new FrameSelection(model(), parent));
|
|
}
|
|
}
|
|
else {
|
|
model().clearFrames();
|
|
model().select(parent);
|
|
}
|
|
model().normalize();
|
|
model().structureChanged();
|
|
end();
|
|
}
|
|
public void split(boolean horizontal, double parametric)
|
|
{
|
|
begin();
|
|
FrameElement element = element();
|
|
Frameset parent = null;
|
|
if ( element instanceof Frameset ) {
|
|
parent = (Frameset) element;
|
|
int children = parent.length();
|
|
if ( children > 0 ) {
|
|
element = parent.elementAt(children-1);
|
|
}
|
|
else {
|
|
element = null;
|
|
}
|
|
}
|
|
else {
|
|
parent = element != null ? element.parent() : null;
|
|
}
|
|
if ( parent != null && element != null && parent.horizontal() == horizontal ) {
|
|
// insert inline
|
|
SizeString size = parent.sizeString();
|
|
int index = parent.indexOf(element);
|
|
size.splitAt(parametric, index);
|
|
Frame copy = new Frame(model().newFrameName()); // (Frame) element.clone();
|
|
parent.insertElementAt(copy, size.sizeAt(index+1), index+1);
|
|
parent.elementAt(index).setSize(size.sizeAt(index));
|
|
model().select(copy);
|
|
model().structureChanged();
|
|
}
|
|
else if ( parent != null ){
|
|
// insert child
|
|
Frameset frameset = new Frameset(horizontal);
|
|
int index = 0;
|
|
if ( element == null ) {
|
|
element = new Frame(model().newFrameName());
|
|
}
|
|
else {
|
|
index = parent.indexOf(element);
|
|
}
|
|
Frame secondFrame = new Frame(model().newFrameName());
|
|
SizeString size = new SizeString("100%");
|
|
size.splitAt(parametric, 0);
|
|
parent.setElementAt(frameset, index);
|
|
frameset.addElement(element, size.sizeAt(0));
|
|
frameset.addElement(secondFrame, size.sizeAt(1));
|
|
model().select(secondFrame);
|
|
}
|
|
else {
|
|
Frame firstFrame = new Frame(model().newFrameName());
|
|
Frame secondFrame = new Frame(model().newFrameName());
|
|
SizeString size = new SizeString("100%");
|
|
size.splitAt(parametric, 0);
|
|
Frameset frameset = new Frameset(horizontal);
|
|
frameset.addElement(firstFrame, size.sizeAt(0));
|
|
frameset.addElement(secondFrame, size.sizeAt(1));
|
|
model().setFrames(frameset);
|
|
model().select(secondFrame);
|
|
}
|
|
model().structureChanged();
|
|
end();
|
|
}
|
|
public Frameset parent() {
|
|
if ( element_ == null ) {
|
|
return null;
|
|
}
|
|
return element_.parent();
|
|
}
|
|
public FrameElement element() {
|
|
return element_;
|
|
}
|
|
public int index() {
|
|
Frameset parent = parent();
|
|
if ( parent == null ) return 0;
|
|
return parent.indexOf(element_);
|
|
}
|
|
public FrameModel model() {
|
|
return model_;
|
|
}
|
|
|
|
public void swap(FrameSelection other){
|
|
begin();
|
|
Frameset.swap(element(), other.element());
|
|
model().structureChanged();
|
|
model().select(other.element());
|
|
end();
|
|
}
|
|
|
|
public void setName(String name){
|
|
Frame frame = (Frame) element();
|
|
frame.setName(name);
|
|
propertyChanged();
|
|
}
|
|
|
|
public void setSource(String url){
|
|
Frame frame = (Frame) element();
|
|
frame.setSource(url);
|
|
propertyChanged();
|
|
}
|
|
|
|
public void setFrameBorder(boolean value){
|
|
element().setFrameBorder(value);
|
|
propertyChanged();
|
|
}
|
|
|
|
public void setSize(String value){
|
|
element().setSize(value);
|
|
propertyChanged();
|
|
}
|
|
|
|
public void setBorderColor(boolean value){
|
|
element().setBorderColor(value);
|
|
propertyChanged();
|
|
}
|
|
|
|
public void setBorderColor(String value){
|
|
element().setBorderColor(value);
|
|
propertyChanged();
|
|
}
|
|
|
|
public void setBorderColor(Color color){
|
|
StringBuffer buffer = new StringBuffer("#");
|
|
append2HexDigets(buffer, color.red());
|
|
append2HexDigets(buffer, color.green());
|
|
append2HexDigets(buffer, color.blue());
|
|
setBorderColor(buffer.toString());
|
|
}
|
|
private void append2HexDigets(StringBuffer buffer, int x){
|
|
String string = Integer.toHexString(x);
|
|
if ( string.length() < 2 ) {
|
|
buffer.append('0');
|
|
}
|
|
buffer.append(string);
|
|
}
|
|
public void setMarginWidth(String value){
|
|
element().setMarginWidth(value);
|
|
propertyChanged();
|
|
}
|
|
|
|
public void setMarginHeight(String value){
|
|
element().setMarginHeight(value);
|
|
propertyChanged();
|
|
}
|
|
|
|
public void setBorder(String value){
|
|
element().setBorder(value);
|
|
propertyChanged();
|
|
}
|
|
|
|
public void setExtraHTML(String value){
|
|
element().setExtraHTML(value);
|
|
propertyChanged();
|
|
}
|
|
|
|
public void setAllowResize(boolean value){
|
|
((Frame) element()).setAllowResize(value);
|
|
propertyChanged();
|
|
}
|
|
|
|
public void setScrolling(int value){
|
|
((Frame) element()).setScrolling(value);
|
|
propertyChanged();
|
|
}
|
|
|
|
public void begin() {
|
|
model_.beginChanges();
|
|
}
|
|
public void end() {
|
|
model_.endChanges();
|
|
}
|
|
private FrameModel model_;
|
|
private FrameElement element_;
|
|
}
|