155 lines
5.6 KiB
Java
155 lines
5.6 KiB
Java
package Common_old.UI.Editor;
|
||
import Common.Utils.CommonUtils;
|
||
import Common.Visual.CommonUI;
|
||
import Common_old.UI.Menus.StyledPopupMenu;
|
||
import Common_old.UI.Menus.TextEditorMenu;
|
||
import Common.Visual.Themes.ThemeElement;
|
||
import Common.Visual.Windows.Dialog.DialogFields;
|
||
import _VisualDVM.Syntax.SPFEditorTheme;
|
||
import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
|
||
|
||
import javax.swing.event.HyperlinkEvent;
|
||
import javax.swing.event.HyperlinkListener;
|
||
import java.awt.*;
|
||
import java.awt.event.KeyAdapter;
|
||
import java.awt.event.KeyEvent;
|
||
import java.net.URI;
|
||
public class BaseEditor extends RSyntaxTextArea implements ThemeElement, DialogFields {
|
||
private final StyledPopupMenu menu;
|
||
// protected int changesCount = 0;
|
||
// protected int insertsCount = 0;
|
||
// protected int removesCount = 0;
|
||
// protected boolean ctrlZ = false;
|
||
protected String startText = "";
|
||
private boolean search_enabled = true;
|
||
public BaseEditor() {
|
||
setTabSize(6);
|
||
setPaintTabLines(true);
|
||
setCodeFoldingEnabled(true);
|
||
addKeyListener(new KeyAdapter() {
|
||
@Override
|
||
public void keyPressed(KeyEvent e) {
|
||
if (e.isControlDown()) {
|
||
switch (e.getKeyCode()) {
|
||
case KeyEvent.VK_ADD: //num lock +
|
||
case KeyEvent.VK_EQUALS: //+
|
||
FontUp();
|
||
break;
|
||
case KeyEvent.VK_SUBTRACT: //num lock -
|
||
case KeyEvent.VK_MINUS: //-
|
||
FontDown();
|
||
break;
|
||
case KeyEvent.VK_S:
|
||
saveText();
|
||
break;
|
||
//todo переход в нужную строку по ctrl+g?
|
||
case KeyEvent.VK_Z:
|
||
if (getText().equals(startText)) {
|
||
CommonUI.Info("Начальная версия текста достигнута.");
|
||
e.consume();
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
});
|
||
setPopupMenu(menu = createMenu());
|
||
applyTheme();
|
||
//-
|
||
this.setHyperlinksEnabled(true);
|
||
HyperlinkListener listener = new HyperlinkListener() {
|
||
@Override
|
||
public void hyperlinkUpdate(HyperlinkEvent event) {
|
||
if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
|
||
try {
|
||
Desktop.getDesktop().browse(new URI(event.getURL().toString()));
|
||
} catch (Exception ioe) {
|
||
System.err.println("Error loading url from link: " + ioe);
|
||
}
|
||
}
|
||
}
|
||
};
|
||
this.addHyperlinkListener(listener);
|
||
}
|
||
@Override
|
||
public void setText(String t) {
|
||
super.setText(t);
|
||
startText = t;
|
||
}
|
||
public void setSearchEnabled(boolean f_in) {
|
||
search_enabled = f_in;
|
||
}
|
||
protected StyledPopupMenu createMenu() {
|
||
return new TextEditorMenu(this);
|
||
}
|
||
private void changeFont(int size) {
|
||
if ((size > 1) && (size < 48)) {
|
||
setFont(getFont().deriveFont((float) size));
|
||
saveFont();
|
||
}
|
||
}
|
||
protected void saveFont() {
|
||
}
|
||
protected void saveText() {
|
||
}
|
||
public void ClearSelection() {
|
||
setSelectionStart(0);
|
||
setSelectionEnd(0);
|
||
}
|
||
public void gotoLine(int LineNum) {
|
||
gotoLine_(LineNum - 1);
|
||
}
|
||
//без вычитания.
|
||
public void gotoLine_(int LineNum) {
|
||
//requestFocus();
|
||
try {
|
||
//особеннсть контрола.
|
||
//нельзя полностью скинуть текущую позицию. пэтому если надо
|
||
//освежить 0 строку, передергиваем до последней.
|
||
if (LineNum == 0)
|
||
setCaretPosition(getLineStartOffset(getLineCount() - 1));
|
||
ClearSelection();
|
||
if (LineNum > 0) {
|
||
setCaretPosition(getLineStartOffset(LineNum));
|
||
setSelectionStart(getLineStartOffset(LineNum));
|
||
setSelectionEnd(getLineStartOffset(LineNum));
|
||
}
|
||
} catch (Exception ex) {
|
||
CommonUtils.MainLog.Print("Не удалось перейти на строку " + LineNum);
|
||
CommonUtils.MainLog.PrintException(ex);
|
||
}
|
||
}
|
||
//------------------------------------------
|
||
public void FontUp() {
|
||
changeFont(getFont().getSize() + 1);
|
||
}
|
||
public void FontDown() {
|
||
changeFont(getFont().getSize() - 1);
|
||
}
|
||
@Override
|
||
public void applyTheme() {
|
||
float font_size = (float) getFont().getSize();
|
||
((SPFEditorTheme)CommonUI.getTheme()).getEditorTheme().apply(this);
|
||
setFont(getFont().deriveFont(font_size));
|
||
menu.applyTheme();
|
||
//меню связано с редактором. поэтому тема меняется только вместе с ним.
|
||
}
|
||
@Override
|
||
public Component getContent() {
|
||
return this;
|
||
}
|
||
public void ShowBegin() {
|
||
setCaretPosition(0);
|
||
}
|
||
public boolean lineIsVisible(int lineNum) {
|
||
boolean res = false;
|
||
Rectangle rectangle = this.getVisibleRect();
|
||
try {
|
||
res = rectangle.contains(rectangle.x, yForLine(lineNum));
|
||
} catch (Exception ex) {
|
||
ex.printStackTrace();
|
||
}
|
||
return res;
|
||
}
|
||
}
|