001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041: package org.netbeans.modules.java.source;
042:
043: import java.beans.PropertyChangeEvent;
044: import java.beans.PropertyChangeListener;
045: import java.io.IOException;
046: import javax.swing.text.Document;
047: import javax.swing.text.JTextComponent;
048: import org.netbeans.api.editor.EditorRegistry;
049: import org.netbeans.api.java.classpath.ClassPath;
050: import org.netbeans.api.java.source.JavaSource;
051: import org.netbeans.modules.java.JavaDataLoader;
052: import org.netbeans.modules.java.source.usages.RepositoryUpdater;
053: import org.openide.filesystems.FileObject;
054: import org.openide.loaders.DataObject;
055: import org.openide.util.Exceptions;
056:
057: /**
058: *
059: * @author Jan Lahoda
060: */
061: public class ActivatedDocumentListener implements
062: PropertyChangeListener {
063:
064: private static ActivatedDocumentListener INSTANCE;
065:
066: public static void register() {
067: INSTANCE = new ActivatedDocumentListener();
068: }
069:
070: private FileObject lastValidFile;
071:
072: /**
073: * Creates a new instance of ActivatedDocumentListener
074: */
075: private ActivatedDocumentListener() {
076: EditorRegistry.addPropertyChangeListener(this );
077: }
078:
079: public synchronized void propertyChange(PropertyChangeEvent evt) {
080: JTextComponent activeComponent = EditorRegistry
081: .lastFocusedComponent();
082:
083: if (activeComponent == null) {
084: return;
085: }
086:
087: Document active = activeComponent.getDocument();
088:
089: if (active == null)
090: return;
091:
092: Object sourceProperty = active
093: .getProperty(Document.StreamDescriptionProperty);
094:
095: if (!(sourceProperty instanceof DataObject))
096: return;
097:
098: DataObject source = (DataObject) sourceProperty;
099:
100: if (source == null)
101: return;
102:
103: FileObject activeFile = source.getPrimaryFile();
104:
105: if (lastValidFile == activeFile)
106: return;
107:
108: if (lastValidFile != null && isJava(lastValidFile)) {
109: if (!IGNORE_COMPILE_REQUESTS) {
110: ClassPath cp = ClassPath.getClassPath(lastValidFile,
111: ClassPath.SOURCE);
112: if (cp != null) {
113: FileObject owner = cp.findOwnerRoot(lastValidFile);
114: if (owner != null) {
115: try {
116: if ("file".equals(lastValidFile.getURL()
117: .getProtocol())) { //NOI18N
118: RepositoryUpdater.getDefault()
119: .scheduleCompilation(
120: lastValidFile, owner);
121: }
122: } catch (IOException ioe) {
123: Exceptions.printStackTrace(ioe);
124: }
125: }
126: }
127: }
128:
129: lastValidFile = null;
130: }
131:
132: JavaSource activeJS = JavaSource.forFileObject(activeFile);
133:
134: if (activeJS == null) {
135: //not a Java document:
136: return;
137: }
138:
139: lastValidFile = activeFile;
140:
141: JavaSourceAccessor.getINSTANCE().revalidate(activeJS);
142: }
143:
144: /**Set to switch off compilation, usefull in tests.
145: * Use SourceUtilsTestUtil.ignoreCompileRequests to set it:
146: */
147: public static boolean IGNORE_COMPILE_REQUESTS = false;
148:
149: //needs to be the same as in RepositoryUpdater:
150: private static boolean isJava(final FileObject fo) {
151: if (fo.isFolder()) {
152: return false;
153: } else if (JavaDataLoader.JAVA_EXTENSION.equals(fo.getExt()
154: .toLowerCase())) {
155: return true;
156: } else {
157: return JavaDataLoader.JAVA_MIME_TYPE.equals(fo
158: .getMIMEType());
159: }
160: }
161:
162: }
|