blob: df10c56901db06968e899d85fae737c412f34278 [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.core.output2;
import java.awt.event.MouseEvent;
import org.netbeans.core.output2.ui.AbstractOutputPane;
import javax.swing.*;
import javax.swing.text.Document;
import javax.swing.text.PlainDocument;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.text.Caret;
import org.netbeans.core.output2.options.OutputOptions;
import org.openide.util.NbPreferences;
class OutputPane extends AbstractOutputPane {
OutputTab parent;
PropertyChangeListener editorKitListener = new OutputEditorKitListener();
public OutputPane(OutputTab parent) {
this.parent = parent;
}
@Override
protected void documentChanged() {
super.documentChanged();
findOutputTab().documentChanged(this);
}
protected void caretPosChanged(int pos) {
findOutputTab().caretPosChanged(pos);
}
protected void lineClicked(int line, int pos) {
if ((getDocument() instanceof OutputDocument)) {
findOutputTab().lineClicked(line, pos);
}
}
@Override
protected void enterPressed() {
Caret caret = textView.getCaret();
findOutputTab().enterPressed(caret.getMark(), caret.getDot());
}
protected void postPopupMenu(Point p, Component src) {
if (src.isShowing()) {
findOutputTab().postPopupMenu(p, src);
}
}
/**
* Only calls super if there are hyperlinks in the document to avoid huge
* numbers of calls to viewToModel if the cursor is never going to be
* changed anyway.
*/
@Override
public void mouseMoved (MouseEvent evt) {
Document doc = getDocument();
if (doc instanceof OutputDocument) {
if (((OutputDocument) doc).getLines().hasListeners()) {
super.mouseMoved(evt);
}
}
}
@Override
public void mousePressed(MouseEvent e) {
super.mousePressed(e);
//Refine possibly to focus just what is important..
if (!e.isPopupTrigger()) {
findOutputTab().setToFocus((Component) e.getSource());
findOutputTab().requestActive();
}
}
private OutputTab findOutputTab() {
return parent;
}
@Override
protected void setDocument (Document doc) {
if (doc == null) {
Document d = getDocument();
if (d != null) {
d.removeDocumentListener(this);
}
textView.setDocument (new PlainDocument());
return;
}
textView.setEditorKit(new OutputEditorKit(isWrapped(), textView,
editorKitListener));
super.setDocument(doc);
updateKeyBindings();
}
public void setWrapped (boolean val) {
if (val != isWrapped() || !(getEditorKit() instanceof OutputEditorKit)) {
NbPreferences.forModule(OutputPane.class).putBoolean("wrap", val); //NOI18N
textView.setFont(OutputOptions.getDefault().getFont(val));
final int pos = textView.getCaret().getDot();
Cursor cursor = textView.getCursor();
try {
textView.setCursor (Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
setEditorKit(new OutputEditorKit(val, textView, editorKitListener));
} finally {
textView.setCursor (cursor);
}
/*if (val) { #78191
getViewport().addChangeListener(this);
} else {
getViewport().removeChangeListener(this);
}*/
//Don't try to set the caret position until the view has
//been fully readjusted to its new dimensions, scroll bounds, etc.
SwingUtilities.invokeLater (new Runnable() {
private boolean first = true;
public void run() {
if (first) {
first = false;
SwingUtilities.invokeLater(this);
return;
}
textView.getCaret().setDot(pos);
}
});
if (getDocument() instanceof OutputDocument && ((OutputDocument) getDocument()).getLines().isGrowing()) {
lockScroll();
}
if (!val) {
//If there are long lines, it will suddenly get scrolled to the right
//with the non-wrapping editor kit, so fix that
getHorizontalScrollBar().setValue(getHorizontalScrollBar().getModel().getMinimum());
}
validate();
getFoldingSideBar().setWrapped(val);
}
}
public boolean isWrapped() {
if (getEditorKit() instanceof OutputEditorKit) {
return getEditorKit() instanceof OutputEditorKit
&& ((OutputEditorKit) getEditorKit()).isWrapped();
} else {
return NbPreferences.forModule(OutputPane.class).getBoolean("wrap", false); //NOI18N
}
}
protected JEditorPane createTextView() {
JEditorPane result = new JEditorPane();
if ("Aqua".equals(UIManager.getLookAndFeel().getID())) {
result.setBackground(UIManager.getColor("NbExplorerView.background")); //NOI18N
} else if ("GTK".equals(UIManager.getLookAndFeel().getID())) {
result.setBackground(UIManager.getColor("text")); //NOI18N
}
// we don't want the background to be gray even though the text there is not editable
result.setDisabledTextColor(result.getBackground());
//#83118 - remove the "control shift 0" from editor pane to lt the Open Project action through
InputMap map = result.getInputMap();
MyInputMap myMap = new MyInputMap();
myMap.setParent(map);
result.setInputMap(JEditorPane.WHEN_FOCUSED, myMap);
Action act = new AbstractAction() {
public void actionPerformed(ActionEvent arg0) {
OutputDocument od =(OutputDocument)((JEditorPane)arg0.getSource()).getDocument();
findOutputTab().inputSent(od.sendLine());
}
};
result.getActionMap().put("SENDLINE", act);
act = new AbstractAction() {
public void actionPerformed(ActionEvent arg0) {
OutputDocument od =(OutputDocument)((JEditorPane)arg0.getSource()).getDocument();
findOutputTab().inputSent(od.sendLine());
findOutputTab().inputEof();
}
};
result.getActionMap().put("EOF", act);
result.setDragEnabled(false); // #225994
return result;
}
@Override
protected void changeFontSizeBy(int change) {
Controller.getDefault().changeFontSizeBy(change, isWrapped());
}
//#83118 - remove the "control shift 0" from editor pane to lt the Open Project action through
protected class MyInputMap extends InputMap {
public MyInputMap() {
super();
}
@Override
public Object get(KeyStroke keyStroke) {
KeyStroke stroke = KeyStroke.getKeyStroke("control shift O");
if (keyStroke.equals(stroke)) {
return null;
}
stroke = KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, Event.CTRL_MASK);
if (keyStroke.equals(stroke)) {
return null;
}
stroke = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
if (keyStroke.equals(stroke)) {
if (findOutputTab().isInputVisible()) {/* #105954 */
return "SENDLINE";
}
}
stroke = KeyStroke.getKeyStroke(KeyEvent.VK_D, Event.CTRL_MASK);
if (keyStroke.equals(stroke)) {
return "EOF";
}
Object retValue;
retValue = super.get(keyStroke);
return retValue;
}
}
private class OutputEditorKitListener implements PropertyChangeListener {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("charsPerLine".equals(evt.getPropertyName())) { //NOI18N
getFoldingSideBar().setCharsPerLine(
(Integer) evt.getNewValue());
}
}
}
}