| /************************************************************** |
| * |
| * 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 javax.swing.*; |
| import javax.swing.text.Document; |
| import javax.swing.event.DocumentListener; |
| import javax.swing.event.DocumentEvent; |
| |
| import java.io.*; |
| import java.util.ResourceBundle; |
| |
| import javax.swing.text.Caret; |
| import org.netbeans.editor.*; |
| import org.netbeans.editor.ext.*; |
| |
| import com.sun.star.script.framework.provider.beanshell.ScriptSourceView; |
| import com.sun.star.script.framework.provider.beanshell.ScriptSourceModel; |
| |
| public class NetBeansSourceView extends JPanel |
| implements ScriptSourceView, DocumentListener { |
| |
| private ScriptSourceModel model; |
| private JEditorPane pane; |
| private boolean isModified = false; |
| |
| static { |
| // Feed our kits with their default Settings |
| Settings.addInitializer( |
| new BaseSettingsInitializer(), Settings.CORE_LEVEL); |
| Settings.addInitializer( |
| new ExtSettingsInitializer(), Settings.CORE_LEVEL); |
| Settings.reset(); |
| |
| try { |
| Class kitClass = Class.forName( |
| NetBeansSourceView.class.getPackage().getName() + ".JavaKit"); |
| |
| JEditorPane.registerEditorKitForContentType( |
| "text/x-java", kitClass.getName(), kitClass.getClassLoader()); |
| } |
| catch( ClassNotFoundException exc ) { |
| } |
| } |
| |
| private class MyLocalizer implements LocaleSupport.Localizer { |
| private ResourceBundle bundle; |
| |
| public MyLocalizer( String bundleName ) { |
| bundle = ResourceBundle.getBundle( bundleName ); |
| } |
| |
| // Localizer |
| public String getString( String key ) { |
| return bundle.getString( key ); |
| } |
| } |
| |
| public NetBeansSourceView(ScriptSourceModel model) { |
| this.model = model; |
| |
| LocaleSupport.addLocalizer( |
| new MyLocalizer("org.netbeans.editor.Bundle")); |
| |
| pane = new JEditorPane("text/x-java", ""); |
| pane.setText(model.getText()); |
| |
| JScrollPane spane = new JScrollPane(); |
| spane.setViewportView(pane); |
| setLayout(new java.awt.GridLayout(1, 1)); |
| add(spane); |
| |
| pane.getDocument().addDocumentListener(this); |
| } |
| |
| public static void main(String[] args) { |
| if (args.length < 1) { |
| System.err.println("No file specified"); |
| System.exit(-1); |
| } |
| |
| File f = new File(args[0]); |
| |
| if (!f.exists() || !f.isFile()) { |
| System.err.println("Invalid file"); |
| System.exit(-1); |
| } |
| |
| java.net.URL url = null; |
| try { |
| url = f.toURL(); |
| } |
| catch (java.net.MalformedURLException mue) { |
| System.err.println("Invalid file"); |
| System.exit(-1); |
| } |
| |
| NetBeansSourceView view = |
| new NetBeansSourceView(new ScriptSourceModel(url)); |
| |
| JFrame frame = new JFrame(); |
| frame.getContentPane().add(view); |
| frame.setSize(640, 480); |
| frame.show(); |
| } |
| |
| // Code grabbed from NetBeans editor module |
| public void scrollToLine(int line) |
| { |
| BaseDocument doc = Utilities.getDocument(pane); |
| |
| int pos = -1; |
| if (doc != null) { |
| // Obtain the offset where to jump |
| pos = Utilities.getRowStartFromLineOffset(doc, line); |
| } |
| |
| if (pos != -1) { |
| Caret caret = pane.getCaret(); |
| if (caret instanceof BaseCaret) { // support extended scroll mode |
| BaseCaret bCaret = (BaseCaret)caret; |
| bCaret.setDot(pos, bCaret, EditorUI.SCROLL_FIND); |
| } |
| else { |
| caret.setDot(pos); |
| } |
| } |
| } |
| |
| public void clear() { |
| pane.setText(""); |
| } |
| |
| public void update() { |
| /* Remove ourselves as a DocumentListener while loading the source |
| so we don't get a storm of DocumentEvents during loading */ |
| pane.getDocument().removeDocumentListener(this); |
| |
| if (isModified == false) |
| { |
| pane.setText(model.getText()); |
| } |
| |
| // scroll to current position of the model |
| try { |
| scrollToLine(model.getCurrentPosition()); |
| } |
| catch (Exception e) { |
| // couldn't scroll to line, do nothing |
| } |
| |
| // Add back the listener |
| pane.getDocument().addDocumentListener(this); |
| } |
| |
| public boolean isModified() { |
| return isModified; |
| } |
| |
| public void setModified(boolean value) { |
| isModified = value; |
| } |
| |
| public String getText() { |
| return pane.getText(); |
| } |
| |
| /* Implementation of DocumentListener interface */ |
| public void insertUpdate(DocumentEvent e) { |
| doChanged(e); |
| } |
| |
| public void removeUpdate(DocumentEvent e) { |
| doChanged(e); |
| } |
| |
| public void changedUpdate(DocumentEvent e) { |
| doChanged(e); |
| } |
| |
| public void doChanged(DocumentEvent e) { |
| isModified = true; |
| } |
| |
| } |