| /******************************************************************************* |
| * Copyright (c) 2004 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.wst.css.core.internal.document; |
| |
| |
| |
| import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion; |
| import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion; |
| import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList; |
| |
| /** |
| * |
| */ |
| abstract class CSSRegionContainer extends CSSNodeImpl { |
| |
| private ITextRegion fFirstRegion = null; |
| private ITextRegion fLastRegion = null; |
| private IStructuredDocumentRegion fParentRegion = null; |
| |
| /** |
| * CSSRegionContainer constructor comment. |
| */ |
| CSSRegionContainer() { |
| super(); |
| } |
| |
| CSSRegionContainer(CSSRegionContainer that) { |
| super(that); |
| } |
| |
| /** |
| * @return java.lang.String |
| */ |
| public String getCssText() { |
| if (fFirstRegion == null || fLastRegion == null) |
| return generateSource(); |
| |
| ITextRegionList regions = fParentRegion.getRegions(); |
| StringBuffer source = new StringBuffer(); |
| boolean bIn = false; |
| for (int i = 0; i < regions.size(); i++) { |
| ITextRegion current = regions.get(i); |
| if (bIn) { |
| source.append(fParentRegion.getText(current)); |
| if (current == fLastRegion) |
| break; |
| } |
| else { |
| if (current == fFirstRegion) { |
| bIn = true; |
| source.append(fParentRegion.getText(current)); |
| if (current == fLastRegion) |
| break; |
| } |
| } |
| } |
| |
| return source.toString(); |
| } |
| |
| /** |
| * @return int |
| */ |
| public int getEndOffset() { |
| int result = -1; |
| ITextRegion region = getLastRegion(); |
| if (!(region == null || fParentRegion == null)) { |
| result = fParentRegion.getEndOffset(region); |
| } |
| return result; |
| } |
| |
| IStructuredDocumentRegion getDocumentRegion() { |
| return fParentRegion; |
| } |
| |
| ITextRegion getFirstRegion() { |
| return fFirstRegion; |
| } |
| |
| ITextRegion getLastRegion() { |
| return fLastRegion; |
| } |
| |
| ITextRegion getRegion(int index) { |
| if (getFirstRegion() == null) |
| return null; |
| ITextRegionList regions = fParentRegion.getRegions(); |
| |
| for (int i = 0; i < regions.size(); i++) { |
| if (regions.get(i) == getFirstRegion()) { |
| if (i + index < regions.size()) { |
| ITextRegion target = regions.get(i + index); |
| if (target.getStart() <= getLastRegion().getStart()) |
| return target; |
| } |
| return null; |
| } |
| } |
| return null; |
| } |
| |
| /** |
| * @return int |
| */ |
| int getRegionCount() { |
| validateRange(); |
| |
| if (getFirstRegion() == null) |
| return 0; |
| if (getFirstRegion() == getLastRegion()) |
| return 1; |
| ITextRegionList regions = fParentRegion.getRegions(); |
| |
| int j = 0; |
| for (int i = 0; i < regions.size(); i++) { |
| ITextRegion current = regions.get(i); |
| if (j != 0 || current == getFirstRegion()) |
| j++; |
| if (current == getLastRegion()) |
| break; |
| } |
| return j; |
| } |
| |
| /** |
| * @return int |
| */ |
| public int getStartOffset() { |
| int result = -1; |
| ITextRegion region = getFirstRegion(); |
| if (!(region == null || fParentRegion == null)) { |
| result = fParentRegion.getStartOffset(region); |
| } |
| return result; |
| } |
| |
| |
| |
| /** |
| * @deprecated |
| */ |
| ITextRegion setFirstRegion(ITextRegion region) { |
| this.fFirstRegion = region; |
| return region; |
| } |
| |
| /** |
| * @deprecated |
| */ |
| ITextRegion setLastRegion(ITextRegion lastRegion) { |
| this.fLastRegion = lastRegion; |
| return lastRegion; |
| } |
| |
| void setRangeRegion(IStructuredDocumentRegion parentRegion, ITextRegion firstRegion, ITextRegion lastRegion) { |
| this.fParentRegion = parentRegion; |
| this.fFirstRegion = firstRegion; |
| this.fLastRegion = lastRegion; |
| |
| if (firstRegion == null && lastRegion == null) { |
| setFirstRegion(null); |
| setLastRegion(null); |
| } |
| else { // range validation |
| validateRange(); |
| } |
| } |
| |
| /** |
| * @return boolean |
| */ |
| private boolean validateRange() { |
| boolean bModified = false; |
| |
| if (this.fFirstRegion != null || this.fLastRegion != null) { |
| if (this.fFirstRegion == null) { |
| this.fFirstRegion = this.fLastRegion; |
| bModified = true; |
| } |
| else if (this.fLastRegion == null) { |
| this.fLastRegion = this.fFirstRegion; |
| bModified = true; |
| } |
| else if (this.fFirstRegion.getStart() > this.fLastRegion.getStart()) { |
| // need to swap first for last |
| ITextRegion reg = fFirstRegion; |
| fFirstRegion = fLastRegion; |
| fLastRegion = reg; |
| bModified = true; |
| } |
| } |
| return bModified; |
| } |
| } |