<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
    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.

--><mediawiki xmlns="http://www.mediawiki.org/xml/export-0.3/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="0.3" xml:lang="en" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.3/ http://www.mediawiki.org/xml/export-0.3.xsd">
  <siteinfo>
    <sitename>NetBeans Wiki</sitename>
    <base>http://wiki.netbeans.org/Main_Page</base>
    <generator>MediaWiki 1.15.1</generator>
    <case>first-letter</case>
    <namespaces>
      <namespace key="-2">Media</namespace>
      <namespace key="-1">Special</namespace>
      <namespace key="0"/>
      <namespace key="1">Talk</namespace>
      <namespace key="2">User</namespace>
      <namespace key="3">User talk</namespace>
      <namespace key="4">NetBeans Wiki</namespace>
      <namespace key="5">NetBeans Wiki talk</namespace>
      <namespace key="6">File</namespace>
      <namespace key="7">File talk</namespace>
      <namespace key="8">MediaWiki</namespace>
      <namespace key="9">MediaWiki talk</namespace>
      <namespace key="10">Template</namespace>
      <namespace key="11">Template talk</namespace>
      <namespace key="12">Help</namespace>
      <namespace key="13">Help talk</namespace>
      <namespace key="14">Category</namespace>
      <namespace key="15">Category talk</namespace>
    </namespaces>
  </siteinfo>
  <page>
    <title>DevFaqListenEditorChanges</title>
    <id>7367</id>
    <revision>
      <id>69127</id>
      <timestamp>2016-02-22T22:27:20Z</timestamp>
      <contributor>
        <username>Markiewb</username>
        <id>12770</id>
      </contributor>
      <comment>/* How can I track what file the user is currently editing? */ NbDocument.findRecentEditorPane</comment>
      <text xml:space="preserve">__NOTOC__
===How can I track what file the user is currently editing?===

====EditorRegistry====
The editor keeps a registry of open editors;  you can track the active editor using the following code:

&lt;pre&gt;
import org.netbeans.api.editor.EditorRegistry;

PropertyChangeListener l = new PropertyChangeListener() {
  public void propertyChange(PropertyChangeEvent evt) {
    JTextComponent jtc = EditorRegistry.lastFocusedComponent();
    if (jtc != null) {
      Document d = jtc.getDocument();
      // use the document
    }
  }
};

EditorRegistry.addPropertyChangeListener(l);
&lt;/pre&gt;

'''IMPORTANT''': If you attach any listener to the &lt;tt&gt;Document&lt;/tt&gt; or anything else in the active editor text component, remember to remove them when the active editor changes.

Please read javadoc on &lt;tt&gt;EditorRegistry&lt;/tt&gt; to see details about the properties delivered through the listener used in the above code. There are many property changes fired and if an event comes it does '''not''' necessarily mean that the active editor has changed.


====NbDocument.findRecentEditorPane====
If you have a &lt;code&gt;EditorCookie&lt;/code&gt; you can use &lt;code&gt;NbDocument.findRecentEditorPane&lt;/code&gt;

http://bits.netbeans.org/dev/javadoc/org-openide-text/org/openide/text/NbDocument.html#findRecentEditorPane-org.openide.cookies.EditorCookie-

-----

Applies to: Netbeans 6.x and later

Platforms: All</text>
    </revision>
  </page>
</mediawiki>
