blob: bfe6dc28f584709374dbdbb66d7ea711be4f62b4 [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.netbeans.modules.print.provider;
import java.awt.Component;
import java.awt.Container;
import java.text.AttributedCharacterIterator;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.JEditorPane;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.JTextComponent;
import org.openide.cookies.EditorCookie;
import org.openide.util.Lookup;
import org.netbeans.modules.print.util.Config;
import static org.netbeans.modules.print.util.UI.*;
/**
* @author Vladimir Yaroslavskiy
* @version 2006.04.04
*/
public final class EditorProvider extends ComponentProvider {
public EditorProvider(EditorCookie editor, Date lastModified) {
super(null, getName(editor), lastModified);
myEditor = editor;
}
@Override
protected JComponent getComponent() {
JTextComponent text = getTextComponent();
if (text == null) {
return null;
}
if (Config.getDefault().isAsEditor()) {
return getEditorComponent(text);
}
Document document = myEditor.getDocument();
if (document == null) {
return null;
}
int start;
int end;
if (Config.getDefault().isSelection()) {
start = text.getSelectionStart();
end = text.getSelectionEnd();
}
else {
start = 0;
end = document.getLength();
}
AttributedCharacterIterator[] iterators = getIterators(document, start, end);
//out();
//out("iterators: " + iterators);
//out();
if (iterators != null) {
return new ComponentDocument(iterators);
}
try {
return new ComponentDocument(text.getText(start, end - start));
}
catch (BadLocationException e) {
return null;
}
}
private AttributedCharacterIterator[] getIterators(Document document, int start, int end) {
ActionListener action = (ActionListener) Lookup.getDefault().lookup(ActionListener.class);
//out();
//out("Action: " + action);
//out();
if (action == null) {
return null;
}
if ( !action.getClass().getName().contains(".print.")) { // NOI18N
return null;
}
List<Object> source = new ArrayList<Object>();
source.add(document);
source.add(Integer.valueOf(start));
source.add(Integer.valueOf(end));
ActionEvent event = new ActionEvent(source, 0, null);
action.actionPerformed(event);
Object object = event.getSource();
if ( !(object instanceof List)) {
return null;
}
List list = (List) object;
if (list.size() != 2*2) {
return null;
}
Object param = list.get(1 + 2);
if ( !(param instanceof AttributedCharacterIterator[])) {
return null;
}
return (AttributedCharacterIterator[]) param;
}
private static String getName(EditorCookie editor) {
Document document = editor.getDocument();
if (document == null) {
return null;
}
String title = (String) document.getProperty(Document.TitleProperty);
if (title == null) {
return null;
}
return title.replace('\\', '/'); // NOI18N
}
private JTextComponent getTextComponent() {
JEditorPane[] panes = myEditor.getOpenedPanes();
if (panes == null || panes.length == 0) {
return null;
}
return panes[0];
}
private JComponent getEditorComponent(JComponent text) {
if ( !Config.getDefault().isLineNumbers()) {
return text;
}
JComponent lineNumber = getLineNumberComponent(getParent(text));
if (lineNumber == null) {
return text;
}
List<JComponent> components = new ArrayList<JComponent>();
components.add(lineNumber);
components.add(text);
return new ComponentPanel(components);
}
private JComponent getLineNumberComponent(Component component) {
if (component == null) {
return null;
}
//out(" see: " + component.getClass().getName());
if (component.getClass().getName().equals("org.netbeans.editor.GlyphGutter")) { // NOI18N
if (component instanceof JComponent) {
return (JComponent) component;
}
}
if ( !(component instanceof Container)) {
return null;
}
Container container = (Container) component;
Component[] children = container.getComponents();
for (Component child : children) {
JComponent lineNumberComponent = getLineNumberComponent(child);
if (lineNumberComponent != null) {
return lineNumberComponent;
}
}
return null;
}
private Component getParent(Component component) {
Component parent = component.getParent();
if (parent == null) {
return component;
}
return getParent(parent);
}
private EditorCookie myEditor;
}