diff options
author | mkersten <mkersten> | 2003-07-25 15:07:57 +0000 |
---|---|---|
committer | mkersten <mkersten> | 2003-07-25 15:07:57 +0000 |
commit | bbd832b4800bc0d7c54d65b2d9d690316e97c6a6 (patch) | |
tree | 89d0dec27daee5980d288214a230a5e93baacd3d /ajbrowser | |
parent | bcf8d044c05fb716e1161abddd18da04d2fc2364 (diff) | |
download | aspectj-bbd832b4800bc0d7c54d65b2d9d690316e97c6a6.tar.gz aspectj-bbd832b4800bc0d7c54d65b2d9d690316e97c6a6.zip |
Fix for bug#40771
De-coupled AJDE APIs from javax.swing, and moved browser-specific funtionality into the the ajbrowser module.
Diffstat (limited to 'ajbrowser')
6 files changed, 450 insertions, 41 deletions
diff --git a/ajbrowser/src/org/aspectj/tools/ajbrowser/BasicEditor.java b/ajbrowser/src/org/aspectj/tools/ajbrowser/BasicEditor.java new file mode 100644 index 000000000..8913b2109 --- /dev/null +++ b/ajbrowser/src/org/aspectj/tools/ajbrowser/BasicEditor.java @@ -0,0 +1,182 @@ +/* ******************************************************************* + * Copyright (c) 1999-2001 Xerox Corporation, + * 2002 Palo Alto Research Center, Incorporated (PARC). + * All rights reserved. + * This program and the accompanying materials are made available + * under the terms of the Common Public License v1.0 + * which accompanies this distribution and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * Xerox/PARC initial implementation + * ******************************************************************/ + + +package org.aspectj.tools.ajbrowser; + +import java.awt.BorderLayout; +import java.awt.Font; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.net.URL; + +import javax.swing.JEditorPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.text.BadLocationException; +import javax.swing.text.DefaultHighlighter; + +import org.aspectj.ajde.Ajde; +import org.aspectj.ajde.EditorAdapter; +import org.aspectj.bridge.ISourceLocation; + +/** + * Bare-bones editor implementation used when the framework is being used + * standalone. + * + * @author Mik Kersten + */ +public class BasicEditor implements EditorAdapter { + + private String NO_FILE = "<no file selected>"; + private String filePath = NO_FILE; + private JPanel editor_panel = new JPanel(); + + // @todo get rid of these + private int currHighlightStart = 0; + private int currHighlightEnd = 0; + + private BorderLayout borderLayout1 = new BorderLayout(); + private JScrollPane jScrollPane1 = new JScrollPane(); + private JEditorPane editorPane = new JEditorPane(); + + public BasicEditor() { + try { + editorPane.setEditable(true); + editorPane.setContentType("text/plain"); + editorPane.setFont(new Font("Monospaced", 0, 11)); + editor_panel.add(editorPane); + jbInit(); + } + catch(Exception e) { + Ajde.getDefault().getErrorHandler().handleError("Could not initialize GUI.", e); + } + } + + public String getCurrFile() { + return filePath; + } + + public void showSourceLine(ISourceLocation sourceLocation, boolean highlight) { + showSourceLine(sourceLocation.getSourceFile().getAbsolutePath(), sourceLocation.getLine(), highlight); + } + + public void showSourceLine(int lineNumber, boolean highlight) { + showSourceLine(filePath, lineNumber, highlight); + } + + public void pasteToCaretPos(String text) { + if (currHighlightEnd < 1) return; + String contents = editorPane.getText(); + String pasted = contents.substring(0, currHighlightEnd) + + text + contents.substring(currHighlightEnd, contents.length()); + editorPane.setText(pasted); + } + + public void showSourceLine(String filePath, int lineNumber, boolean highlight) { + //AjdeUIManager.getDefault().getIdeUIAdapter().resetEditor(); + + String oldPath = this.filePath; + this.filePath = filePath; +// if (oldPath != filePath && !Ajde.INSTANCE.BROWSER_MANAGER.isGlobalMode()) { +// Ajde.INSTANCE.BROWSER_MANAGER.updateView(); +// } + +// Ajde.IDE_MANAGER.setEditorStatusText(filePath); + + currHighlightStart = 0; + currHighlightEnd = 0; + editorPane.setText(readFile(filePath, lineNumber)); + try { + editorPane.getHighlighter().addHighlight(currHighlightStart, currHighlightEnd, DefaultHighlighter.DefaultPainter); + editorPane.setCaretPosition(currHighlightStart); + } catch (BadLocationException ble) { + Ajde.getDefault().getErrorHandler().handleError("Could not highlight location.", ble); + } + BrowserManager.getDefault().getEditorManager().notifyCurrentFileChanged(filePath); + } + + /** + * Not implemented. + */ + public void showSourcelineAnnotation(String filePath, int lineNumber, java.util.List items) { } + + public void addEditorViewForSourceLine(String filePath, int lineNumber) { + + } + + public void saveContents() throws IOException { + if (filePath != NO_FILE && filePath != "" && editorPane.getText() != "") { + BufferedWriter writer = new BufferedWriter(new FileWriter(filePath)); + writer.write(editorPane.getText()); + writer.flush(); + } + } + + public JPanel getPanel() { + return editor_panel; + } + + public void showSourceForFile(String filePath) { } + + public void showSourceForLine(int lineNumber, boolean highlight) { } + + public void showSourceForSourceLine(String filePath, int lineNumber, boolean highlight) { } + + public String getCurrSourceFilePath() { return null; } + + public void setBreakpointRequest(String filePath, int lineNumber, boolean isDeferred) { } + + public void clearBreakpointRequest(String filePath, int lineNumber) { } + + private String readFile(String filePath, int lineNumber) { + try { + URL url = ClassLoader.getSystemResource(filePath); + File file = new File(filePath); + if (!file.exists()) { + return "ERROR: file \"" + filePath + "\" does not exist."; + } + BufferedReader reader = new BufferedReader(new FileReader(file)); + StringBuffer contents = new StringBuffer(); + String line = reader.readLine(); + int numChars = 0; + int numLines = 0; + while (line != null) { + numLines++; + if (numLines < lineNumber) { + currHighlightStart += line.length()+1; + } + if (numLines == lineNumber) { + currHighlightEnd = currHighlightStart + line.length(); + } + contents.append(line); + contents.append('\n'); + line = reader.readLine(); + } + return contents.toString(); + } catch (IOException ioe) { + return "ERROR: could not read file \"" + filePath + "\", make sure that you have mounted /project/aop on X:\\"; + } + } + + private void jbInit() throws Exception { + editor_panel.setFont(new java.awt.Font("DialogInput", 1, 12)); + editor_panel.setLayout(borderLayout1); + editor_panel.add(jScrollPane1, BorderLayout.CENTER); + jScrollPane1.getViewport().add(editorPane, null); + } +} diff --git a/ajbrowser/src/org/aspectj/tools/ajbrowser/BrowserManager.java b/ajbrowser/src/org/aspectj/tools/ajbrowser/BrowserManager.java index ac8d41c19..5f6f9e6e8 100644 --- a/ajbrowser/src/org/aspectj/tools/ajbrowser/BrowserManager.java +++ b/ajbrowser/src/org/aspectj/tools/ajbrowser/BrowserManager.java @@ -15,22 +15,15 @@ package org.aspectj.tools.ajbrowser; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; import javax.swing.JFrame; -import org.aspectj.ajde.Ajde; -import org.aspectj.ajde.BuildConfigManager; -import org.aspectj.ajde.BuildListener; -import org.aspectj.ajde.TaskListManager; -import org.aspectj.ajde.ui.InvalidResourceException; -import org.aspectj.ajde.ui.UserPreferencesAdapter; +import org.aspectj.ajde.*; +import org.aspectj.ajde.ui.*; import org.aspectj.ajde.ui.internal.UserPreferencesStore; -import org.aspectj.ajde.ui.swing.AjdeUIManager; -import org.aspectj.ajde.ui.swing.BasicEditor; -import org.aspectj.ajde.ui.swing.IconRegistry; -import org.aspectj.ajde.ui.swing.MultiStructureViewPanel; +import org.aspectj.ajde.ui.swing.*; +import org.aspectj.asm.*; /** * IDE manager for standalone AJDE application. @@ -41,6 +34,8 @@ public class BrowserManager { private static final BrowserManager INSTANCE = new BrowserManager(); private BrowserProperties browserProjectProperties; + private EditorManager editorManager; + private StructureViewPanel fileStructurePanel = null; public static BrowserManager getDefault() { return INSTANCE; @@ -52,6 +47,15 @@ public class BrowserManager { private static TopFrame topFrame = null; + public final StructureModelListener VIEW_LISTENER = new StructureModelListener() { + public void modelUpdated(StructureModel model) { + FileStructureView fsv = Ajde.getDefault().getStructureViewManager().getDefaultFileView(); + if (fsv != null) { + fsv.setSourceFile(BrowserManager.getDefault().getEditorManager().getCurrFile()); + } + } + }; + public void init(String[] configFilesArgs, boolean visible) { try { UserPreferencesAdapter preferencesAdapter = new UserPreferencesStore(true); @@ -69,20 +73,28 @@ public class BrowserManager { preferencesAdapter, browserUIAdapter, new IconRegistry(), - topFrame, - true); + topFrame); + + editorManager = new EditorManager(ajdeEditor); + + FileStructureView structureView = Ajde.getDefault().getStructureViewManager().createViewForSourceFile( + editorManager.getCurrFile(), + Ajde.getDefault().getStructureViewManager().getDefaultViewProperties() + ); + Ajde.getDefault().getStructureViewManager().setDefaultFileView(structureView); + fileStructurePanel = new StructureViewPanel(structureView); Ajde.getDefault().getBuildManager().addListener(BUILD_MESSAGES_LISTENER); MultiStructureViewPanel multiViewPanel = new MultiStructureViewPanel( AjdeUIManager.getDefault().getViewManager().getBrowserPanel(), - AjdeUIManager.getDefault().getFileStructurePanel() + fileStructurePanel ); topFrame.init( multiViewPanel, (CompilerMessagesPanel)taskListManager, - Ajde.getDefault().getEditorManager().getEditorPanel() + editorManager.getEditorPanel() ); if (visible) topFrame.setVisible(true); @@ -97,8 +109,10 @@ public class BrowserManager { AjdeUIManager.getDefault().getOptionsFrame().addOptionsPanel(new BrowserOptionsPanel()); + StructureModelManager.getDefault().addListener(VIEW_LISTENER); + //String lastOpenFilePath = browserProjectProperties.getLastOpenSourceFilePath(); - //Ajde.getDefault().getEditorManager().showSourceLine(lastOpenFilePath, 1, false); + //editorManager.showSourceLine(lastOpenFilePath, 1, false); //Ajde.getDefault().getStructureViewManager().fireNavigationAction(lastOpenFilePath, 6); //Ajde.getDefault().enableLogging(System.out); @@ -132,7 +146,7 @@ public class BrowserManager { } public void saveAll() { - Ajde.getDefault().getEditorManager().saveContents(); + editorManager.saveContents(); } public void showMessages() { @@ -153,7 +167,7 @@ public class BrowserManager { AjdeUIManager.getDefault().getBuildConfigEditor().openFile(filePath); topFrame.setEditorPanel(AjdeUIManager.getDefault().getBuildConfigEditor()); } else if (filePath.endsWith(".java") || filePath.endsWith(".aj")){ - Ajde.getDefault().getEditorManager().showSourceLine(filePath, 0, false); + editorManager.showSourceLine(filePath, 0, false); } else { Ajde.getDefault().getErrorHandler().handleError("File: " + filePath + " could not be opened because the extension was not recoginzed."); @@ -226,4 +240,11 @@ public class BrowserManager { public BrowserProperties getBrowserProjectProperties() { return browserProjectProperties; } + /** + * @return + */ + public EditorManager getEditorManager() { + return editorManager; + } + } diff --git a/ajbrowser/src/org/aspectj/tools/ajbrowser/BuildConfigPopupMenu.java b/ajbrowser/src/org/aspectj/tools/ajbrowser/BuildConfigPopupMenu.java new file mode 100644 index 000000000..8ca49e727 --- /dev/null +++ b/ajbrowser/src/org/aspectj/tools/ajbrowser/BuildConfigPopupMenu.java @@ -0,0 +1,54 @@ +/* ******************************************************************* + * Copyright (c) 1999-2001 Xerox Corporation, + * 2002 Palo Alto Research Center, Incorporated (PARC). + * All rights reserved. + * This program and the accompanying materials are made available + * under the terms of the Common Public License v1.0 + * which accompanies this distribution and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * Xerox/PARC initial implementation + * ******************************************************************/ + + +package org.aspectj.tools.ajbrowser; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Iterator; + +import javax.swing.AbstractAction; +import javax.swing.Icon; +import javax.swing.JMenuItem; +import javax.swing.JPopupMenu; + +import org.aspectj.ajde.Ajde; +import org.aspectj.ajde.ui.swing.*; +import org.aspectj.asm.ProgramElementNode; + +public class BuildConfigPopupMenu extends JPopupMenu { + + public BuildConfigPopupMenu(final AbstractAction action) { + java.util.List configFiles = Ajde.getDefault().getProjectProperties().getBuildConfigFiles(); + for (Iterator it = configFiles.iterator(); it.hasNext(); ) { + final String buildConfig = (String)it.next(); + JMenuItem buildItem = new JMenuItem(buildConfig); + buildItem.setFont(AjdeWidgetStyles.DEFAULT_LABEL_FONT); + buildItem.addActionListener( + new ActionListener() { + public void actionPerformed(ActionEvent e) { + Ajde.getDefault().getConfigurationManager().setActiveConfigFile(buildConfig); + if (EditorManager.isShiftDown(e.getModifiers())) { + Ajde.getDefault().getBuildManager().buildFresh(); + } else { + Ajde.getDefault().getBuildManager().build(); + } + action.actionPerformed(e); + } + }); + buildItem.setIcon((Icon)AjdeUIManager.getDefault().getIconRegistry().getStructureIcon(ProgramElementNode.Kind.FILE_LST).getIconResource()); + this.add(buildItem); + } + } +} diff --git a/ajbrowser/src/org/aspectj/tools/ajbrowser/CompilerMessagesPanel.java b/ajbrowser/src/org/aspectj/tools/ajbrowser/CompilerMessagesPanel.java index 46a162c1e..e03885ef6 100644 --- a/ajbrowser/src/org/aspectj/tools/ajbrowser/CompilerMessagesPanel.java +++ b/ajbrowser/src/org/aspectj/tools/ajbrowser/CompilerMessagesPanel.java @@ -85,7 +85,7 @@ public class CompilerMessagesPanel extends JPanel implements TaskListManager { */ protected void displayMessage(IMessage message) { ISourceLocation loc = message.getISourceLocation(); - Ajde.getDefault().getEditorManager().showSourceLine(loc, true); + BrowserManager.getDefault().getEditorManager().showSourceLine(loc, true); // show dialog with stack trace if thrown Throwable thrown = message.getThrown(); if (null != thrown) { diff --git a/ajbrowser/src/org/aspectj/tools/ajbrowser/EditorManager.java b/ajbrowser/src/org/aspectj/tools/ajbrowser/EditorManager.java new file mode 100644 index 000000000..1c09802c7 --- /dev/null +++ b/ajbrowser/src/org/aspectj/tools/ajbrowser/EditorManager.java @@ -0,0 +1,167 @@ +/* ******************************************************************* + * Copyright (c) 1999-2001 Xerox Corporation, + * 2002 Palo Alto Research Center, Incorporated (PARC). + * All rights reserved. + * This program and the accompanying materials are made available + * under the terms of the Common Public License v1.0 + * which accompanies this distribution and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * Xerox/PARC initial implementation + * ******************************************************************/ + + +package org.aspectj.tools.ajbrowser; + +import java.awt.BorderLayout; +import java.awt.event.KeyEvent; +import java.io.IOException; +import java.util.*; + +import javax.swing.*; + +import org.aspectj.ajde.*; +import org.aspectj.bridge.ISourceLocation; + +/** + * Responsible for controlling the editor. + * + * @todo remove coupling to <CODE>BasicEditor</CODE> + * @author Mik Kersten + */ +public class EditorManager { + + /** @return true if input modifiers have shift down */ + public static boolean isShiftDown(int modifiers) { + return (0 != (modifiers & KeyEvent.SHIFT_MASK)); + } + + private EditorAdapter editor = null; + private BasicEditor basicEditor = null; + private ArrayList editorListeners = new ArrayList(); + private Vector editors = new Vector(); + private JPanel editor_panel = null; + private Box editors_box = Box.createVerticalBox(); + + public EditorManager(EditorAdapter ajdeEditor) { + if (ajdeEditor instanceof BasicEditor) { + this.basicEditor = (BasicEditor)ajdeEditor; + editors.add(basicEditor); + editors_box.add(basicEditor.getPanel()); + editor_panel = new JPanel(new BorderLayout()); + editor_panel.add(editors_box, BorderLayout.CENTER); + } else { + editors.add(ajdeEditor); + this.editor = ajdeEditor; + } + } + + public void addListener(EditorListener editorListener) { + editorListeners.add(editorListener); + } + + public void removeListener(EditorListener editorListener) { + editorListeners.remove(editorListener); + } + + public void notifyCurrentFileChanged(String filePath) { + for (Iterator it = editorListeners.iterator(); it.hasNext(); ) { + ((EditorListener)it.next()).currentFileChanged(filePath); + } + } + + public void addViewForSourceLine(final String filePath, final int lineNumber) { + if (basicEditor == null) return; + editors_box.remove(basicEditor.getPanel()); + final BasicEditor newEditor = new BasicEditor(); + editors.add(newEditor); + + Runnable update = new Runnable() { + public void run() { + editors_box.add(newEditor.getPanel()); + newEditor.showSourceLine(filePath, lineNumber, true); + //AjdeUIManager.getDefault().getIdeUIAdapter().resetGUI(); + } + }; + + if (SwingUtilities.isEventDispatchThread()) { + update.run(); + } else { + try { + SwingUtilities.invokeAndWait(update); + } catch (Exception e) { + Ajde.getDefault().getErrorHandler().handleError("Could not add view for source line.", e); + } + } + } + + public String getCurrFile() { + if (basicEditor != null) { + return basicEditor.getCurrFile(); + } else { + return editor.getCurrFile(); + } + } + + + public void showSourceLine(ISourceLocation sourceLocation, boolean highlight) { + if (sourceLocation != null) { + showSourceLine( + sourceLocation.getSourceFile().getAbsolutePath(), + sourceLocation.getLine(), + highlight); + } + } + + /** + * @todo remove "instanceof AjdeManager" hack + */ + public void showSourceLine(String filePath, int lineNumber, boolean highlight) { + if (editors.size() > 1) { + editors_box.removeAll(); + editors_box.add(basicEditor.getPanel()); + //AjdeUIManager.getDefault().getIdeUIAdapter().resetGUI(); + editors.removeAllElements(); + editors.add(basicEditor); + } + + if (basicEditor != null) { + basicEditor.showSourceLine(filePath, lineNumber, highlight); + } else { + editor.showSourceLine(filePath, lineNumber, highlight); + } + } + + public void pasteToCaretPos(String text) { + if (basicEditor != null) { + basicEditor.pasteToCaretPos(text); + } else { + editor.pasteToCaretPos(text); + } + } + + public void showSourcelineAnnotation(String filePath, int lineNumber, java.util.List items) { + editor.showSourcelineAnnotation(filePath, lineNumber, items); + } + + public void saveContents() { + try { + for (Iterator it = editors.iterator(); it.hasNext(); ) { + ((EditorAdapter)it.next()).saveContents(); + } + } catch (IOException ioe) { + Ajde.getDefault().getErrorHandler().handleError("Editor could not save the current file.", ioe); + } + } + + public JPanel getEditorPanel() { + if (editor_panel != null) { + return editor_panel; + } else { + return basicEditor.getPanel(); + } + } +} + + diff --git a/ajbrowser/src/org/aspectj/tools/ajbrowser/TopFrame.java b/ajbrowser/src/org/aspectj/tools/ajbrowser/TopFrame.java index 7e3afb82d..e97ae9dd1 100644 --- a/ajbrowser/src/org/aspectj/tools/ajbrowser/TopFrame.java +++ b/ajbrowser/src/org/aspectj/tools/ajbrowser/TopFrame.java @@ -14,26 +14,16 @@ package org.aspectj.tools.ajbrowser; -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.event.ActionEvent; -import java.awt.event.KeyEvent; -import java.awt.event.WindowEvent; +import java.awt.*; +import java.awt.event.*; import java.io.File; import javax.swing.*; -import javax.swing.border.BevelBorder; -import javax.swing.border.Border; +import javax.swing.border.*; import javax.swing.filechooser.FileFilter; import org.aspectj.ajde.Ajde; -import org.aspectj.ajde.ui.EditorManager; -import org.aspectj.ajde.ui.swing.AJButtonMenuCombo; -import org.aspectj.ajde.ui.swing.AjdeUIManager; -import org.aspectj.ajde.ui.swing.BuildConfigPopupMenu; -import org.aspectj.ajde.ui.swing.MultiStructureViewPanel; +import org.aspectj.ajde.ui.swing.*; import org.aspectj.asm.ProgramElementNode; /** @@ -465,7 +455,7 @@ public class TopFrame extends JFrame { void treeMode_comboBox_actionPerformed(ActionEvent e) { } void save_button_actionPerformed(ActionEvent e) { - Ajde.getDefault().getEditorManager().saveContents(); + BrowserManager.getDefault().getEditorManager().saveContents(); } @@ -483,13 +473,8 @@ public class TopFrame extends JFrame { messages_panel.setVisible(false); } - - void emacsTest_button_actionPerformed(ActionEvent e) { -// Tester.emacsCompile(TopManager.BROWSER_MANAGER.getCurrConfigFile()); - } - void jMenuItem1_actionPerformed(ActionEvent e) { - Ajde.getDefault().getEditorManager().saveContents(); + BrowserManager.getDefault().getEditorManager().saveContents(); } void projectBuild_menuItem_actionPerformed(ActionEvent e) { |