📄 textrun.java
字号:
} else { // Need to swap a TextBytesAtom for a TextCharsAtom // Build the new TextCharsAtom _charAtom = new TextCharsAtom(); _charAtom.setText(s); // Use the TextHeaderAtom to do the swap on the parent RecordContainer parent = _headerAtom.getParentRecord(); Record[] cr = parent.getChildRecords(); for(int i=0; i<cr.length; i++) { // Look for TextBytesAtom if(cr[i].equals(_byteAtom)) { // Found it, so replace, then all done cr[i] = _charAtom; break; } } // Flag the change _byteAtom = null; _isUnicode = true; } } } /** * Handles an update to the text stored in one of the Rich Text Runs * @param run * @param s */ public synchronized 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 synchronized void setText(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()); } } /** * Ensure a StyleTextPropAtom is present for this run, * by adding if required. Normally for internal TextRun use. */ public synchronized 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'); 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 * @return */ 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; } /** * 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); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -