You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

HeadersFooters.java 8.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. /* ====================================================================
  2. Licensed to the Apache Software Foundation (ASF) under one or more
  3. contributor license agreements. See the NOTICE file distributed with
  4. this work for additional information regarding copyright ownership.
  5. The ASF licenses this file to You under the Apache License, Version 2.0
  6. (the "License"); you may not use this file except in compliance with
  7. the License. You may obtain a copy of the License at
  8. http://www.apache.org/licenses/LICENSE-2.0
  9. Unless required by applicable law or agreed to in writing, software
  10. distributed under the License is distributed on an "AS IS" BASIS,
  11. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. See the License for the specific language governing permissions and
  13. limitations under the License.
  14. ==================================================================== */
  15. package org.apache.poi.hslf.model;
  16. import org.apache.poi.hslf.record.CString;
  17. import org.apache.poi.hslf.record.Document;
  18. import org.apache.poi.hslf.record.HeadersFootersAtom;
  19. import org.apache.poi.hslf.record.HeadersFootersContainer;
  20. import org.apache.poi.hslf.record.OEPlaceholderAtom;
  21. import org.apache.poi.hslf.record.Record;
  22. import org.apache.poi.hslf.record.RecordTypes;
  23. import org.apache.poi.hslf.record.SheetContainer;
  24. import org.apache.poi.hslf.usermodel.HSLFSheet;
  25. import org.apache.poi.hslf.usermodel.HSLFSlideShow;
  26. import org.apache.poi.hslf.usermodel.HSLFTextShape;
  27. /**
  28. * Header / Footer settings.
  29. *
  30. * You can get these on slides, or across all notes
  31. */
  32. public final class HeadersFooters {
  33. private final HeadersFootersContainer _container;
  34. private final HSLFSheet _sheet;
  35. private final boolean _ppt2007;
  36. public HeadersFooters(HSLFSlideShow ppt, short headerFooterType) {
  37. this(ppt.getSlideMasters().get(0), headerFooterType);
  38. }
  39. public HeadersFooters(HSLFSheet sheet, short headerFooterType) {
  40. _sheet = sheet;
  41. @SuppressWarnings("resource")
  42. HSLFSlideShow ppt = _sheet.getSlideShow();
  43. Document doc = ppt.getDocumentRecord();
  44. // detect if this ppt was saved in Office2007
  45. String tag = ppt.getSlideMasters().get(0).getProgrammableTag();
  46. _ppt2007 = "___PPT12".equals(tag);
  47. SheetContainer sc = _sheet.getSheetContainer();
  48. HeadersFootersContainer hdd = (HeadersFootersContainer)sc.findFirstOfType(RecordTypes.HeadersFooters.typeID);
  49. // boolean ppt2007 = sc.findFirstOfType(RecordTypes.RoundTripContentMasterId.typeID) != null;
  50. if (hdd == null) {
  51. for (Record ch : doc.getChildRecords()) {
  52. if (ch instanceof HeadersFootersContainer
  53. && ((HeadersFootersContainer) ch).getOptions() == headerFooterType) {
  54. hdd = (HeadersFootersContainer) ch;
  55. break;
  56. }
  57. }
  58. }
  59. if (hdd == null) {
  60. hdd = new HeadersFootersContainer(headerFooterType);
  61. Record lst = doc.findFirstOfType(RecordTypes.List.typeID);
  62. doc.addChildAfter(hdd, lst);
  63. }
  64. _container = hdd;
  65. }
  66. /**
  67. * Headers's text
  68. *
  69. * @return Headers's text
  70. */
  71. public String getHeaderText(){
  72. CString cs = _container == null ? null : _container.getHeaderAtom();
  73. return getPlaceholderText(OEPlaceholderAtom.MasterHeader, cs);
  74. }
  75. /**
  76. * Sets headers's text
  77. *
  78. * @param text headers's text
  79. */
  80. public void setHeaderText(String text){
  81. setHeaderVisible(true);
  82. CString cs = _container.getHeaderAtom();
  83. if (cs == null) {
  84. cs = _container.addHeaderAtom();
  85. }
  86. cs.setText(text);
  87. }
  88. /**
  89. * Footer's text
  90. *
  91. * @return Footer's text
  92. */
  93. public String getFooterText(){
  94. CString cs = _container == null ? null : _container.getFooterAtom();
  95. return getPlaceholderText(OEPlaceholderAtom.MasterFooter, cs);
  96. }
  97. /**
  98. * Sets footers's text
  99. *
  100. * @param text footers's text
  101. */
  102. public void setFootersText(String text){
  103. setFooterVisible(true);
  104. CString cs = _container.getFooterAtom();
  105. if (cs == null) {
  106. cs = _container.addFooterAtom();
  107. }
  108. cs.setText(text);
  109. }
  110. /**
  111. * This is the date that the user wants in the footers, instead of today's date.
  112. *
  113. * @return custom user date
  114. */
  115. public String getDateTimeText(){
  116. CString cs = _container == null ? null : _container.getUserDateAtom();
  117. return getPlaceholderText(OEPlaceholderAtom.MasterDate, cs);
  118. }
  119. /**
  120. * Sets custom user date to be displayed instead of today's date.
  121. *
  122. * @param text custom user date
  123. */
  124. public void setDateTimeText(String text){
  125. setUserDateVisible(true);
  126. setDateTimeVisible(true);
  127. CString cs = _container.getUserDateAtom();
  128. if (cs == null) {
  129. cs = _container.addUserDateAtom();
  130. }
  131. cs.setText(text);
  132. }
  133. /**
  134. * whether the footer text is displayed.
  135. */
  136. public boolean isFooterVisible(){
  137. return isVisible(HeadersFootersAtom.fHasFooter, OEPlaceholderAtom.MasterFooter);
  138. }
  139. /**
  140. * whether the footer text is displayed.
  141. */
  142. public void setFooterVisible(boolean flag){
  143. setFlag(HeadersFootersAtom.fHasFooter, flag);
  144. }
  145. /**
  146. * whether the header text is displayed.
  147. */
  148. public boolean isHeaderVisible(){
  149. return isVisible(HeadersFootersAtom.fHasHeader, OEPlaceholderAtom.MasterHeader);
  150. }
  151. /**
  152. * whether the header text is displayed.
  153. */
  154. public void setHeaderVisible(boolean flag){
  155. setFlag(HeadersFootersAtom.fHasHeader, flag);
  156. }
  157. /**
  158. * whether the date is displayed in the footer.
  159. */
  160. public boolean isDateTimeVisible(){
  161. return isVisible(HeadersFootersAtom.fHasDate, OEPlaceholderAtom.MasterDate);
  162. }
  163. /**
  164. * whether the date is displayed in the footer.
  165. */
  166. public void setDateTimeVisible(boolean flag){
  167. setFlag(HeadersFootersAtom.fHasDate, flag);
  168. }
  169. /**
  170. * whether the custom user date is used instead of today's date.
  171. */
  172. public boolean isUserDateVisible(){
  173. return isVisible(HeadersFootersAtom.fHasUserDate, OEPlaceholderAtom.MasterDate);
  174. }
  175. /**
  176. * whether the date is displayed in the footer.
  177. */
  178. public void setUserDateVisible(boolean flag){
  179. setFlag(HeadersFootersAtom.fHasUserDate, flag);
  180. }
  181. /**
  182. * whether the slide number is displayed in the footer.
  183. */
  184. public boolean isSlideNumberVisible(){
  185. return isVisible(HeadersFootersAtom.fHasSlideNumber, OEPlaceholderAtom.MasterSlideNumber);
  186. }
  187. /**
  188. * whether the slide number is displayed in the footer.
  189. */
  190. public void setSlideNumberVisible(boolean flag){
  191. setFlag(HeadersFootersAtom.fHasSlideNumber, flag);
  192. }
  193. /**
  194. * An integer that specifies the format ID to be used to style the datetime.
  195. *
  196. * @return an integer that specifies the format ID to be used to style the datetime.
  197. */
  198. public int getDateTimeFormat(){
  199. return _container.getHeadersFootersAtom().getFormatId();
  200. }
  201. /**
  202. * An integer that specifies the format ID to be used to style the datetime.
  203. *
  204. * @param formatId an integer that specifies the format ID to be used to style the datetime.
  205. */
  206. public void setDateTimeFormat(int formatId){
  207. _container.getHeadersFootersAtom().setFormatId(formatId);
  208. }
  209. private boolean isVisible(int flag, int placeholderId){
  210. boolean visible;
  211. if(_ppt2007){
  212. HSLFTextShape placeholder = _sheet.getPlaceholder(placeholderId);
  213. visible = placeholder != null && placeholder.getText() != null;
  214. } else {
  215. visible = _container.getHeadersFootersAtom().getFlag(flag);
  216. }
  217. return visible;
  218. }
  219. private String getPlaceholderText(int placeholderId, CString cs){
  220. String text = null;
  221. if (_ppt2007) {
  222. HSLFTextShape placeholder = _sheet.getPlaceholder(placeholderId);
  223. if (placeholder != null) {
  224. text = placeholder.getText();
  225. }
  226. // default text in master placeholders is not visible
  227. if("*".equals(text)) {
  228. text = null;
  229. }
  230. } else {
  231. text = cs == null ? null : cs.getText();
  232. }
  233. return text;
  234. }
  235. private void setFlag(int type, boolean flag) {
  236. _container.getHeadersFootersAtom().setFlag(type, flag);
  237. }
  238. }