1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 package org.openoffice.netbeans.editor; 24 25 import javax.swing.*; 26 import javax.swing.text.Document; 27 import javax.swing.event.DocumentListener; 28 import javax.swing.event.DocumentEvent; 29 30 import java.io.*; 31 import java.util.ResourceBundle; 32 33 import javax.swing.text.Caret; 34 import org.netbeans.editor.*; 35 import org.netbeans.editor.ext.*; 36 37 import com.sun.star.script.framework.provider.beanshell.ScriptSourceView; 38 import com.sun.star.script.framework.provider.beanshell.ScriptSourceModel; 39 40 public class NetBeansSourceView extends JPanel 41 implements ScriptSourceView, DocumentListener { 42 43 private ScriptSourceModel model; 44 private JEditorPane pane; 45 private boolean isModified = false; 46 47 static { 48 // Feed our kits with their default Settings Settings.addInitializer( new BaseSettingsInitializer(), Settings.CORE_LEVEL)49 Settings.addInitializer( 50 new BaseSettingsInitializer(), Settings.CORE_LEVEL); Settings.addInitializer( new ExtSettingsInitializer(), Settings.CORE_LEVEL)51 Settings.addInitializer( 52 new ExtSettingsInitializer(), Settings.CORE_LEVEL); Settings.reset()53 Settings.reset(); 54 55 try { 56 Class kitClass = Class.forName( 57 NetBeansSourceView.class.getPackage().getName() + ".JavaKit"); 58 59 JEditorPane.registerEditorKitForContentType( 60 "text/x-java", kitClass.getName(), kitClass.getClassLoader()); 61 } 62 catch( ClassNotFoundException exc ) { 63 } 64 } 65 66 private class MyLocalizer implements LocaleSupport.Localizer { 67 private ResourceBundle bundle; 68 MyLocalizer( String bundleName )69 public MyLocalizer( String bundleName ) { 70 bundle = ResourceBundle.getBundle( bundleName ); 71 } 72 73 // Localizer getString( String key )74 public String getString( String key ) { 75 return bundle.getString( key ); 76 } 77 } 78 NetBeansSourceView(ScriptSourceModel model)79 public NetBeansSourceView(ScriptSourceModel model) { 80 this.model = model; 81 82 LocaleSupport.addLocalizer( 83 new MyLocalizer("org.netbeans.editor.Bundle")); 84 85 pane = new JEditorPane("text/x-java", ""); 86 pane.setText(model.getText()); 87 88 JScrollPane spane = new JScrollPane(); 89 spane.setViewportView(pane); 90 setLayout(new java.awt.GridLayout(1, 1)); 91 add(spane); 92 93 pane.getDocument().addDocumentListener(this); 94 } 95 main(String[] args)96 public static void main(String[] args) { 97 if (args.length < 1) { 98 System.err.println("No file specified"); 99 System.exit(-1); 100 } 101 102 File f = new File(args[0]); 103 104 if (!f.exists() || !f.isFile()) { 105 System.err.println("Invalid file"); 106 System.exit(-1); 107 } 108 109 java.net.URL url = null; 110 try { 111 url = f.toURL(); 112 } 113 catch (java.net.MalformedURLException mue) { 114 System.err.println("Invalid file"); 115 System.exit(-1); 116 } 117 118 NetBeansSourceView view = 119 new NetBeansSourceView(new ScriptSourceModel(url)); 120 121 JFrame frame = new JFrame(); 122 frame.getContentPane().add(view); 123 frame.setSize(640, 480); 124 frame.show(); 125 } 126 127 // Code grabbed from NetBeans editor module scrollToLine(int line)128 public void scrollToLine(int line) 129 { 130 BaseDocument doc = Utilities.getDocument(pane); 131 132 int pos = -1; 133 if (doc != null) { 134 // Obtain the offset where to jump 135 pos = Utilities.getRowStartFromLineOffset(doc, line); 136 } 137 138 if (pos != -1) { 139 Caret caret = pane.getCaret(); 140 if (caret instanceof BaseCaret) { // support extended scroll mode 141 BaseCaret bCaret = (BaseCaret)caret; 142 bCaret.setDot(pos, bCaret, EditorUI.SCROLL_FIND); 143 } 144 else { 145 caret.setDot(pos); 146 } 147 } 148 } 149 clear()150 public void clear() { 151 pane.setText(""); 152 } 153 update()154 public void update() { 155 /* Remove ourselves as a DocumentListener while loading the source 156 so we don't get a storm of DocumentEvents during loading */ 157 pane.getDocument().removeDocumentListener(this); 158 159 if (isModified == false) 160 { 161 pane.setText(model.getText()); 162 } 163 164 // scroll to current position of the model 165 try { 166 scrollToLine(model.getCurrentPosition()); 167 } 168 catch (Exception e) { 169 // couldn't scroll to line, do nothing 170 } 171 172 // Add back the listener 173 pane.getDocument().addDocumentListener(this); 174 } 175 isModified()176 public boolean isModified() { 177 return isModified; 178 } 179 setModified(boolean value)180 public void setModified(boolean value) { 181 isModified = value; 182 } 183 getText()184 public String getText() { 185 return pane.getText(); 186 } 187 188 /* Implementation of DocumentListener interface */ insertUpdate(DocumentEvent e)189 public void insertUpdate(DocumentEvent e) { 190 doChanged(e); 191 } 192 removeUpdate(DocumentEvent e)193 public void removeUpdate(DocumentEvent e) { 194 doChanged(e); 195 } 196 changedUpdate(DocumentEvent e)197 public void changedUpdate(DocumentEvent e) { 198 doChanged(e); 199 } 200 doChanged(DocumentEvent e)201 public void doChanged(DocumentEvent e) { 202 isModified = true; 203 } 204 205 } 206