1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski //***************************************************************************
25*b1cdbd2cSJim Jagielski // comment: Step 1: get the Desktop object from the office
26*b1cdbd2cSJim Jagielski //          Step 2: open an empty text document
27*b1cdbd2cSJim Jagielski //          Step 3: enter a example text
28*b1cdbd2cSJim Jagielski //          Step 4: insert some bookmarks
29*b1cdbd2cSJim Jagielski //
30*b1cdbd2cSJim Jagielski //          Chapter 5.1.1.4 Inserting bookmarks
31*b1cdbd2cSJim Jagielski //***************************************************************************
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski import com.sun.star.uno.UnoRuntime;
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski public class BookmarkInsertion {
36*b1cdbd2cSJim Jagielski 
main(String args[])37*b1cdbd2cSJim Jagielski     public static void main(String args[]) {
38*b1cdbd2cSJim Jagielski         // You need the desktop to create a document
39*b1cdbd2cSJim Jagielski         // The getDesktop method does the UNO bootstrapping, gets the
40*b1cdbd2cSJim Jagielski         // remote servie manager and the desktop object.
41*b1cdbd2cSJim Jagielski         com.sun.star.frame.XDesktop xDesktop = null;
42*b1cdbd2cSJim Jagielski         xDesktop = getDesktop();
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski         // create text document
45*b1cdbd2cSJim Jagielski         com.sun.star.text.XTextDocument xTextDocument = null;
46*b1cdbd2cSJim Jagielski         xTextDocument = createTextdocument(xDesktop);
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski         // put example text in document
49*b1cdbd2cSJim Jagielski         createExampleData(xTextDocument);
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski         String mOffending[] = { "negro(e|es)?","bor(ed|ing)?",
53*b1cdbd2cSJim Jagielski                                 "bloody?", "bleed(ing)?" };
54*b1cdbd2cSJim Jagielski         String mBad[] = { "possib(le|ilit(y|ies))", "real(ly)+", "brilliant" };
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski         String sOffendPrefix = "Offending";
57*b1cdbd2cSJim Jagielski         String sBadPrefix = "BadStyle";
58*b1cdbd2cSJim Jagielski 
59*b1cdbd2cSJim Jagielski         markList(xTextDocument, mOffending, sOffendPrefix);
60*b1cdbd2cSJim Jagielski         markList(xTextDocument, mBad, sBadPrefix);
61*b1cdbd2cSJim Jagielski 
62*b1cdbd2cSJim Jagielski         System.out.println("Done");
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski         System.exit(0);
65*b1cdbd2cSJim Jagielski     }
66*b1cdbd2cSJim Jagielski 
markList(com.sun.star.text.XTextDocument xTextDocument, String mList[], String sPrefix)67*b1cdbd2cSJim Jagielski     public static void markList(com.sun.star.text.XTextDocument xTextDocument,
68*b1cdbd2cSJim Jagielski                                 String mList[], String sPrefix) {
69*b1cdbd2cSJim Jagielski         int iCounter=0;
70*b1cdbd2cSJim Jagielski         com.sun.star.uno.XInterface xSearchInterface = null;
71*b1cdbd2cSJim Jagielski         com.sun.star.text.XTextRange xSearchTextRange = null;
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski         try {
74*b1cdbd2cSJim Jagielski             for( iCounter = 0; iCounter < mList.length; iCounter++ ) {
75*b1cdbd2cSJim Jagielski                 // the findfirst returns a XInterface
76*b1cdbd2cSJim Jagielski                 xSearchInterface = (com.sun.star.uno.XInterface)FindFirst(
77*b1cdbd2cSJim Jagielski                     xTextDocument, mList[ iCounter ] );
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski                 if( xSearchInterface != null ) {
80*b1cdbd2cSJim Jagielski                     // get the TextRange form the XInterface
81*b1cdbd2cSJim Jagielski                     xSearchTextRange = (com.sun.star.text.XTextRange)
82*b1cdbd2cSJim Jagielski                         UnoRuntime.queryInterface(
83*b1cdbd2cSJim Jagielski                             com.sun.star.text.XTextRange.class, xSearchInterface);
84*b1cdbd2cSJim Jagielski 
85*b1cdbd2cSJim Jagielski                     InsertBookmark(xTextDocument, xSearchTextRange,
86*b1cdbd2cSJim Jagielski                                    sPrefix + iCounter);
87*b1cdbd2cSJim Jagielski                 }
88*b1cdbd2cSJim Jagielski             }
89*b1cdbd2cSJim Jagielski         }
90*b1cdbd2cSJim Jagielski         catch( Exception e) {
91*b1cdbd2cSJim Jagielski             e.printStackTrace(System.err);
92*b1cdbd2cSJim Jagielski             System.exit(1);
93*b1cdbd2cSJim Jagielski         }
94*b1cdbd2cSJim Jagielski     }
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski 
InsertBookmark(com.sun.star.text.XTextDocument xTextDocument, com.sun.star.text.XTextRange xTextRange, String sBookName)97*b1cdbd2cSJim Jagielski     public static void InsertBookmark(com.sun.star.text.XTextDocument xTextDocument,
98*b1cdbd2cSJim Jagielski                                       com.sun.star.text.XTextRange xTextRange,
99*b1cdbd2cSJim Jagielski                                       String sBookName) {
100*b1cdbd2cSJim Jagielski         // create a bookmark on a TextRange
101*b1cdbd2cSJim Jagielski         try {
102*b1cdbd2cSJim Jagielski             // get the MultiServiceFactory from the text document
103*b1cdbd2cSJim Jagielski             com.sun.star.lang.XMultiServiceFactory xDocMSF;
104*b1cdbd2cSJim Jagielski             xDocMSF = (com.sun.star.lang.XMultiServiceFactory)
105*b1cdbd2cSJim Jagielski                 UnoRuntime.queryInterface(
106*b1cdbd2cSJim Jagielski                     com.sun.star.lang.XMultiServiceFactory.class, xTextDocument);
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski             // the bookmark service is a context dependend service, you need
109*b1cdbd2cSJim Jagielski             // the MultiServiceFactory from the document
110*b1cdbd2cSJim Jagielski             Object xObject = xDocMSF.createInstance("com.sun.star.text.Bookmark");
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski             // set the name from the bookmark
113*b1cdbd2cSJim Jagielski             com.sun.star.container.XNamed xNameAccess = null;
114*b1cdbd2cSJim Jagielski             xNameAccess = (com.sun.star.container.XNamed)
115*b1cdbd2cSJim Jagielski                 UnoRuntime.queryInterface(
116*b1cdbd2cSJim Jagielski                     com.sun.star.container.XNamed.class, xObject);
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski             xNameAccess.setName(sBookName);
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski             // create a XTextContent, for the method 'insertTextContent'
121*b1cdbd2cSJim Jagielski             com.sun.star.text.XTextContent xTextContent = null;
122*b1cdbd2cSJim Jagielski             xTextContent = (com.sun.star.text.XTextContent)
123*b1cdbd2cSJim Jagielski                 UnoRuntime.queryInterface(
124*b1cdbd2cSJim Jagielski                     com.sun.star.text.XTextContent.class, xNameAccess);
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski             // insertTextContent need a TextRange not a cursor to specify the
127*b1cdbd2cSJim Jagielski             // position from the bookmark
128*b1cdbd2cSJim Jagielski             xTextDocument.getText().insertTextContent(xTextRange, xTextContent, true);
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski             System.out.println("Insert bookmark: " + sBookName);
131*b1cdbd2cSJim Jagielski         }
132*b1cdbd2cSJim Jagielski         catch( Exception e) {
133*b1cdbd2cSJim Jagielski             e.printStackTrace(System.err);
134*b1cdbd2cSJim Jagielski         }
135*b1cdbd2cSJim Jagielski     }
136*b1cdbd2cSJim Jagielski 
FindFirst( com.sun.star.text.XTextDocument xTextDocument, String sSearchString)137*b1cdbd2cSJim Jagielski     protected static com.sun.star.uno.XInterface FindFirst(
138*b1cdbd2cSJim Jagielski         com.sun.star.text.XTextDocument xTextDocument, String sSearchString)
139*b1cdbd2cSJim Jagielski     {
140*b1cdbd2cSJim Jagielski         com.sun.star.util.XSearchDescriptor xSearchDescriptor = null;
141*b1cdbd2cSJim Jagielski         com.sun.star.util.XSearchable xSearchable = null;
142*b1cdbd2cSJim Jagielski         com.sun.star.uno.XInterface xSearchInterface = null;
143*b1cdbd2cSJim Jagielski 
144*b1cdbd2cSJim Jagielski         try {
145*b1cdbd2cSJim Jagielski             xSearchable = (com.sun.star.util.XSearchable)
146*b1cdbd2cSJim Jagielski                 UnoRuntime.queryInterface(
147*b1cdbd2cSJim Jagielski                     com.sun.star.util.XSearchable.class, xTextDocument);
148*b1cdbd2cSJim Jagielski             xSearchDescriptor = (com.sun.star.util.XSearchDescriptor)
149*b1cdbd2cSJim Jagielski                 xSearchable.createSearchDescriptor();
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski             xSearchDescriptor.setSearchString(sSearchString);
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski             com.sun.star.beans.XPropertySet xPropertySet = null;
154*b1cdbd2cSJim Jagielski             xPropertySet = (com.sun.star.beans.XPropertySet)
155*b1cdbd2cSJim Jagielski                 UnoRuntime.queryInterface(
156*b1cdbd2cSJim Jagielski                     com.sun.star.beans.XPropertySet.class, xSearchDescriptor);
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski             xPropertySet.setPropertyValue("SearchRegularExpression",
159*b1cdbd2cSJim Jagielski                                           new Boolean( true ) );
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski             xSearchInterface = (com.sun.star.uno.XInterface)
162*b1cdbd2cSJim Jagielski                 xSearchable.findFirst(xSearchDescriptor);
163*b1cdbd2cSJim Jagielski         }
164*b1cdbd2cSJim Jagielski         catch( Exception e) {
165*b1cdbd2cSJim Jagielski             e.printStackTrace(System.err);
166*b1cdbd2cSJim Jagielski         }
167*b1cdbd2cSJim Jagielski 
168*b1cdbd2cSJim Jagielski         return xSearchInterface;
169*b1cdbd2cSJim Jagielski     }
170*b1cdbd2cSJim Jagielski 
createExampleData( com.sun.star.text.XTextDocument xTextDocument )171*b1cdbd2cSJim Jagielski     protected static void createExampleData(
172*b1cdbd2cSJim Jagielski         com.sun.star.text.XTextDocument xTextDocument )
173*b1cdbd2cSJim Jagielski     {
174*b1cdbd2cSJim Jagielski         com.sun.star.text.XTextCursor xTextCursor = null;
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski         try {
177*b1cdbd2cSJim Jagielski             xTextCursor = (com.sun.star.text.XTextCursor)
178*b1cdbd2cSJim Jagielski                 xTextDocument.getText().createTextCursor();
179*b1cdbd2cSJim Jagielski 
180*b1cdbd2cSJim Jagielski             xTextCursor.setString( "He heard quiet steps behind him. That didn't bode well. Who could be following him this late at night and in this deadbeat part of town? And at this particular moment, just after he pulled off the big time and was making off with the greenbacks. Was there another crook who'd had the same idea, and was now watching him and waiting for a chance to grab the fruit of his labor?" );
181*b1cdbd2cSJim Jagielski             xTextCursor.collapseToEnd();
182*b1cdbd2cSJim Jagielski             xTextCursor.setString( "Or did the steps behind him mean that one of many bloody officers in town was on to him and just waiting to pounce and snap those cuffs on his wrists? He nervously looked all around. Suddenly he saw the alley. Like lightening he darted off to the left and disappeared between the two warehouses almost falling over the trash can lying in the middle of the sidewalk. He tried to nervously tap his way along in the inky darkness and suddenly stiffened: it was a dead-end, he would have to go back the way he had come" );
183*b1cdbd2cSJim Jagielski             xTextCursor.collapseToEnd();
184*b1cdbd2cSJim Jagielski             xTextCursor.setString( "The steps got louder and louder, he saw the black outline of a figure coming around the corner. Is this the end of the line? he thought pressing himself back against the wall trying to make himself invisible in the dark, was all that planning and energy wasted? He was dripping with sweat now, cold and wet, he could smell the brilliant fear coming off his clothes. Suddenly next to him, with a barely noticeable squeak, a door swung quietly to and fro in the night's breeze." );
185*b1cdbd2cSJim Jagielski 
186*b1cdbd2cSJim Jagielski             xTextCursor.gotoStart(false);
187*b1cdbd2cSJim Jagielski         }
188*b1cdbd2cSJim Jagielski         catch( Exception e) {
189*b1cdbd2cSJim Jagielski             e.printStackTrace(System.err);
190*b1cdbd2cSJim Jagielski         }
191*b1cdbd2cSJim Jagielski 
192*b1cdbd2cSJim Jagielski     }
193*b1cdbd2cSJim Jagielski 
getDesktop()194*b1cdbd2cSJim Jagielski     public static com.sun.star.frame.XDesktop getDesktop() {
195*b1cdbd2cSJim Jagielski         com.sun.star.frame.XDesktop xDesktop = null;
196*b1cdbd2cSJim Jagielski         com.sun.star.lang.XMultiComponentFactory xMCF = null;
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski         try {
199*b1cdbd2cSJim Jagielski             com.sun.star.uno.XComponentContext xContext = null;
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski             // get the remote office component context
202*b1cdbd2cSJim Jagielski             xContext = com.sun.star.comp.helper.Bootstrap.bootstrap();
203*b1cdbd2cSJim Jagielski 
204*b1cdbd2cSJim Jagielski             // get the remote office service manager
205*b1cdbd2cSJim Jagielski             xMCF = xContext.getServiceManager();
206*b1cdbd2cSJim Jagielski             if( xMCF != null ) {
207*b1cdbd2cSJim Jagielski                 System.out.println("Connected to a running office ...");
208*b1cdbd2cSJim Jagielski 
209*b1cdbd2cSJim Jagielski                 Object oDesktop = xMCF.createInstanceWithContext(
210*b1cdbd2cSJim Jagielski                     "com.sun.star.frame.Desktop", xContext);
211*b1cdbd2cSJim Jagielski                 xDesktop = (com.sun.star.frame.XDesktop) UnoRuntime.queryInterface(
212*b1cdbd2cSJim Jagielski                     com.sun.star.frame.XDesktop.class, oDesktop);
213*b1cdbd2cSJim Jagielski             }
214*b1cdbd2cSJim Jagielski             else
215*b1cdbd2cSJim Jagielski                 System.out.println( "Can't create a desktop. No connection, no remote office servicemanager available!" );
216*b1cdbd2cSJim Jagielski         }
217*b1cdbd2cSJim Jagielski         catch( Exception e) {
218*b1cdbd2cSJim Jagielski             e.printStackTrace(System.err);
219*b1cdbd2cSJim Jagielski             System.exit(1);
220*b1cdbd2cSJim Jagielski         }
221*b1cdbd2cSJim Jagielski 
222*b1cdbd2cSJim Jagielski 
223*b1cdbd2cSJim Jagielski         return xDesktop;
224*b1cdbd2cSJim Jagielski     }
225*b1cdbd2cSJim Jagielski 
createTextdocument( com.sun.star.frame.XDesktop xDesktop )226*b1cdbd2cSJim Jagielski     public static com.sun.star.text.XTextDocument createTextdocument(
227*b1cdbd2cSJim Jagielski         com.sun.star.frame.XDesktop xDesktop )
228*b1cdbd2cSJim Jagielski     {
229*b1cdbd2cSJim Jagielski         com.sun.star.text.XTextDocument aTextDocument = null;
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski         try {
232*b1cdbd2cSJim Jagielski             com.sun.star.lang.XComponent xComponent = CreateNewDocument(xDesktop,
233*b1cdbd2cSJim Jagielski                                                                         "swriter");
234*b1cdbd2cSJim Jagielski             aTextDocument = (com.sun.star.text.XTextDocument)
235*b1cdbd2cSJim Jagielski                 UnoRuntime.queryInterface(
236*b1cdbd2cSJim Jagielski                     com.sun.star.text.XTextDocument.class, xComponent);
237*b1cdbd2cSJim Jagielski         }
238*b1cdbd2cSJim Jagielski         catch( Exception e) {
239*b1cdbd2cSJim Jagielski             e.printStackTrace(System.err);
240*b1cdbd2cSJim Jagielski         }
241*b1cdbd2cSJim Jagielski 
242*b1cdbd2cSJim Jagielski         return aTextDocument;
243*b1cdbd2cSJim Jagielski     }
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski 
CreateNewDocument( com.sun.star.frame.XDesktop xDesktop, String sDocumentType )246*b1cdbd2cSJim Jagielski     protected static com.sun.star.lang.XComponent CreateNewDocument(
247*b1cdbd2cSJim Jagielski         com.sun.star.frame.XDesktop xDesktop,
248*b1cdbd2cSJim Jagielski         String sDocumentType )
249*b1cdbd2cSJim Jagielski     {
250*b1cdbd2cSJim Jagielski         String sURL = "private:factory/" + sDocumentType;
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski         com.sun.star.lang.XComponent xComponent = null;
253*b1cdbd2cSJim Jagielski         com.sun.star.frame.XComponentLoader xComponentLoader = null;
254*b1cdbd2cSJim Jagielski         com.sun.star.beans.PropertyValue xValues[] =
255*b1cdbd2cSJim Jagielski             new com.sun.star.beans.PropertyValue[1];
256*b1cdbd2cSJim Jagielski         com.sun.star.beans.PropertyValue xEmptyArgs[] =
257*b1cdbd2cSJim Jagielski             new com.sun.star.beans.PropertyValue[0];
258*b1cdbd2cSJim Jagielski 
259*b1cdbd2cSJim Jagielski         try {
260*b1cdbd2cSJim Jagielski             xComponentLoader = (com.sun.star.frame.XComponentLoader)
261*b1cdbd2cSJim Jagielski                 UnoRuntime.queryInterface(
262*b1cdbd2cSJim Jagielski                     com.sun.star.frame.XComponentLoader.class, xDesktop);
263*b1cdbd2cSJim Jagielski 
264*b1cdbd2cSJim Jagielski             xComponent  = xComponentLoader.loadComponentFromURL(
265*b1cdbd2cSJim Jagielski                 sURL, "_blank", 0, xEmptyArgs);
266*b1cdbd2cSJim Jagielski         }
267*b1cdbd2cSJim Jagielski         catch( Exception e) {
268*b1cdbd2cSJim Jagielski             e.printStackTrace(System.out);
269*b1cdbd2cSJim Jagielski         }
270*b1cdbd2cSJim Jagielski 
271*b1cdbd2cSJim Jagielski         return xComponent ;
272*b1cdbd2cSJim Jagielski     }
273*b1cdbd2cSJim Jagielski }
274