textrun.java

来自「EXCEL read and write」· Java 代码 · 共 718 行 · 第 1/2 页

JAVA
718
字号
						break;					}				}								// Flag the change				_byteAtom = null;				_isUnicode = true;			}		}        /**         * If TextSpecInfoAtom is present, we must update the text size in it,         * otherwise the ppt will be corrupted         */        if(_records != null) for (int i = 0; i < _records.length; i++) {            if(_records[i] instanceof TextSpecInfoAtom){                TextSpecInfoAtom specAtom = (TextSpecInfoAtom)_records[i];                if((s.length() + 1) != specAtom.getCharactersCovered()){                    specAtom.reset(s.length() + 1);                }            }        }	}		/**	 * Handles an update to the text stored in one of the Rich Text Runs	 * @param run	 * @param s	 */	public void changeTextInRichTextRun(RichTextRun run, String s) {		// Figure out which run it is		int runID = -1;		for(int i=0; i<_rtRuns.length; i++) {			if(run.equals(_rtRuns[i])) {				runID = i;			}		}		if(runID == -1) {			throw new IllegalArgumentException("Supplied RichTextRun wasn't from this TextRun");		}				// Ensure a StyleTextPropAtom is present, adding if required		ensureStyleAtomPresent();				// Update the text length for its Paragraph and Character stylings		// If it's shared:		//   * calculate the new length based on the run's old text		//   * this should leave in any +1's for the end of block if needed		// If it isn't shared:		//   * reset the length, to the new string's length		//   * add on +1 if the last block		// The last run needs its stylings to be 1 longer than the raw		//  text is. This is to define the stylings that any new text		//  that is added will inherit		TextPropCollection pCol = run._getRawParagraphStyle();		TextPropCollection cCol = run._getRawCharacterStyle();		int newSize = s.length();		if(runID == _rtRuns.length-1) {			newSize++;		}				if(run._isParagraphStyleShared()) {			pCol.updateTextSize( pCol.getCharactersCovered() - run.getLength() + s.length() );		} else {			pCol.updateTextSize(newSize);		}		if(run._isCharacterStyleShared()) {			cCol.updateTextSize( cCol.getCharactersCovered() - run.getLength() + s.length() );		} else {			cCol.updateTextSize(newSize);		}				// Build up the new text		// As we go through, update the start position for all subsequent runs		// The building relies on the old text still being present		StringBuffer newText = new StringBuffer();		for(int i=0; i<_rtRuns.length; i++) {			int newStartPos = newText.length();						// Build up the new text			if(i != runID) {				// Not the affected run, so keep old text				newText.append(_rtRuns[i].getRawText());			} else {				// Affected run, so use new text				newText.append(s);			}						// Do we need to update the start position of this run?			// (Need to get the text before we update the start pos)			if(i <= runID) {				// Change is after this, so don't need to change start position			} else {				// Change has occured, so update start position				_rtRuns[i].updateStartPosition(newStartPos);			}		}				// Now we can save the new text		storeText(newText.toString());	}	/**	 * Changes the text, and sets it all to have the same styling	 *  as the the first character has. 	 * If you care about styling, do setText on a RichTextRun instead 	 */	public void setRawText(String s) {		// Save the new text to the atoms		storeText(s);		RichTextRun fst = _rtRuns[0];		// Finally, zap and re-do the RichTextRuns		for(int i=0; i<_rtRuns.length; i++) { _rtRuns[i] = null; }		_rtRuns = new RichTextRun[1];        _rtRuns[0] = fst;		// Now handle record stylings:		// If there isn't styling		//  no change, stays with no styling		// If there is styling:		//  everthing gets the same style that the first block has		if(_styleAtom != null) {			LinkedList pStyles = _styleAtom.getParagraphStyles();			while(pStyles.size() > 1) { pStyles.removeLast(); }						LinkedList cStyles = _styleAtom.getCharacterStyles();			while(cStyles.size() > 1) { cStyles.removeLast(); }						_rtRuns[0].setText(s);		} else {			// Recreate rich text run with no styling			_rtRuns[0] = new RichTextRun(this,0,s.length());		}	}    /**     * Changes the text.     * Converts '\r' into '\n'     */    public void setText(String s) {        String text = normalize(s);        setRawText(text);    }    /**	 * Ensure a StyleTextPropAtom is present for this run, 	 *  by adding if required. Normally for internal TextRun use.	 */	public void ensureStyleAtomPresent() {		if(_styleAtom != null) {			// All there			return;		}				// Create a new one at the right size		_styleAtom = new StyleTextPropAtom(getRawText().length() + 1);				// Use the TextHeader atom to get at the parent		RecordContainer runAtomsParent = _headerAtom.getParentRecord();				// Add the new StyleTextPropAtom after the TextCharsAtom / TextBytesAtom		Record addAfter = _byteAtom;		if(_byteAtom == null) { addAfter = _charAtom; }		runAtomsParent.addChildAfter(_styleAtom, addAfter);				// Feed this to our sole rich text run		if(_rtRuns.length != 1) {			throw new IllegalStateException("Needed to add StyleTextPropAtom when had many rich text runs");		}		// These are the only styles for now 		_rtRuns[0].supplyTextProps(				(TextPropCollection)_styleAtom.getParagraphStyles().get(0),				(TextPropCollection)_styleAtom.getCharacterStyles().get(0),				false,				false		);	}	// Accesser methods follow	/**	 * Returns the text content of the run, which has been made safe	 * for printing and other use.	 */	public String getText() {		String rawText = getRawText();		// PowerPoint seems to store files with \r as the line break		// The messes things up on everything but a Mac, so translate		//  them to \n		String text = rawText.replace('\r','\n');        int type = _headerAtom == null ? 0 : _headerAtom.getTextType();        if(type == TextHeaderAtom.TITLE_TYPE || type == TextHeaderAtom.CENTER_TITLE_TYPE){            //0xB acts like cariage return in page titles and like blank in the others            text = text.replace((char) 0x0B, '\n');        } else {            text = text.replace((char) 0x0B, ' ');        }		return text;	}	/**	* Returns the raw text content of the run. This hasn't had any	*  changes applied to it, and so is probably unlikely to print	*  out nicely.	*/	public String getRawText() {		if(_isUnicode) {			return _charAtom.getText();		} else {			return _byteAtom.getText();		}	}		/**	 * Fetch the rich text runs (runs of text with the same styling) that	 *  are contained within this block of text	 */	public RichTextRun[] getRichTextRuns() {		return 	_rtRuns;	}		/**	* Returns the type of the text, from the TextHeaderAtom.	* Possible values can be seen from TextHeaderAtom	* @see org.apache.poi.hslf.record.TextHeaderAtom	*/	public int getRunType() { 		return _headerAtom.getTextType();	}	/**	* Changes the type of the text. Values should be taken	*  from TextHeaderAtom. No checking is done to ensure you	*  set this to a valid value!	* @see org.apache.poi.hslf.record.TextHeaderAtom	*/	public void setRunType(int type) {		_headerAtom.setTextType(type);	}		/**	 * Supply the SlideShow we belong to.	 * Also passes it on to our child RichTextRuns	 */	public void supplySlideShow(SlideShow ss) {		slideShow = ss;		if(_rtRuns != null) {			for(int i=0; i<_rtRuns.length; i++) {				_rtRuns[i].supplySlideShow(slideShow);			}		}	}    public void setSheet(Sheet sheet){        this.sheet = sheet;    }    public Sheet getSheet(){        return this.sheet;            }    /**     * @return  Shape ID     */    protected int getShapeId(){        return shapeId;    }    /**     *  @param id Shape ID     */    protected void setShapeId(int id){        shapeId = id;    }    /**     * @return  0-based index of the text run in the SLWT container     */    protected int getIndex(){        return slwtIndex;    }    /**     *  @param id 0-based index of the text run in the SLWT container     */    protected void setIndex(int id){        slwtIndex = id;    }    /**     * Returns the array of all hyperlinks in this text run     *     * @return the array of all hyperlinks in this text run     * or <code>null</code> if not found.     */    public Hyperlink[] getHyperlinks(){        return Hyperlink.find(this);    }    /**     * Fetch RichTextRun at a given position     *     * @param pos 0-based index in the text     * @return RichTextRun or null if not found     */    public RichTextRun getRichTextRunAt(int pos){        for (int i = 0; i < _rtRuns.length; i++) {            int start = _rtRuns[i].getStartIndex();            int end = _rtRuns[i].getEndIndex();            if(pos >= start && pos < end) return _rtRuns[i];        }        return null;    }    public TextRulerAtom getTextRuler(){        if(_ruler == null){            if(_records != null) for (int i = 0; i < _records.length; i++) {                if(_records[i] instanceof TextRulerAtom) {                    _ruler = (TextRulerAtom)_records[i];                    break;                }            }        }        return _ruler;    }    public TextRulerAtom createTextRuler(){        _ruler = getTextRuler();        if(_ruler == null){            _ruler = TextRulerAtom.getParagraphInstance();            _headerAtom.getParentRecord().appendChildRecord(_ruler);        }        return _ruler;    }    /**     * Returns a new string with line breaks converted into internal ppt representation     */    public String normalize(String s){        String ns = s.replaceAll("\\r?\\n", "\r");        return ns;    }    /**     * Returns records that make up this text run     *     * @return text run records     */    public Record[] getRecords(){        return _records;    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?