001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017: package org.apache.poi.hslf.record;
018:
019: import java.io.IOException;
020: import java.io.OutputStream;
021:
022: import org.apache.poi.util.LittleEndian;
023:
024: /**
025: * This class represents a comment on a slide, in the format used by
026: * PPT 2000/XP/etc. (PPT 97 uses plain Escher Text Boxes for comments)
027: * @author Nick Burch
028: */
029: public class Comment2000 extends RecordContainer {
030: private byte[] _header;
031: private static long _type = 12000;
032:
033: // Links to our more interesting children
034: private CString authorRecord;
035: private CString authorInitialsRecord;
036: private CString commentRecord;
037: private Comment2000Atom commentAtom;
038:
039: /**
040: * Returns the Comment2000Atom of this Comment
041: */
042: public Comment2000Atom getComment2000Atom() {
043: return commentAtom;
044: }
045:
046: /**
047: * Get the Author of this comment
048: */
049: public String getAuthor() {
050: return authorRecord.getText();
051: }
052:
053: /**
054: * Set the Author of this comment
055: */
056: public void setAuthor(String author) {
057: authorRecord.setText(author);
058: }
059:
060: /**
061: * Get the Author's Initials of this comment
062: */
063: public String getAuthorInitials() {
064: return authorInitialsRecord.getText();
065: }
066:
067: /**
068: * Set the Author's Initials of this comment
069: */
070: public void setAuthorInitials(String initials) {
071: authorInitialsRecord.setText(initials);
072: }
073:
074: /**
075: * Get the text of this comment
076: */
077: public String getText() {
078: return commentRecord.getText();
079: }
080:
081: /**
082: * Set the text of this comment
083: */
084: public void setText(String text) {
085: commentRecord.setText(text);
086: }
087:
088: /**
089: * Set things up, and find our more interesting children
090: */
091: protected Comment2000(byte[] source, int start, int len) {
092: // Grab the header
093: _header = new byte[8];
094: System.arraycopy(source, start, _header, 0, 8);
095:
096: // Find our children
097: _children = Record.findChildRecords(source, start + 8, len - 8);
098: findInterestingChildren();
099: }
100:
101: /**
102: * Go through our child records, picking out the ones that are
103: * interesting, and saving those for use by the easy helper
104: * methods.
105: */
106: private void findInterestingChildren() {
107: // First child should be the author
108: if (_children[0] instanceof CString) {
109: authorRecord = (CString) _children[0];
110: } else {
111: throw new IllegalStateException(
112: "First child record wasn't a CString, was of type "
113: + _children[0].getRecordType());
114: }
115: // Second child should be the text
116: if (_children[1] instanceof CString) {
117: commentRecord = (CString) _children[1];
118: } else {
119: throw new IllegalStateException(
120: "Second child record wasn't a CString, was of type "
121: + _children[1].getRecordType());
122: }
123: // Third child should be the author's initials
124: if (_children[2] instanceof CString) {
125: authorInitialsRecord = (CString) _children[2];
126: } else {
127: throw new IllegalStateException(
128: "Third child record wasn't a CString, was of type "
129: + _children[2].getRecordType());
130: }
131: // Fourth child should be the comment atom
132: if (_children[3] instanceof Comment2000Atom) {
133: commentAtom = (Comment2000Atom) _children[3];
134: } else {
135: throw new IllegalStateException(
136: "Fourth child record wasn't a Comment2000Atom, was of type "
137: + _children[3].getRecordType());
138: }
139: }
140:
141: /**
142: * Create a new Comment2000, with blank fields
143: */
144: public Comment2000() {
145: _header = new byte[8];
146: _children = new Record[4];
147:
148: // Setup our header block
149: _header[0] = 0x0f; // We are a container record
150: LittleEndian.putShort(_header, 2, (short) _type);
151:
152: // Setup our child records
153: CString csa = new CString();
154: CString csb = new CString();
155: CString csc = new CString();
156: csa.setCount(0x00);
157: csb.setCount(0x10);
158: csc.setCount(0x20);
159: _children[0] = csa;
160: _children[1] = csb;
161: _children[2] = csc;
162: _children[3] = new Comment2000Atom();
163: findInterestingChildren();
164: }
165:
166: /**
167: * We are of type 1200
168: */
169: public long getRecordType() {
170: return _type;
171: }
172:
173: /**
174: * Write the contents of the record back, so it can be written
175: * to disk
176: */
177: public void writeOut(OutputStream out) throws IOException {
178: writeOut(_header[0], _header[1], _type, _children, out);
179: }
180:
181: }
|