package jeql.workbench;
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.ImageIcon;
import javax.swing.JEditorPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.EmptyBorder;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.PlainDocument;
import jeql.workbench.images.IconLoader;
import jeql.workbench.model.ScriptSource;
import jeql.workbench.ui.assist.CodeSnippet;
public class ScriptPanel extends JPanel
{
private JEditorPane scriptText = new JEditorPane();
private ScriptStatusBar statusBar = new ScriptStatusBar();
private boolean isEditable = false;
private ScriptSource source;
private boolean isInitialization = true;
public ScriptPanel(boolean isEditable, ScriptSource source)
{
setEditable(isEditable);
this.source = source;
try {
initUI();
}
catch (Exception ex) {
ex.printStackTrace();
}
}
private void initUI() throws Exception
{
//scriptText.setFont(new java.awt.Font("Monospaced", 0, 12));
scriptText.setFont(new java.awt.Font("Lucida Console", 0, 12));
//scriptText.setFont(new java.awt.Font("Courier New", 0, 12));
scriptText.setEditable(isEditable);
scriptText.setBorder(new EmptyBorder(4, 4, 4, 4));
setMinimumSize(new Dimension(400, 50));
setPreferredSize(new Dimension(900, 300));
setLayout(new BorderLayout());
add(new JScrollPane(scriptText), BorderLayout.CENTER);
add(statusBar, BorderLayout.SOUTH);
scriptText.addCaretListener(new CaretListener() {
public void caretUpdate(CaretEvent arg0)
{
updateRowCol();
}
});
Document doc = scriptText.getDocument();
doc.addDocumentListener(new DocumentListener() {
public void changedUpdate(DocumentEvent arg0)
{
setModified();
}
public void insertUpdate(DocumentEvent arg0)
{
setModified();
}
public void removeUpdate(DocumentEvent arg0)
{
setModified();
}
});
}
public void setEditable(boolean isEditable)
{
this.isEditable = isEditable;
if (! isEditable)
scriptText.setBackground(WorkbenchConstants.BACKGROUND);
}
private void setModified()
{
if (! isEditable) return;
if (! isInitialization) {
source.setModified(true);
}
isInitialization = false;
Workbench.view().scriptUpdateModified();
}
public void setText(String text)
{
scriptText.setText(text);
scriptText.setCaretPosition(0);
}
public void loadText()
{
setText(source.getText());
}
public String getText()
{
return scriptText.getText();
}
public String getTitle()
{
return source.getTitle();
}
public ImageIcon getIcon()
{
if (getTitle().equals(WorkbenchConstants.INSPECT_TAB_NAME))
return IconLoader.INSPECT_TEXT;
return IconLoader.SCRIPT_SMALL;
}
public ScriptSource getSource()
{
return source;
}
public boolean isInternal()
{
// TODO - use better logic here
return isEditable;
}
public void updateRowCol()
{
int pos = scriptText.getCaretPosition();
Document doc = scriptText.getDocument();
PlainDocument plainDoc = (PlainDocument) doc;
int row = plainDoc.getDefaultRootElement().getElementIndex(pos);
int lineOffset = plainDoc.getDefaultRootElement().getElement(row).getStartOffset();
int col = pos - lineOffset + 1;
//Workbench.view().scriptCaretUpdate(lineNum + 1, col + 1); }
statusBar.setRow(row + 1, col);
}
public void insertCodeSnippet(CodeSnippet code)
{
int pos = scriptText.getCaretPosition();
Document doc = scriptText.getDocument();
try {
if (code.isSplitCode()) {
doc.insertString(pos, code.getCode1(), null);
int pos2 = scriptText.getCaretPosition();
doc.insertString(pos2, code.getCode2(), null);
scriptText.setCaretPosition(pos2);
}
else {
doc.insertString(pos, code.getCode(), null);
}
}
catch (BadLocationException e) {
// TODO - ok to ignore this exception?
e.printStackTrace();
}
// help user by switching focus to inserted text
boolean gotFocus = scriptText.requestFocusInWindow();
}
public void save()
{
// TODO Auto-generated method stub
source.setText(getText());
source.save();
}
}