1 import com.sun.star.uno.UnoRuntime; 2 import com.sun.star.script.provider.XScriptContext; 3 import com.sun.star.lang.XMultiComponentFactory; 4 import com.sun.star.lang.EventObject; 5 import com.sun.star.uno.Type; 6 import com.sun.star.uno.AnyConverter; 7 import com.sun.star.text.XTextDocument; 8 import com.sun.star.beans.PropertyValue; 9 import com.sun.star.script.XLibraryContainer; 10 import com.sun.star.awt.*; 11 import com.sun.star.util.*; 12 13 import java.awt.Color; 14 15 public class HighlightText implements com.sun.star.awt.XActionListener { 16 17 // UNO awt components of the Highlight dialog 18 XDialog findDialog = null; 19 XTextComponent findTextBox; 20 21 // The document being searched 22 XTextDocument theDocument; 23 24 // The text to be searched for 25 private String searchKey = ""; 26 27 public void showForm(XScriptContext context) { 28 System.err.println("Starting showForm"); 29 30 XMultiComponentFactory xmcf = 31 context.getComponentContext().getServiceManager(); 32 33 Object[] args = new Object[1]; 34 args[0] = context.getDocument(); 35 36 Object obj; 37 try { 38 obj = xmcf.createInstanceWithArgumentsAndContext( 39 "com.sun.star.awt.DialogProvider", args, 40 context.getComponentContext()); 41 } 42 catch (com.sun.star.uno.Exception e) { 43 System.err.println("Error getting DialogProvider object"); 44 return; 45 } 46 47 XDialogProvider xDialogProvider = (XDialogProvider) 48 UnoRuntime.queryInterface(XDialogProvider.class, obj); 49 50 System.err.println("Got DialogProvider, now get dialog"); 51 52 try { 53 findDialog = xDialogProvider.createDialog( 54 "vnd.sun.star.script:" + 55 "ScriptBindingLibrary.Highlight?location=application"); 56 } 57 catch (java.lang.Exception e) { 58 System.err.println("Got exception on first creating dialog: " + 59 e.getMessage()); 60 } 61 62 if (findDialog == null) { 63 if (tryLoadingLibrary(xmcf, context, "Dialog") == false || 64 tryLoadingLibrary(xmcf, context, "Script") == false) 65 { 66 System.err.println("Error loading ScriptBindingLibrary"); 67 return; 68 } 69 try { 70 findDialog = xDialogProvider.createDialog( 71 "vnd.sun.star.script://" + 72 "ScriptBindingLibrary.Highlight?location=application"); 73 } 74 catch (com.sun.star.lang.IllegalArgumentException iae) { 75 System.err.println("Error loading ScriptBindingLibrary"); 76 return; 77 } 78 } 79 80 XControlContainer controls = (XControlContainer) 81 UnoRuntime.queryInterface(XControlContainer.class, findDialog); 82 83 XButton highlightButton = (XButton) UnoRuntime.queryInterface( 84 XButton.class, controls.getControl("HighlightButton")); 85 highlightButton.setActionCommand("Highlight"); 86 87 findTextBox = (XTextComponent) UnoRuntime.queryInterface( 88 XTextComponent.class, controls.getControl("HighlightTextField")); 89 90 XButton exitButton = (XButton) UnoRuntime.queryInterface( 91 XButton.class, controls.getControl("ExitButton")); 92 exitButton.setActionCommand("Exit"); 93 94 theDocument = (XTextDocument) UnoRuntime.queryInterface( 95 XTextDocument.class, context.getDocument()); 96 97 highlightButton.addActionListener(this); 98 exitButton.addActionListener(this); 99 100 findDialog.execute(); 101 102 return; 103 } 104 105 public void actionPerformed(ActionEvent e) { 106 if (e.ActionCommand.equals("Exit")) { 107 findDialog.endExecute(); 108 return; 109 } 110 else if (e.ActionCommand.equals("Highlight")) { 111 searchKey = findTextBox.getText(); 112 113 // highlight the text in red 114 Color cRed = new Color(255, 0, 0); 115 int red = cRed.getRGB(); 116 117 XReplaceable replaceable = (XReplaceable) 118 UnoRuntime.queryInterface(XReplaceable.class, theDocument); 119 120 XReplaceDescriptor descriptor = 121 (XReplaceDescriptor) replaceable.createReplaceDescriptor(); 122 123 // Gets a XPropertyReplace object for altering the properties 124 // of the replaced text 125 XPropertyReplace xPropertyReplace = (XPropertyReplace) 126 UnoRuntime.queryInterface(XPropertyReplace.class, descriptor); 127 128 // Sets the replaced text property fontweight value to Bold 129 PropertyValue wv = new PropertyValue("CharWeight", -1, 130 new Float(com.sun.star.awt.FontWeight.BOLD), 131 com.sun.star.beans.PropertyState.DIRECT_VALUE); 132 133 // Sets the replaced text property color value to RGB parameter 134 PropertyValue cv = new PropertyValue("CharColor", -1, 135 new Integer(red), 136 com.sun.star.beans.PropertyState.DIRECT_VALUE); 137 138 // Apply the properties 139 PropertyValue[] props = new PropertyValue[] { cv, wv }; 140 141 try { 142 xPropertyReplace.setReplaceAttributes(props); 143 144 // Only matches whole words and case sensitive 145 descriptor.setPropertyValue( 146 "SearchCaseSensitive", new Boolean(true)); 147 descriptor.setPropertyValue("SearchWords", new Boolean(true)); 148 } 149 catch (com.sun.star.beans.UnknownPropertyException upe) { 150 System.err.println("Error setting up search properties"); 151 return; 152 } 153 catch (com.sun.star.beans.PropertyVetoException pve) { 154 System.err.println("Error setting up search properties"); 155 return; 156 } 157 catch (com.sun.star.lang.WrappedTargetException wte) { 158 System.err.println("Error setting up search properties"); 159 return; 160 } 161 catch (com.sun.star.lang.IllegalArgumentException iae) { 162 System.err.println("Error setting up search properties"); 163 return; 164 } 165 166 // Replaces all instances of searchKey with new Text properties 167 // and gets the number of instances of the searchKey 168 descriptor.setSearchString(searchKey); 169 descriptor.setReplaceString(searchKey); 170 replaceable.replaceAll(descriptor); 171 } 172 } 173 174 public void disposing(EventObject o) 175 { 176 // do nothing 177 } 178 179 private boolean tryLoadingLibrary( 180 XMultiComponentFactory xmcf, XScriptContext context, String name) 181 { 182 System.err.println("Try to load ScriptBindingLibrary"); 183 184 try { 185 Object obj = xmcf.createInstanceWithContext( 186 "com.sun.star.script.Application" + name + "LibraryContainer", 187 context.getComponentContext()); 188 189 XLibraryContainer xLibraryContainer = (XLibraryContainer) 190 UnoRuntime.queryInterface(XLibraryContainer.class, obj); 191 192 System.err.println("Got XLibraryContainer"); 193 194 Object serviceObj = context.getComponentContext().getValueByName( 195 "/singletons/com.sun.star.util.theMacroExpander"); 196 197 XMacroExpander xme = (XMacroExpander) AnyConverter.toObject( 198 new Type(XMacroExpander.class), serviceObj); 199 200 String bootstrapName = "bootstraprc"; 201 if (System.getProperty("os.name").startsWith("Windows")) { 202 bootstrapName = "bootstrap.ini"; 203 } 204 205 String libURL = xme.expandMacros( 206 "${$BRAND_BASE_DIR/program/" + bootstrapName + "::BaseInstallation}" + 207 "/share/basic/ScriptBindingLibrary/" + 208 name.toLowerCase() + ".xlb/"); 209 210 System.err.println("libURL is: " + libURL); 211 212 xLibraryContainer.createLibraryLink( 213 "ScriptBindingLibrary", libURL, false); 214 215 System.err.println("liblink created"); 216 217 } catch (com.sun.star.uno.Exception e) { 218 System.err.println("Got an exception loading lib: " + e.getMessage()); 219 return false; 220 } 221 return true; 222 } 223 } 224