Lines 43-58
Link Here
|
43 |
import org.apache.poi.hssf.model.ConvertAnchor; |
43 |
import org.apache.poi.hssf.model.ConvertAnchor; |
44 |
import org.apache.poi.hssf.model.DrawingManager2; |
44 |
import org.apache.poi.hssf.model.DrawingManager2; |
45 |
import org.apache.poi.hssf.model.TextboxShape; |
45 |
import org.apache.poi.hssf.model.TextboxShape; |
46 |
import org.apache.poi.hssf.usermodel.HSSFAnchor; |
46 |
import org.apache.poi.hssf.usermodel.*; |
47 |
import org.apache.poi.hssf.usermodel.HSSFChildAnchor; |
47 |
import org.apache.poi.hssf.usermodel.HSSFShapeFactory; |
48 |
import org.apache.poi.hssf.usermodel.HSSFClientAnchor; |
|
|
49 |
import org.apache.poi.hssf.usermodel.HSSFPatriarch; |
50 |
import org.apache.poi.hssf.usermodel.HSSFPicture; |
51 |
import org.apache.poi.hssf.usermodel.HSSFShape; |
52 |
import org.apache.poi.hssf.usermodel.HSSFShapeContainer; |
53 |
import org.apache.poi.hssf.usermodel.HSSFShapeGroup; |
54 |
import org.apache.poi.hssf.usermodel.HSSFSimpleShape; |
55 |
import org.apache.poi.hssf.usermodel.HSSFTextbox; |
56 |
import org.apache.poi.util.POILogFactory; |
48 |
import org.apache.poi.util.POILogFactory; |
57 |
import org.apache.poi.util.POILogger; |
49 |
import org.apache.poi.util.POILogger; |
58 |
|
50 |
|
Lines 413-419
Link Here
|
413 |
} |
405 |
} |
414 |
|
406 |
|
415 |
// Decode the shapes |
407 |
// Decode the shapes |
416 |
// agg.escherRecords = new ArrayList(); |
408 |
// agg.escherRecords = new ArrayList(); |
417 |
int pos = 0; |
409 |
int pos = 0; |
418 |
while (pos < buffer.size()) { |
410 |
while (pos < buffer.size()) { |
419 |
EscherRecord r = recordFactory.createRecord(buffer.toByteArray(), pos); |
411 |
EscherRecord r = recordFactory.createRecord(buffer.toByteArray(), pos); |
Lines 453-462
Link Here
|
453 |
records.subList(locFirstDrawingRecord, locLastDrawingRecord).clear(); |
445 |
records.subList(locFirstDrawingRecord, locLastDrawingRecord).clear(); |
454 |
records.add(locFirstDrawingRecord, agg); |
446 |
records.add(locFirstDrawingRecord, agg); |
455 |
|
447 |
|
456 |
|
|
|
457 |
return agg; |
448 |
return agg; |
458 |
} |
449 |
} |
459 |
|
450 |
|
|
|
451 |
public static EscherContainerRecord getMainSpgrContainer(EscherAggregate agg){ |
452 |
EscherContainerRecord topContainer = agg.getEscherContainer(); |
453 |
return topContainer.getChildContainers().get(0); |
454 |
} |
455 |
|
456 |
public static void createShapeTree(EscherContainerRecord container, HSSFShapeContainer shapeGroup, EscherAggregate agg){ |
457 |
for (EscherRecord record: container.getChildRecords()){ |
458 |
if (record instanceof EscherContainerRecord){ |
459 |
if (EscherContainerRecord.SP_CONTAINER == record.getRecordId()){ |
460 |
if (record.getChild(0) instanceof EscherSpgrRecord){ |
461 |
//TODO set properties for HSSFDrawingPatriarch |
462 |
continue; |
463 |
} |
464 |
shapeGroup.addShape(HSSFShapeFactory.createShape(record, (ObjRecord) agg.shapeToObj.get(container.getChildById(EscherClientDataRecord.RECORD_ID)))); |
465 |
continue; |
466 |
} |
467 |
if (EscherContainerRecord.SPGR_CONTAINER == record.getRecordId()){ |
468 |
EscherContainerRecord spContainer = (EscherContainerRecord) container.getChild(0); |
469 |
HSSFShapeGroup group = (HSSFShapeGroup) HSSFShapeFactory.createShape(spContainer, (ObjRecord) agg.shapeToObj.get(spContainer.getChildById(EscherClientDataRecord.RECORD_ID))); |
470 |
shapeGroup.addShape(group); |
471 |
createShapeTree((EscherContainerRecord)record, group, agg); |
472 |
} |
473 |
} |
474 |
} |
475 |
} |
476 |
|
460 |
/** |
477 |
/** |
461 |
* Serializes this aggregate to a byte array. Since this is an aggregate |
478 |
* Serializes this aggregate to a byte array. Since this is an aggregate |
462 |
* record it will effectively serialize the aggregated records. |
479 |
* record it will effectively serialize the aggregated records. |
Lines 466-472
Link Here
|
466 |
* @return The number of bytes serialized. |
483 |
* @return The number of bytes serialized. |
467 |
*/ |
484 |
*/ |
468 |
public int serialize(int offset, byte[] data) { |
485 |
public int serialize(int offset, byte[] data) { |
469 |
convertUserModelToRecords(); |
486 |
// convertUserModelToRecords(); |
470 |
|
487 |
|
471 |
// Determine buffer size |
488 |
// Determine buffer size |
472 |
List records = getEscherRecords(); |
489 |
List records = getEscherRecords(); |
Lines 486-492
Link Here
|
486 |
|
503 |
|
487 |
public void afterRecordSerialize(int offset, short recordId, int size, EscherRecord record) { |
504 |
public void afterRecordSerialize(int offset, short recordId, int size, EscherRecord record) { |
488 |
if (recordId == EscherClientDataRecord.RECORD_ID || recordId == EscherTextboxRecord.RECORD_ID) { |
505 |
if (recordId == EscherClientDataRecord.RECORD_ID || recordId == EscherTextboxRecord.RECORD_ID) { |
489 |
spEndingOffsets.add(Integer.valueOf(offset)); |
506 |
spEndingOffsets.add(offset); |
490 |
shapes.add(record); |
507 |
shapes.add(record); |
491 |
} |
508 |
} |
492 |
} |
509 |
} |
Lines 501-512
Link Here
|
501 |
pos = offset; |
518 |
pos = offset; |
502 |
int writtenEscherBytes = 0; |
519 |
int writtenEscherBytes = 0; |
503 |
for (int i = 1; i < shapes.size(); i++) { |
520 |
for (int i = 1; i < shapes.size(); i++) { |
504 |
int endOffset = ((Integer) spEndingOffsets.get(i)).intValue() - 1; |
521 |
int endOffset; |
|
|
522 |
if (i == shapes.size()-1){ |
523 |
endOffset = buffer.length - 1; |
524 |
} else { |
525 |
endOffset = (Integer) spEndingOffsets.get(i) - 1; |
526 |
} |
505 |
int startOffset; |
527 |
int startOffset; |
506 |
if (i == 1) |
528 |
if (i == 1) |
507 |
startOffset = 0; |
529 |
startOffset = 0; |
508 |
else |
530 |
else |
509 |
startOffset = ((Integer) spEndingOffsets.get(i - 1)).intValue(); |
531 |
startOffset = (Integer) spEndingOffsets.get(i - 1); |
510 |
|
532 |
|
511 |
|
533 |
|
512 |
byte[] drawingData = new byte[endOffset - startOffset + 1]; |
534 |
byte[] drawingData = new byte[endOffset - startOffset + 1]; |
Lines 570-576
Link Here
|
570 |
|
592 |
|
571 |
public int getRecordSize() { |
593 |
public int getRecordSize() { |
572 |
// TODO - convert this to RecordAggregate |
594 |
// TODO - convert this to RecordAggregate |
573 |
convertUserModelToRecords(); |
595 |
// convertUserModelToRecords(); |
574 |
// To determine size of aggregate record we have to know size of each DrawingRecord because if DrawingRecord |
596 |
// To determine size of aggregate record we have to know size of each DrawingRecord because if DrawingRecord |
575 |
// is split into several continue records we have to add header size to total EscherAggregate size |
597 |
// is split into several continue records we have to add header size to total EscherAggregate size |
576 |
int continueRecordsHeadersSize = 0; |
598 |
int continueRecordsHeadersSize = 0; |