//----------------------------------------------------------------------------
// COMPONENT NAME: LPEX Editor
//
// © Copyright IBM Corporation 2005, 2006
// All Rights Reserved.
//
// DESCRIPTION:
// FindTextContextCommand - sample user-defined command (redefined findText)
//----------------------------------------------------------------------------

package com.ibm.lpex.samples;

import com.ibm.lpex.core.LpexCommand;
import com.ibm.lpex.core.LpexView;

/**
 * Sample command <b>findText</b> - redefines editor's to show context for the
 * found text.  Repositions the result of a successful find-text command or action
 * in the specified view so that its context is shown - two lines above and below.
 *
 * <p>Here is the FindTextContextCommand
 * <a href="doc-files/FindTextContextCommand.java.html">source code</a>.</p>
 *
 * <p>To redefine the default <b>findText</b> command:
 * <ul>
 *  <li>Register this new command implementation via an editor preference page,
 *    where available, or from the editor command line:
 *    <pre>set commandClass.findText com.ibm.lpex.samples.FindTextContextCommand</pre></li>
 * </ul></p>
 *
 * <p>The repositioning of the found text can be disabled by setting
 * <b>userParameter.view.findTextContext</b> to off.  This is useful when running
 * the <b>findText</b> command without the need to reposition the result on the
 * screen (see, for example, the sample {@link FindsCommand}).</p>
 *
 * @see com.ibm.lpex.samples.TestUserProfile
 * @see com.ibm.lpex.samples All the samples
 */
public class FindTextContextCommand implements LpexCommand
{
 /**
  * Runs this command.
  * Issues the default <b>findText</b> editor command, and then
  * repositions the found text in order to show a few lines around it.
  *
  * @param lpexView the document view in which the command was issued
  * @param parameters the findText command parameters
  */
 public boolean doCommand(LpexView lpexView, String parameters)
 {
  boolean success = lpexView != null &&
                    lpexView.doDefaultCommand("findText " + parameters);
  if (success)
   {
    showFoundContext(lpexView);
   }
  return success;
 }

 /**
  * Shows the context for a successful find-text command or action in the
  * specified view.
  *
  * Called after running the default editor <b>findText</b> command.
  */
 static void showFoundContext(LpexView lpexView)
 {
  // allow user to disable this (for example, in the long-running "finds" sample command)
  if (!"off".equals(lpexView.query("userParameter.view.findTextContext")))
   {
    String status = LpexView.globalQuery("status");
    if (status == null ||
        (!status.equals("findText.notFound") && !status.equals("findText.invalidPattern")))
     {
      // only bother if there are at least five lines showing
      int rows = lpexView.queryInt("rows");
      if (rows >= 5)
       {
        // rebuild this view's screen
        lpexView.doCommand("screenShow view");
        // reposition at least two lines away from the edge
        int row = lpexView.queryInt("cursorRow");
        if (row < 3)
         {
          lpexView.doCommand("set cursorRow 3");
         }
        else if (row > rows - 2)
         {
          lpexView.doCommand("set cursorRow " + (rows - 2));
         }
       }
     }
   }
 }
}