/************************************************************** * * 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. * *************************************************************/ package org.openoffice.netbeans.editor; import java.io.*; import java.awt.event.KeyEvent; import java.awt.event.InputEvent; import java.awt.event.ActionEvent; import java.net.URL; import java.text.MessageFormat; import java.util.Map; import java.util.List; import java.util.ResourceBundle; import java.util.MissingResourceException; import javax.swing.KeyStroke; import javax.swing.JEditorPane; import javax.swing.JMenuItem; import javax.swing.Action; import javax.swing.text.Document; import javax.swing.text.JTextComponent; import javax.swing.text.TextAction; import javax.swing.text.BadLocationException; import org.netbeans.editor.*; import org.netbeans.editor.ext.*; import org.netbeans.editor.ext.java.*; /** * Java editor kit with appropriate document * * @author Miloslav Metelka * @version 1.00 */ /* This class is based on the JavaKit class in the demosrc directory of * the editor module of the NetBeans project: http://www.netbeans.org * * The class sets up an EditorKit for syntax highlighting and code completion * of Java syntax */ public class JavaKit extends ExtKit { public static final String JAVA_MIME_TYPE = "text/x-java"; // NOI18N static final long serialVersionUID =-5445829962533684922L; static { Settings.addInitializer( new JavaSettingsInitializer( JavaKit.class ) ); Settings.reset(); URL skeleton = null, body = null; skeleton = JavaKit.class.getResource("OOo.jcs"); body = JavaKit.class.getResource("OOo.jcb"); if (skeleton != null && body != null) { DAFileProvider provider = new DAFileProvider( new URLAccessor(skeleton), new URLAccessor(body)); JCBaseFinder finder = new JCBaseFinder(); finder.append( provider ); JavaCompletion.setFinder( finder ); } } public String getContentType() { return JAVA_MIME_TYPE; } /** Create new instance of syntax coloring scanner * @param doc document to operate on. It can be null in the cases the syntax * creation is not related to the particular document */ public Syntax createSyntax(Document doc) { return new JavaSyntax(); } /** Create syntax support */ public SyntaxSupport createSyntaxSupport(BaseDocument doc) { return new JavaSyntaxSupport(doc); } public Completion createCompletion(ExtEditorUI extEditorUI) { return new JavaCompletion(extEditorUI); } /** Create the formatter appropriate for this kit */ public Formatter createFormatter() { return new JavaFormatter(this.getClass()); } protected EditorUI createEditorUI() { return new ExtEditorUI(); } protected void initDocument(BaseDocument doc) { doc.addLayer(new JavaDrawLayerFactory.JavaLayer(), JavaDrawLayerFactory.JAVA_LAYER_VISIBILITY); doc.addDocumentListener(new JavaDrawLayerFactory.LParenWatcher()); } /** * DataAccessor for parser DB files via URL streams * * @author Petr Nejedly */ public static class URLAccessor implements DataAccessor { URL url; InputStream stream; int streamOff; int actOff; public URLAccessor(URL url) { this.url = url; } /** Not implemented */ public void append(byte[] buffer, int off, int len) throws IOException { throw new IllegalArgumentException("read only!"); } /** * Reads exactly len bytes from this file resource * into the byte array, starting at the current file pointer. * This method reads repeatedly from the file until the requested * number of bytes are read. This method blocks until the requested * number of bytes are read, the end of the inputStream is detected, * or an exception is thrown. * * @param buffer the buffer into which the data is read. * @param off the start offset of the data. * @param len the number of bytes to read. */ public void read(byte[] buffer, int off, int len) throws IOException { InputStream str = getStream(actOff); while (len > 0) { int count = str.read(buffer, off, len); streamOff += count; off += count; len -= count; } } /** Opens DataAccessor file resource * @param requestWrite if true, file is opened for read/write */ public void open(boolean requestWrite) throws IOException { if(requestWrite) throw new IllegalArgumentException("read only!"); } /** Closes DataAccessor file resource */ public void close() throws IOException { if (stream != null) { stream.close(); stream = null; } } /** * Returns the current offset in this file. * * @return the offset from the beginning of the file, in bytes, * at which the next read or write occurs. */ public long getFilePointer() throws IOException { return actOff; } /** Clears the file and sets the offset to 0 */ public void resetFile() throws IOException { throw new IllegalArgumentException("read only!"); } /** * Sets the file-pointer offset, measured from the beginning of this * file, at which the next read or write occurs. */ public void seek(long pos) throws IOException { actOff = (int)pos; } /** Gets InputStream prepared for reading from off * offset position */ private InputStream getStream(int off) throws IOException { if (streamOff > off && stream != null) { stream.close(); stream = null; } if(stream == null) { stream = url.openStream(); streamOff = 0; } while (streamOff < off) { long len = stream.skip(off - streamOff); streamOff += (int)len; if (len == 0) throw new IOException("EOF"); } return stream; } public int getFileLength() { try { int l = url.openConnection().getContentLength(); return l; } catch (IOException e) { return 0; } } public String toString() { return url.toString(); } } }