blob: 2ba3d56ad204b4d881348217ede60131eac1d91a [file] [log] [blame]
/**************************************************************
*
* 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;
}
}