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; } }