import com.sun.star.uno.UnoRuntime; import com.sun.star.util.XReplaceable; import com.sun.star.util.XReplaceDescriptor; import com.sun.star.util.XPropertyReplace; import com.sun.star.beans.PropertyValue; import com.sun.star.text.XTextDocument; import com.sun.star.script.provider.XScriptContext; int replaceText(searchKey, color, bold) { result = 0; try { // Create an XReplaceable object and an XReplaceDescriptor replaceable = (XReplaceable) UnoRuntime.queryInterface(XReplaceable.class, xTextDocument); descriptor = (XReplaceDescriptor) replaceable.createReplaceDescriptor(); // Gets a XPropertyReplace object for altering the properties // of the replaced text xPropertyReplace = (XPropertyReplace) UnoRuntime.queryInterface(XPropertyReplace.class, descriptor); // Sets the replaced text property fontweight value to Bold or Normal wv = null; if (bold) { wv = new PropertyValue("CharWeight", -1, new Float(com.sun.star.awt.FontWeight.BOLD), com.sun.star.beans.PropertyState.DIRECT_VALUE); } else { wv = new PropertyValue("CharWeight", -1, new Float(com.sun.star.awt.FontWeight.NORMAL), com.sun.star.beans.PropertyState.DIRECT_VALUE); } // Sets the replaced text property color value to RGB color parameter cv = new PropertyValue("CharColor", -1, new Integer(color), com.sun.star.beans.PropertyState.DIRECT_VALUE); // Apply the properties PropertyValue[] props = { cv, wv }; xPropertyReplace.setReplaceAttributes(props); // Only matches whole words and case sensitive descriptor.setPropertyValue("SearchCaseSensitive", new Boolean(true)); descriptor.setPropertyValue("SearchWords", new Boolean(true)); // Replaces all instances of searchKey with new Text properties // and gets the number of instances of the searchKey descriptor.setSearchString(searchKey); descriptor.setReplaceString(searchKey); result = replaceable.replaceAll(descriptor); } catch (Exception e) { } return result; } searchKey = ""; // The XSCRIPTCONTEXT variable is of type XScriptContext and is available to // all BeanShell scripts executed by the Script Framework xTextDocument = (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class, XSCRIPTCONTEXT.getDocument()); // Create a JButton and add an ActionListener // When clicked the value for the searchKey is read and passed to replaceText myListener = new ActionListener() { actionPerformed(ActionEvent e) { searchKey = findTextBox.getText(); if(searchKey.equalsIgnoreCase("")) { JOptionPane.showMessageDialog(null, "No text entered for search", "No text", JOptionPane.INFORMATION_MESSAGE); } else { // highlight the text in red cRed = new Color(255, 0, 0); red = cRed.getRGB(); num = replaceText(searchKey, red, true); if(num > 0) { int response = JOptionPane.showConfirmDialog(null, searchKey + " was found " + num + " times\nDo you wish to keep the text highlighted?", "Confirm highlight", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); if (response == 1) { cBlack = new Color(255, 255, 255); black = cBlack.getRGB(); replaceText(searchKey, black, false); } } else { JOptionPane.showMessageDialog(null, "No matches were found", "Not found", JOptionPane.INFORMATION_MESSAGE); } } } }; exitListener = new ActionListener() { actionPerformed(ActionEvent e) { frame.dispose(); } }; searchButton = new JButton("Highlight"); searchButton.addActionListener(myListener); exitButton = new JButton("Exit"); exitButton.addActionListener(exitListener); buttonPanel = new JPanel(); buttonPanel.setLayout(new FlowLayout()); buttonPanel.add(searchButton); buttonPanel.add(exitButton); // Create a JPanel containing one JTextField for the search text. searchPanel = new JPanel(); searchPanel.setLayout(new FlowLayout()); findTextBox = new JTextField(20); findWhat = new JLabel("Find What: "); searchPanel.add(findWhat); searchPanel.add(findTextBox); // Create frame and add a window listener frame = new JFrame("Highlight Text"); frame.setSize(350,130); frame.setLocation(430,430); frame.setResizable(false); // Add the panel and button to the frame frame.getContentPane().setLayout(new GridLayout(2,1,10,10)); frame.getContentPane().add(searchPanel); frame.getContentPane().add(buttonPanel); frame.setVisible(true); frame.pack();