123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- /* ====================================================================
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- ==================================================================== */
-
- package org.apache.poi.hslf.record;
-
- import java.io.IOException;
- import java.io.OutputStream;
- import java.util.Arrays;
- import java.util.Map;
- import java.util.function.Supplier;
-
- import org.apache.poi.common.usermodel.GenericRecord;
- import org.apache.poi.hslf.exceptions.HSLFException;
- import org.apache.poi.util.GenericRecordUtil;
- import org.apache.poi.util.Internal;
- import org.apache.poi.util.LittleEndian;
-
- /**
- * Holds the geometry of the Slide, and the ID of the placeholders on the slide.
- * Embedded inside a SlideAtom is a SlideAtomLayout, without the usual record header.
- * Since it's a fixed size and tied to the SlideAtom, we'll hold it here.<p>
- *
- * This might eventually merged with the XSLF counterpart
- */
- @Internal
- public class SlideAtomLayout implements GenericRecord {
- // The different kinds of geometry
- public enum SlideLayoutType {
- /** One title and one subtitle placeholder shapes. */
- TITLE_SLIDE(0x0000),
- /** Presentation slide or main master slide layout with one title and one body placeholder shape. */
- TITLE_BODY(0x0001),
- /** Title master slide layout with one title and one subtitle placeholder shape. */
- MASTER_TITLE(0x0002),
- /** ??? (not documented in spec) */
- MASTER_SLIDE(0x0003),
- /** ??? (not documented in spec) */
- MASTER_NOTES(0x0004),
- /** ??? (not documented in spec) */
- NOTES_TITLE_BODY(0x0005),
- /** Only header, footer and date placeholders */
- HANDOUT(0x0006),
- /** Presentation slide layout with one title placeholder shape. */
- TITLE_ONLY(0x0007),
- /** Presentation slide layout with one title and two body placeholder shapes stacked horizontally. */
- TWO_COLUMNS(0x0008),
- /** Presentation slide layout with one title and two body placeholder shapes stacked vertically. */
- TWO_ROWS(0x0009),
- /** Presentation slide layout with one title and three body placeholder shapes split into two columns. The right column has two rows. */
- COLUMN_TWO_ROWS(0x000A),
- /** Presentation slide layout with one title and three body placeholder shapes split into two columns. The left column has two rows. */
- TWO_ROWS_COLUMN(0x000B),
- /** ??? (not documented in spec) */
- TITLE_2_ROW_BOTTOM_2_COLUMN_BODY(0x000C),
- /** Presentation slide layout with one title and three body placeholder shapes split into two rows. The top row has two columns. */
- TWO_COLUMNS_ROW(0x000D),
- /** Presentation slide layout with one title and four body placeholder shapes. */
- FOUR_OBJECTS(0x000E),
- /** Presentation slide layout with one body placeholder shape. */
- BIG_OBJECT(0x000F),
- /** Presentation slide layout with no placeholder shape. */
- BLANK_SLIDE(0x0010),
- /** Presentation slide layout with a vertical title placeholder shape on the right and a body placeholder shape on the left. */
- VERTICAL_TITLE_BODY(0x0011),
- /** Presentation slide layout with a vertical title placeholder shape on the right and two body placeholder shapes in two columns on the left. */
- VERTICAL_TWO_ROWS(0x0012);
-
- private int nativeId;
- SlideLayoutType(int nativeId) {
- this.nativeId = nativeId;
- }
-
- public int getNativeId() {
- return nativeId;
- }
-
- public static SlideLayoutType forNativeID(int nativeId) {
- for (SlideLayoutType ans : values()) {
- if (ans.nativeId == nativeId) {
- return ans;
- }
- }
- return null;
- }
- }
-
- /** What geometry type we are */
- private SlideLayoutType geometry;
- /** What placeholder IDs we have */
- private byte[] placeholderIDs;
-
- /** Retrieve the geometry type */
- public SlideLayoutType getGeometryType() { return geometry; }
- /** Set the geometry type */
- public void setGeometryType(SlideLayoutType geom) { geometry = geom; }
-
- /**
- * Create a new Embedded SSlideLayoutAtom, from 12 bytes of data
- */
- public SlideAtomLayout(byte[] data) {
- if(data.length != 12) {
- throw new HSLFException("SSlideLayoutAtom created with byte array not 12 bytes long - was " + data.length + " bytes in size");
- }
-
- // Grab out our data
- geometry = SlideLayoutType.forNativeID(LittleEndian.getInt(data,0));
- placeholderIDs = Arrays.copyOfRange(data,4, 4+8);
- }
-
- /**
- * Write the contents of the record back, so it can be written
- * to disk. Skips the record header
- */
- public void writeOut(OutputStream out) throws IOException {
- // Write the geometry
- byte[] buf = new byte[4];
- LittleEndian.putInt(buf, 0, geometry == null ? 0 : geometry.getNativeId());
- out.write(buf);
- // Write the placeholder IDs
- out.write(placeholderIDs);
- }
-
- @Override
- public Map<String, Supplier<?>> getGenericProperties() {
- return GenericRecordUtil.getGenericProperties(
- "geometry", this::getGeometryType,
- "placeholderIDs", () -> placeholderIDs
- );
- }
- }
|