/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.plugin.ij.editors;
import com.intellij.debugger.DebuggerManager;
import com.intellij.debugger.DebuggerManagerEx;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.LogicalPosition;
import com.intellij.openapi.editor.event.EditorMouseAdapter;
import com.intellij.openapi.editor.event.EditorMouseEvent;
import com.intellij.openapi.editor.ex.EditorEx;
import com.intellij.openapi.editor.impl.EditorImpl;
import com.intellij.openapi.fileEditor.TextEditor;
import com.intellij.openapi.fileEditor.impl.FileDocumentManagerImpl;
import com.intellij.openapi.fileEditor.impl.text.PsiAwareTextEditorImpl;
import com.intellij.openapi.fileEditor.impl.text.PsiAwareTextEditorProvider;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiFile;
import gw.plugin.ij.util.InjectedElementEditor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.event.InputEvent;
public class LightweightGosuEditor implements Disposable {
private static final int MIN_LINENUMBER_WIDTH = 16;
@NotNull
private final Project _project;
@NotNull
private final PsiAwareTextEditorImpl editor;
@NotNull
private final Document _document;
@Nullable
private EditorMouseAdapter editorMouseAdapter;
private JLabel labelCaption;
private PsiFile psiFile;
private VirtualFile vFile;
public LightweightGosuEditor(@NotNull Project project, @NotNull VirtualFile virtualFile, @Nullable Disposable owner, boolean enableDebug) {
_project = project;
vFile = virtualFile;
editor = (PsiAwareTextEditorImpl) PsiAwareTextEditorProvider.getInstance().createEditor(project, virtualFile);
if (owner != null) {
Disposer.register(owner, this);
}
EditorImpl editorImpl = (EditorImpl) editor.getEditor();
_document = editorImpl.getDocument();
psiFile = PsiDocumentManager.getInstance(project).getPsiFile(_document);
FileDocumentManagerImpl.registerDocument(_document, virtualFile);
if (enableDebug) {
// addBreakpointSupport(editorImpl);
}
}
public LightweightGosuEditor(@NotNull Project project, @NotNull VirtualFile virtualFile, @Nullable Disposable owner) {
this(project, virtualFile, owner, false);
}
private void addBreakpointSupport(@NotNull final EditorImpl editorImpl) {
editorMouseAdapter = new EditorMouseAdapter() {
@Override
public void mouseReleased(@NotNull EditorMouseEvent event) {
if ((event.getMouseEvent().getModifiers() & InputEvent.BUTTON1_MASK) != 0 && event.getArea() != null && event.getArea().toString().equals("LINE_MARKERS_AREA")) {
LogicalPosition position = editorImpl.xyToLogicalPosition(event.getMouseEvent().getPoint());
DebuggerManagerEx debugManager = (DebuggerManagerEx) DebuggerManager.getInstance(_project);
debugManager.getBreakpointManager().addLineBreakpoint(_document, position.line);
}
}
};
editorImpl.addEditorMouseListener(editorMouseAdapter);
}
@NotNull
public TextEditor getEditor() {
return editor;
}
@NotNull
public JComponent getContentComponent() {
return editor.getEditor().getContentComponent();
}
@NotNull
public JComponent getComponent() {
return editor.getComponent();
}
@NotNull
public Document getDocument() {
return _document;
}
public PsiFile getPsiFile() {
return psiFile;
}
public VirtualFile getVirtualFile() {
return vFile;
}
public String getText() {
return getDocument().getText();
}
@Nullable
public String getLabel() {
return labelCaption == null ? null : labelCaption.getText();
}
public void setLabel(String text) {
if (labelCaption == null) {
labelCaption = new JLabel("<Script Part>");
labelCaption.setOpaque(true);
labelCaption.setFont(getComponent().getFont().deriveFont(Font.BOLD));
labelCaption.setBorder(new EmptyBorder(0, 4 + MIN_LINENUMBER_WIDTH, 0, 0));
getEditor().getEditor().setHeaderComponent(labelCaption);
}
labelCaption.setText(text);
}
public void setOneLineMode(boolean oneLineMode) {
((EditorEx) editor.getEditor()).setOneLineMode(oneLineMode);
setGutterVisible(false);
getEditor().getEditor().getSettings().setVirtualSpace(false);
((EditorImpl) getEditor().getEditor()).setHorizontalScrollbarVisible(false);
psiFile.putUserData(InjectedElementEditor.SINGLE_LINE_EDITOR, oneLineMode);
}
public void setGutterVisible(boolean visible) {
((EditorEx) editor.getEditor()).getGutterComponentEx().getParent().setVisible(visible);
}
@Override
public void dispose() {
if (editorMouseAdapter != null) {
editor.getEditor().removeEditorMouseListener(editorMouseAdapter);
}
editor.dispose();
}
}