// *************************************************************
//
//  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.
//
// *************************************************************
//this script acts as a handler for the buttons in the Highlight dialog
importClass(Packages.com.sun.star.uno.UnoRuntime);
importClass(Packages.com.sun.star.uno.Type);
importClass(Packages.com.sun.star.uno.AnyConverter);

importClass(Packages.com.sun.star.awt.XButton);
importClass(Packages.com.sun.star.awt.XControl);
importClass(Packages.com.sun.star.awt.ActionEvent);
importClass(Packages.com.sun.star.awt.XControlModel);
importClass(Packages.com.sun.star.awt.XControlContainer);
importClass(Packages.com.sun.star.awt.XDialog);
importClass(Packages.com.sun.star.awt.XTextComponent);

importClass(Packages.com.sun.star.util.XReplaceable);
importClass(Packages.com.sun.star.util.XReplaceDescriptor);
importClass(Packages.com.sun.star.util.XPropertyReplace);

importClass(Packages.com.sun.star.beans.XPropertySet);
importClass(Packages.com.sun.star.beans.PropertyValue);

// Scripting Framework DialogFactory class
importClass(Packages.com.sun.star.script.framework.browse.DialogFactory);

// Get the ActionEvent object from the ARGUMENTS list
event = ARGUMENTS[0];

// Each argument is of type Any so we must use the AnyConverter class to
// convert it into the interface or primitive type we expect
button = AnyConverter.toObject(new Type(XButton), event.Source);

// We can now query for the model of the button and get its properties
control = UnoRuntime.queryInterface(XControl, button);
cmodel = control.getModel();
pset = UnoRuntime.queryInterface(XPropertySet, cmodel);

if (pset.getPropertyValue("Label").equals("Exit"))
{
    // We can get the XDialog in which this control appears by calling
    // getContext() on the XControl interface
    xDialog = UnoRuntime.queryInterface(
        XDialog, control.getContext());

    // Close the dialog
    xDialog.endExecute();
}
else
{
    // We can get the list of controls for this dialog by calling
    // getContext() on the XControl interface of the button
    controls = UnoRuntime.queryInterface(
        XControlContainer, control.getContext());

    // Now get the text field control from the list
    textField =
        UnoRuntime.queryInterface(
            XTextComponent, controls.getControl("HighlightTextField"));

    searchKey = textField.getText();

    // highlight the text in red
    red = java.awt.Color.red.getRGB();

    replaceable =
        UnoRuntime.queryInterface(XReplaceable, XSCRIPTCONTEXT.getDocument());

    descriptor = replaceable.createReplaceDescriptor();

    // Gets a XPropertyReplace object for altering the properties
    // of the replaced text
    xPropertyReplace = UnoRuntime.queryInterface(XPropertyReplace, descriptor);

    // Sets the replaced text property fontweight value to Bold
    wv = new PropertyValue("CharWeight", -1,
        new java.lang.Float(Packages.com.sun.star.awt.FontWeight.BOLD),
            Packages.com.sun.star.beans.PropertyState.DIRECT_VALUE);

    // Sets the replaced text property color value to RGB parameter
    cv = new PropertyValue("CharColor", -1,
        new java.lang.Integer(red),
            Packages.com.sun.star.beans.PropertyState.DIRECT_VALUE);

    // Apply the properties
    props = new Array;
    props[0] = cv;
    props[1] = wv;

    try {
        xPropertyReplace.setReplaceAttributes(props);

        // Only matches whole words and case sensitive
        descriptor.setPropertyValue(
            "SearchCaseSensitive", new java.lang.Boolean(true));
        descriptor.setPropertyValue("SearchWords", new java.lang.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);
        replaceable.replaceAll(descriptor);
    }
    catch (e) {
        java.lang.System.err.println("Error setting up search properties"
            + e.getMessage());
    }
}
