gerv%gerv.net 8b69962ee3 Bug 236613: change to MPL/LGPL/GPL tri-license.
git-svn-id: svn://10.0.0.236/trunk@155500 18797224-902f-48f8-a5cc-f745e15eee43
2004-04-25 21:07:34 +00:00

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_;
}