diff --git a/app/src/processing/app/ui/Editor.java b/app/src/processing/app/ui/Editor.java
index c0e1e9b48..8a1818e13 100644
--- a/app/src/processing/app/ui/Editor.java
+++ b/app/src/processing/app/ui/Editor.java
@@ -2897,6 +2897,20 @@ public abstract class Editor extends JFrame implements RunnerListener {
abstract public void deactivateRun();
+ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+
+
+ /**
+ * Called by ErrorTable when a row is selected. Action taken is specific
+ * to each Mode, based on the object passed in.
+ */
+ public void errorTableClick(Object item) { }
+
+
+ public void errorTableDoubleClick(Object item) { }
+
+
+
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
diff --git a/java/src/processing/mode/java/JavaEditor.java b/java/src/processing/mode/java/JavaEditor.java
index 55b9ebd02..a37081c23 100644
--- a/java/src/processing/mode/java/JavaEditor.java
+++ b/java/src/processing/mode/java/JavaEditor.java
@@ -14,9 +14,11 @@ import java.util.logging.Logger;
import javax.swing.*;
import javax.swing.border.*;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
import javax.swing.event.MenuEvent;
import javax.swing.event.MenuListener;
-import javax.swing.table.TableModel;
+import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import org.eclipse.jdt.core.compiler.IProblem;
@@ -2559,12 +2561,120 @@ public class JavaEditor extends Editor {
// }
- /** Updates the error table */
- synchronized public boolean updateTable(final TableModel tableModel) {
- return errorTable.updateTable(tableModel);
+ public XQErrorTable getErrorTable() {
+ return errorTable;
}
+ public void errorTableClick(Object item) {
+ Problem p = (Problem) item;
+ errorCheckerService.scrollToErrorLine(p);
+ }
+
+
+ public void errorTableDoubleClick(Object item) {
+ Problem p = (Problem) item;
+
+// MouseEvent evt = null;
+ String[] suggs = p.getImportSuggestions();
+ if (suggs != null && suggs.length > 0) {
+// String t = p.getMessage() + "(Import Suggestions available)";
+// FontMetrics fm = getFontMetrics(getFont());
+// int x1 = fm.stringWidth(p.getMessage());
+// int x2 = fm.stringWidth(t);
+// if (evt.getX() > x1 && evt.getX() < x2) {
+ String[] list = p.getImportSuggestions();
+ String className = list[0].substring(list[0].lastIndexOf('.') + 1);
+ String[] temp = new String[list.length];
+ for (int i = 0; i < list.length; i++) {
+ temp[i] = "Import '" + className + "' (" + list[i] + ")";
+ }
+ // showImportSuggestion(temp, evt.getXOnScreen(), evt.getYOnScreen() - 3 * getFont().getSize());
+ Point mouse = MouseInfo.getPointerInfo().getLocation();
+ showImportSuggestion(temp, mouse.x, mouse.y);
+ }
+ }
+
+
+ JFrame frmImportSuggest;
+
+ private void showImportSuggestion(String[] list, int x, int y) {
+ if (frmImportSuggest != null) {
+// frmImportSuggest.setVisible(false);
+// frmImportSuggest = null;
+ return;
+ }
+ final JList classList = new JList(list);
+ classList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+ frmImportSuggest = new JFrame();
+
+ frmImportSuggest.setUndecorated(true);
+ frmImportSuggest.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
+ JPanel panel = new JPanel();
+ panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
+ panel.setBackground(Color.WHITE);
+ frmImportSuggest.setBackground(Color.WHITE);
+ panel.add(classList);
+ JLabel label = new JLabel("
(Click to insert)
");
+ label.setBackground(Color.WHITE);
+ label.setHorizontalTextPosition(SwingConstants.LEFT);
+ panel.add(label);
+ panel.validate();
+ frmImportSuggest.getContentPane().add(panel);
+ frmImportSuggest.pack();
+
+ classList.addListSelectionListener(new ListSelectionListener() {
+ public void valueChanged(ListSelectionEvent e) {
+ if (classList.getSelectedValue() != null) {
+ try {
+ String t = classList.getSelectedValue().trim();
+ Messages.log(t);
+ int x = t.indexOf('(');
+ String impString = "import " + t.substring(x + 1, t.indexOf(')')) + ";\n";
+ int ct = getSketch().getCurrentCodeIndex();
+ getSketch().setCurrentCode(0);
+ getTextArea().getDocument().insertString(0, impString, null);
+ getSketch().setCurrentCode(ct);
+ } catch (BadLocationException ble) {
+ Messages.log("Failed to insert import");
+ ble.printStackTrace();
+ }
+ }
+ frmImportSuggest.setVisible(false);
+ frmImportSuggest.dispose();
+ frmImportSuggest = null;
+ }
+ });
+
+ frmImportSuggest.addWindowFocusListener(new WindowFocusListener() {
+
+ @Override
+ public void windowLostFocus(WindowEvent e) {
+ if (frmImportSuggest != null) {
+ frmImportSuggest.dispose();
+ frmImportSuggest = null;
+ }
+ }
+
+ @Override
+ public void windowGainedFocus(WindowEvent e) {
+
+ }
+ });
+
+ frmImportSuggest.setLocation(x, y);
+ frmImportSuggest.setBounds(x, y, 250, 100);
+ frmImportSuggest.pack();
+ frmImportSuggest.setVisible(true);
+ }
+
+
+// /** Updates the error table */
+// synchronized public boolean updateTable(final TableModel tableModel) {
+// return errorTable.updateTable(tableModel);
+// }
+
+
/**
* Handle whether the tiny red error indicator is shown near
* the error button at the bottom of the PDE
diff --git a/java/src/processing/mode/java/pdex/ErrorCheckerService.java b/java/src/processing/mode/java/pdex/ErrorCheckerService.java
index c7eafdeb5..84e070018 100644
--- a/java/src/processing/mode/java/pdex/ErrorCheckerService.java
+++ b/java/src/processing/mode/java/pdex/ErrorCheckerService.java
@@ -35,7 +35,6 @@ import java.util.regex.Pattern;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
-import javax.swing.table.DefaultTableModel;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.Element;
@@ -919,20 +918,15 @@ public class ErrorCheckerService implements Runnable {
*/
public void updateErrorTable() {
try {
- String[][] errorData = new String[problemsList.size()][3];
- int index = 0;
+ XQErrorTable table = editor.getErrorTable();
+ table.clear();
+
+// String[][] errorData = new String[problemsList.size()][3];
+// int index = 0;
// for (int i = 0; i < problemsList.size(); i++) {
+ Sketch sketch = editor.getSketch();
for (Problem p : problemsList) {
- errorData[index][0] = p.getMessage();
- errorData[index][1] = editor.getSketch().getCode(p.getTabIndex()).getPrettyName();
- errorData[index][2] = Integer.toString(p.getLineNumber() + 1);
- // Added +1 because lineNumbers internally are 0-indexed
-
-// //TODO: This is temporary
-// if (tempErrorLog.size() < 200) {
-// tempErrorLog.put(p.getMessage(), p.getIProblem());
-// }
-
+ String message = p.getMessage();
if (JavaMode.importSuggestEnabled) {
if (p.getIProblem().getID() == IProblem.UndefinedType) {
String[] args = p.getIProblem().getArguments();
@@ -941,18 +935,29 @@ public class ErrorCheckerService implements Runnable {
String[] si = astGenerator.getSuggestImports(missingClass);
if (si != null && si.length > 0) {
p.setImportSuggestions(si);
- errorData[index][0] = "" + p.getMessage() +
- " (Import Suggestions available)";
+// errorData[index][0] = "" + p.getMessage() +
+// " (Import Suggestions available)";
+ message += " (click for suggested libraries)";
}
}
}
}
- index++;
+
+ table.append(p, message,
+ sketch.getCode(p.getTabIndex()).getPrettyName(),
+ Integer.toString(p.getLineNumber() + 1));
+ // Added +1 because lineNumbers internally are 0-indexed
+
+// //TODO: This is temporary
+// if (tempErrorLog.size() < 200) {
+// tempErrorLog.put(p.getMessage(), p.getIProblem());
+// }
+
}
- DefaultTableModel tm =
- new DefaultTableModel(errorData, XQErrorTable.columnNames);
- editor.updateTable(tm);
+// DefaultTableModel tm =
+// new DefaultTableModel(errorData, XQErrorTable.columnNames);
+// editor.updateTable(tm);
} catch (Exception e) {
Messages.loge("Exception at updateErrorTable()", e);
diff --git a/java/src/processing/mode/java/pdex/XQErrorTable.java b/java/src/processing/mode/java/pdex/XQErrorTable.java
index 196301e91..789bb6c69 100644
--- a/java/src/processing/mode/java/pdex/XQErrorTable.java
+++ b/java/src/processing/mode/java/pdex/XQErrorTable.java
@@ -24,36 +24,36 @@ import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
-import java.awt.FontMetrics;
-import java.awt.event.*;
-import java.util.List;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
-import javax.swing.*;
-import javax.swing.event.ListSelectionEvent;
-import javax.swing.event.ListSelectionListener;
+import javax.swing.JLabel;
+import javax.swing.JTable;
+import javax.swing.SwingWorker;
+import javax.swing.ToolTipManager;
+import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;
-import javax.swing.text.BadLocationException;
import processing.app.Language;
import processing.app.Messages;
import processing.app.Mode;
import processing.app.ui.Editor;
-import processing.mode.java.JavaEditor;
public class XQErrorTable extends JTable {
Editor editor;
static final String[] columnNames = {
+ "",
Language.text("editor.footer.errors.problem"),
Language.text("editor.footer.errors.tab"),
Language.text("editor.footer.errors.line")
};
- int[] columnWidths = { 400, 100, 50 };
+ int[] columnWidths = { Editor.LEFT_GUTTER, 400, 100, 50 };
/** Is the column being resized? */
private boolean columnResizing = false;
@@ -67,7 +67,30 @@ public class XQErrorTable extends JTable {
Color rowBgColor;
- public XQErrorTable(final JavaEditor editor) {
+ /*
+ class Item {
+ String message;
+ String filename;
+ int line;
+ }
+ */
+
+
+ public void clear() {
+ DefaultTableModel dtm = (DefaultTableModel) getModel();
+ dtm.setRowCount(0);
+ }
+
+
+ public void append(Object data, String message, String filename, String line) {
+ DefaultTableModel dtm = (DefaultTableModel) getModel();
+ dtm.addRow(new Object[] { data, message, filename, line });
+ }
+
+
+ public XQErrorTable(final Editor editor) {
+ super(new DefaultTableModel(columnNames, 0));
+
this.editor = editor;
JTableHeader header = getTableHeader();
@@ -85,19 +108,28 @@ public class XQErrorTable extends JTable {
//System.out.println("class is " + columnModel.getColumn(i).getClass());
}
*/
+// DefaultTableModel tm = new DefaultTableModel(columnNames, 0);
addMouseListener(new MouseAdapter() {
@Override
synchronized public void mouseClicked(MouseEvent e) {
try {
int row = ((XQErrorTable) e.getSource()).getSelectedRow();
- editor.getErrorChecker().scrollToErrorLine(row);
+ Object data = getModel().getValueAt(row, 0);
+ int clickCount = e.getClickCount();
+ if (clickCount == 1) {
+ editor.errorTableClick(data);
+ } else if (clickCount > 1) {
+ editor.errorTableDoubleClick(data);
+ }
+// editor.getErrorChecker().scrollToErrorLine(row);
} catch (Exception e1) {
Messages.log("Exception XQErrorTable mouseReleased " + e);
}
}
});
+ /*
addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseMoved(MouseEvent evt) {
@@ -128,6 +160,7 @@ public class XQErrorTable extends JTable {
}
}
});
+ */
header.setReorderingAllowed(false);
@@ -207,79 +240,6 @@ public class XQErrorTable extends JTable {
}
- JFrame frmImportSuggest;
-
- private void showImportSuggestion(String[] list, int x, int y) {
- if (frmImportSuggest != null) {
-// frmImportSuggest.setVisible(false);
-// frmImportSuggest = null;
- return;
- }
- final JList classList = new JList(list);
- classList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
- frmImportSuggest = new JFrame();
-
- frmImportSuggest.setUndecorated(true);
- frmImportSuggest.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
- JPanel panel = new JPanel();
- panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
- panel.setBackground(Color.WHITE);
- frmImportSuggest.setBackground(Color.WHITE);
- panel.add(classList);
- JLabel label = new JLabel("
(Click to insert)
");
- label.setBackground(Color.WHITE);
- label.setHorizontalTextPosition(SwingConstants.LEFT);
- panel.add(label);
- panel.validate();
- frmImportSuggest.getContentPane().add(panel);
- frmImportSuggest.pack();
-
- classList.addListSelectionListener(new ListSelectionListener() {
- public void valueChanged(ListSelectionEvent e) {
- if (classList.getSelectedValue() != null) {
- try {
- String t = classList.getSelectedValue().trim();
- Messages.log(t);
- int x = t.indexOf('(');
- String impString = "import " + t.substring(x + 1, t.indexOf(')')) + ";\n";
- int ct = editor.getSketch().getCurrentCodeIndex();
- editor.getSketch().setCurrentCode(0);
- editor.getTextArea().getDocument().insertString(0, impString, null);
- editor.getSketch().setCurrentCode(ct);
- } catch (BadLocationException ble) {
- Messages.log("Failed to insert import");
- ble.printStackTrace();
- }
- }
- frmImportSuggest.setVisible(false);
- frmImportSuggest.dispose();
- frmImportSuggest = null;
- }
- });
-
- frmImportSuggest.addWindowFocusListener(new WindowFocusListener() {
-
- @Override
- public void windowLostFocus(WindowEvent e) {
- if (frmImportSuggest != null) {
- frmImportSuggest.dispose();
- frmImportSuggest = null;
- }
- }
-
- @Override
- public void windowGainedFocus(WindowEvent e) {
-
- }
- });
-
- frmImportSuggest.setLocation(x, y);
- frmImportSuggest.setBounds(x, y, 250, 100);
- frmImportSuggest.pack();
- frmImportSuggest.setVisible(true);
- }
-
-
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
@@ -338,7 +298,11 @@ public class XQErrorTable extends JTable {
setForeground(textColor);
setBackground(bgColor);
}
- setText(value == null ? "" : value.toString());
+ if (column == 0 || value == null) {
+ setText("");
+ } else {
+ setText(value.toString());
+ }
return this;
}
}