/*
* Encog(tm) Workbench v3.4
* http://www.heatonresearch.com/encog/
* https://github.com/encog/encog-java-workbench
*
* Copyright 2008-2016 Heaton Research, Inc.
*
* Licensed 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.
*
* For more information on Heaton Research copyrights, licenses
* and trademarks visit:
* http://www.heatonresearch.com/copyright
*/
package org.encog.workbench.tabs.files.text;
import java.awt.BorderLayout;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.JTextComponent;
import javax.swing.text.Utilities;
import org.encog.workbench.EncogWorkBench;
import org.encog.workbench.WorkBenchError;
import org.encog.workbench.frames.document.tree.ProjectFile;
import org.encog.workbench.tabs.SupportsClipboard;
import org.encog.workbench.tabs.files.BasicFileTab;
import org.encog.workbench.util.EncogFonts;
public class BasicTextTab extends BasicFileTab implements ComponentListener,
CaretListener, SupportsClipboard {
private final NonWrappingTextPane editor;
private final JScrollPane scroll;
private final BasicTextDocListener dirty = new BasicTextDocListener(this);
private final JLabel status = new JLabel();
public BasicTextTab(ProjectFile file) {
super(file);
this.editor = new NonWrappingTextPane();
this.editor.setFont(EncogFonts.getInstance().getCodeFont());
this.editor.setEditable(true);
this.editor.addCaretListener(this);
this.setLayout(new BorderLayout());
this.scroll = new JScrollPane(this.editor);
add(this.scroll, BorderLayout.CENTER);
this.addComponentListener(this);
this.status.setText(" ");
add(this.status, BorderLayout.SOUTH);
loadFile();
}
public void loadFile() {
try {
InputStream is = new FileInputStream(this.getEncogObject()
.getFile());
this.editor.read(is, null);
is.close();
this.editor.getDocument().addDocumentListener(this.dirty);
setDirty(false);
} catch (IOException ex) {
throw new WorkBenchError(ex);
}
}
@Override
public void save() {
try {
FileWriter out = new FileWriter(this.getEncogObject().getFile());
this.editor.write(out);
out.close();
setDirty(false);
} catch (IOException ex) {
throw new WorkBenchError(ex);
}
}
public void setText(final String t) {
this.editor.setText(t);
this.editor.setCaretPosition(0);
}
public String getText() {
return this.editor.getText();
}
@Override
public boolean close() throws IOException {
if (isDirty()) {
if (EncogWorkBench.askQuestion("Save",
"Would you like to save this text file?")) {
this.save();
}
}
return true;
}
public boolean isTextSelected() {
return this.editor.getSelectionEnd() > this.editor.getSelectionStart();
}
public void componentResized(ComponentEvent e) {
// TODO Auto-generated method stub
}
public void componentMoved(ComponentEvent e) {
// TODO Auto-generated method stub
}
public void componentShown(ComponentEvent e) {
setDirty(false);
}
public void componentHidden(ComponentEvent e) {
// TODO Auto-generated method stub
}
public BasicTextDocListener getDirty() {
return dirty;
}
public static int getRow(int pos, JTextComponent editor) {
int rn = (pos == 0) ? 1 : 0;
try {
int offs = pos;
while (offs > 0) {
offs = Utilities.getRowStart(editor, offs) - 1;
rn++;
}
} catch (BadLocationException e) {
e.printStackTrace();
}
return rn;
}
public static int getColumn(int pos, JTextComponent editor) {
try {
return pos - Utilities.getRowStart(editor, pos) + 1;
} catch (BadLocationException e) {
e.printStackTrace();
}
return -1;
}
@Override
public void caretUpdate(CaretEvent e) {
StringBuilder s = new StringBuilder();
s.append("Row: ");
int pos = this.editor.getCaretPosition();
s.append(getRow(pos, this.editor));
s.append(", Col: ");
s.append(getColumn(pos, this.editor));
this.status.setText(s.toString());
}
public void find() {
try {
String editorText = this.editor.getDocument().getText(0,
this.editor.getDocument().getLength());
String text = EncogWorkBench.displayInput("Search:");
if (text != null) {
int start = this.editor.getCaretPosition();
int idx = editorText.indexOf(text, start);
if (idx == -1) {
EncogWorkBench.displayError("Not Found",
"Could not find, searching from current position.");
} else {
this.editor.requestFocusInWindow();
this.editor.setSelectionStart(idx);
this.editor.setSelectionEnd(idx + text.length());
}
}
} catch (BadLocationException ex) {
// ignroe
}
}
@Override
public void clipboardCopy() {
this.editor.copy();
}
@Override
public void clipboardPaste() {
this.editor.paste();
}
@Override
public void clipboardCut() {
this.editor.cut();
}
@Override
public void clipboardSelectAll() {
this.editor.requestFocusInWindow();
this.editor.selectAll();
}
}