From: <wi...@us...> - 2012-08-29 18:35:58
|
Revision: 22093 http://jedit.svn.sourceforge.net/jedit/?rev=22093&view=rev Author: wingser Date: 2012-08-29 18:35:51 +0000 (Wed, 29 Aug 2012) Log Message: ----------- Add a option pane to jEdit as its option pane. Rename some classes. Modified Paths: -------------- plugins/ClangCompletion/trunk/ClangCompletion.props plugins/ClangCompletion/trunk/note.txt plugins/ClangCompletion/trunk/services.xml plugins/ClangCompletion/trunk/src/clangcompletion/BufferWatcher.java plugins/ClangCompletion/trunk/src/clangcompletion/ClangCompletionCandidate.java plugins/ClangCompletion/trunk/src/clangcompletion/ClangCompletionPlugin.java plugins/ClangCompletion/trunk/src/clangcompletion/ClangCompletionProvider.java Added Paths: ----------- plugins/ClangCompletion/trunk/src/clangcompletion/ClangBuilder.java plugins/ClangCompletion/trunk/src/clangcompletion/ClangBuilderListener.java plugins/ClangCompletion/trunk/src/clangcompletion/ClangCompletionOptionPane.java plugins/ClangCompletion/trunk/src/clangcompletion/CompletionListCellRenderer.java plugins/ClangCompletion/trunk/src/clangcompletion/ProjectsOptionPane.java plugins/ClangCompletion/trunk/src/clangcompletion/Util.java Removed Paths: ------------- plugins/ClangCompletion/trunk/src/clangcompletion/ClangCompletionConfiguration.java plugins/ClangCompletion/trunk/src/clangcompletion/ClangCompletionRenderer.java Modified: plugins/ClangCompletion/trunk/ClangCompletion.props =================================================================== --- plugins/ClangCompletion/trunk/ClangCompletion.props 2012-08-29 00:01:13 UTC (rev 22092) +++ plugins/ClangCompletion/trunk/ClangCompletion.props 2012-08-29 18:35:51 UTC (rev 22093) @@ -22,3 +22,7 @@ plugin.projectviewer.clangcompletion.main.ClangCompletionPlugin.option-pane=ClangCompletion-Configuration options.ClangCompletion-Configuration.label=ClangCompletion options.ClangCompletion-Configuration.code=new clangcompletion.ClangCompletionConfiguration() + +plugin.clangcompletion.ClangCompletionPlugin.option-pane=optionpane +options.optionpane.code=new clangcompletion.ClangCompletionOptionPane(); +options.optionpane.label=ClangCompletion Modified: plugins/ClangCompletion/trunk/note.txt =================================================================== --- plugins/ClangCompletion/trunk/note.txt 2012-08-29 00:01:13 UTC (rev 22092) +++ plugins/ClangCompletion/trunk/note.txt 2012-08-29 18:35:51 UTC (rev 22093) @@ -1,7 +1,7 @@ TODO: -add pch support. add more configuration. DONE: +add pch support. lock clang syntax check to avoid mutiple clang process being invoke at same time. provide better completation ui. Modified: plugins/ClangCompletion/trunk/services.xml =================================================================== --- plugins/ClangCompletion/trunk/services.xml 2012-08-29 00:01:13 UTC (rev 22092) +++ plugins/ClangCompletion/trunk/services.xml 2012-08-29 18:35:51 UTC (rev 22093) @@ -6,6 +6,6 @@ new clangcompletion.ClangCompletionProvider(); </SERVICE> <SERVICE CLASS="projectviewer.config.OptionsService" NAME="ClangCompletion OptionsService"> - new clangcompletion.ClangCompletionConfiguration.ClangCompletionOptionService(); + new clangcompletion.ProjectsOptionPane.ClangCompletionOptionService(); </SERVICE> </SERVICES> Modified: plugins/ClangCompletion/trunk/src/clangcompletion/BufferWatcher.java =================================================================== --- plugins/ClangCompletion/trunk/src/clangcompletion/BufferWatcher.java 2012-08-29 00:01:13 UTC (rev 22092) +++ plugins/ClangCompletion/trunk/src/clangcompletion/BufferWatcher.java 2012-08-29 18:35:51 UTC (rev 22093) @@ -23,7 +23,7 @@ import java.util.regex.Pattern; import java.util.regex.Matcher; import javax.swing.SwingUtilities; -import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicBoolean; import org.gjt.sp.jedit.Buffer; import org.gjt.sp.jedit.Mode; import org.gjt.sp.jedit.View; @@ -43,190 +43,96 @@ import projectviewer.ProjectViewer; import projectviewer.vpt.VPTProject; -public class BufferWatcher +public class BufferWatcher implements ClangBuilderListener { - private AtomicInteger numOfClangThreadWorking = new AtomicInteger(); + private AtomicBoolean isClangBuilderAlive = new AtomicBoolean(); + private Pattern errorPattern = Pattern.compile("((?:\\w:)?[^:]+?):(\\d+):(\\d+):[\\d:\\-\\{\\}]*\\s*(\\w+):(.+)"); + + private DefaultErrorSource errorSrc; + public BufferWatcher() { EditBus.addToBus(this); + errorSrc = new DefaultErrorSource(this.getClass().getName()); + ErrorSource.registerErrorSource(errorSrc); } public void shutdown() { EditBus.removeFromBus(this); + if(errorSrc != null) + { + errorSrc = null; + ErrorSource.unregisterErrorSource(errorSrc); + } } @EBHandler public void handleBufferUpdate(BufferUpdate bu) { - if(numOfClangThreadWorking.intValue() > 0) + if (( bu.getWhat() == BufferUpdate.SAVED) && jEdit.getBooleanProperty("clangcompletion.parse_buffer", true)) { - return; - } - - System.out.println("handleBufferUpdate"); - if (( bu.getWhat() == BufferUpdate.SAVED) ) - { Buffer buffer = bu.getBuffer(); String path = buffer.getPath(); - String xparam = null; - if(buffer.getMode().equals(jEdit.getMode("c"))) + ClangBuilder builder = new ClangBuilder(); + builder.add("-cc1"); + builder.add("-w"); + builder.add("-fsyntax-only"); + builder.add("-fno-caret-diagnostics"); + builder.add("-fdiagnostics-print-source-range-info"); + builder.add(path); + if(!builder.setTarget(buffer)) { - xparam = "c"; - }else if(buffer.getMode().equals(jEdit.getMode("objective-c"))) - { - xparam = "objective-c"; - }else if(buffer.getMode().equals(jEdit.getMode("c++"))) - { - xparam = "c++"; + return; } // Do not check header files because in most case clang cannot compile // a header file correctly without implementation cpp sources. - if(xparam != null && !path.endsWith("hpp") && !path.endsWith("h")) + if(Util.isHeaderFile(buffer.getFile())) { + return; + } - if(buffer.getFile().getName().endsWith("hpp") || buffer.getFile().getName().endsWith("h")) - { - xparam += "-header"; - } - - final ArrayList<String> args = new ArrayList<String>(); - args.add("clang"); - args.add("-cc1"); - args.add("-w"); - args.add("-fsyntax-only"); - args.add("-fno-caret-diagnostics"); - args.add("-fdiagnostics-print-source-range-info"); - //args.add("-code-completion-at="+path+":"+line+":"+column); - args.add(path); - args.add("-x"); - args.add(xparam); - - clearErrors(); - - - VPTProject project = ProjectViewer.getActiveProject(bu.getView()); - HashMap<String, Vector<String>> properties = ClangCompletionConfiguration.getProperties(project.getName()); - Vector<String> includes = properties.get(ClangCompletionConfiguration.INCLUDES); - if(includes != null) - { - for(int i = 0; i < includes.size(); i++) - { - args.add("-I" +includes.get(i) ); - } - } - - Vector<String> definitions = properties.get(ClangCompletionConfiguration.DEFINITIONS); - if(definitions != null) - { - for(int i = 0; i < definitions.size(); i++) - { - args.add("-D" +definitions.get(i) ); - } - } - - Vector<String> arguments = properties.get(ClangCompletionConfiguration.ARGUMENTS); - if(arguments != null) - { - for(int i = 0; i < arguments.size(); i++) - { - args.add(arguments.get(i)); - } - } - - StringBuilder cmd = new StringBuilder(); - for(int i = 0; i < args.size();i++) - { - cmd.append(args.get(i)+" "); - } - System.out.println(cmd); - - String [] argsArr = new String[args.size()]; - args.toArray(argsArr); + clearErrors(); + + VPTProject project = ProjectViewer.getActiveProject(bu.getView()); + HashMap<String, Vector<String>> properties = ProjectsOptionPane.getProperties(project.getName()); + Vector<String> includes = properties.get(ProjectsOptionPane.INCLUDES); + if(includes != null) + { + builder.addIncludes(includes); + } + + Vector<String> definitions = properties.get(ProjectsOptionPane.DEFINITIONS); + if(definitions != null) + { + builder.addDefinitions(definitions); + } + + builder.setListener(this); + System.out.println(builder); + if(!isClangBuilderAlive.get()) + { try { - final Process process = Runtime.getRuntime().exec(argsArr); - - - new Thread() - { - public void run() - { - - numOfClangThreadWorking.addAndGet(1); - try - { - BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream())); - String input = reader.readLine(); - while(input!=null) - { - //System.out.println("stderr: " + input); - parseError(input); - input = reader.readLine(); - - } - }catch(Exception ex) - { - ex.printStackTrace(); - }finally - { - numOfClangThreadWorking.addAndGet(-1); - } - } - }.start(); - - new Thread() - { - public void run() - { - numOfClangThreadWorking.addAndGet(1); - - try - { - BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); - String input = reader.readLine(); - while(input != null) - { - input = reader.readLine(); - } - }catch(Exception ex) - { - ex.printStackTrace(); - }finally - { - numOfClangThreadWorking.addAndGet(-1); - } - } - }.start(); - + isClangBuilderAlive.set(true); + builder.exec(); }catch(IOException ex) { + isClangBuilderAlive.set(false); ex.printStackTrace(); } } } } - private void clearErrors() + @Override + public void errorRecieved(String line) { - SwingUtilities.invokeLater(new Runnable() - { - public void run() - { - jEdit.getAction("error-list-clear").invoke(null); - } - }); - } - - private Pattern errorPattern = Pattern.compile("((?:\\w:)?[^:]+?):(\\d+):(\\d+):[\\d:\\-\\{\\}]*\\s*(\\w+):(.+)"); - - private void parseError(String clangOutput) - { - System.out.println("error: " + clangOutput); - final Matcher matcher = errorPattern.matcher(clangOutput); + System.out.println("error: " + line); + final Matcher matcher = errorPattern.matcher(line); if(matcher.find() && matcher.groupCount() >= 5) { @@ -234,7 +140,7 @@ { public void run() { - ClangCompletionPlugin.errorSrc.addError(new DefaultError(ClangCompletionPlugin.errorSrc, + errorSrc.addError(new DefaultError(errorSrc, matcher.group(4).trim().equals("error")?ErrorSource.ERROR:ErrorSource.WARNING, matcher.group(1), Integer.parseInt(matcher.group(2)) - 1, @@ -246,4 +152,26 @@ } } + + public void outputRecieved(String line) + { + + } + + public void exited() + { + isClangBuilderAlive.set(false); + } + + private void clearErrors() + { + SwingUtilities.invokeLater(new Runnable() + { + public void run() + { + jEdit.getAction("error-list-clear").invoke(null); + } + }); + } + } Added: plugins/ClangCompletion/trunk/src/clangcompletion/ClangBuilder.java =================================================================== --- plugins/ClangCompletion/trunk/src/clangcompletion/ClangBuilder.java (rev 0) +++ plugins/ClangCompletion/trunk/src/clangcompletion/ClangBuilder.java 2012-08-29 18:35:51 UTC (rev 22093) @@ -0,0 +1,167 @@ +package clangcompletion; +import java.util.*; +import java.io.*; +import org.gjt.sp.jedit.*; +public class ClangBuilder +{ + private ArrayList<String> cmds; + + private ClangBuilderListener listener; + + public ClangBuilder() + { + cmds = new ArrayList<String>(); + cmds.add(jEdit.getProperty( "clangcompletion.clang_path", "clang")); + } + + public ClangBuilder(String clangPath) + { + cmds = new ArrayList<String>(); + cmds.add(clangPath); + } + + public void setListener(ClangBuilderListener listener) + { + this.listener = listener; + } + + public void add(String arg) + { + cmds.add(arg); + } + + public void add(Collection<String> args) + { + cmds.addAll(args); + } + + public void addIncludes(Collection<String> args) + { + Iterator<String> iterator = args.iterator(); + while(iterator.hasNext()) + { + cmds.add("-I" + iterator.next()); + } + } + + public void addDefinitions(Collection<String> args) + { + Iterator<String> iterator = args.iterator(); + while(iterator.hasNext()) + { + cmds.add("-D" + iterator.next()); + } + } + + public String toString() + { + StringBuilder cmd = new StringBuilder(); + for(int i = 0; i < cmds.size();i++) + { + String arg = cmds.get(i); + if(arg.indexOf(" ") >= 0) + { + cmd.append("\""); + } + cmd.append(arg); + if(arg.indexOf(" ") >= 0) + { + cmd.append("\""); + } + cmd.append(" "); + } + return cmd.toString(); + } + + public boolean setTarget(Buffer buffer) + { + String xparam = null; + if(buffer.getMode().equals(jEdit.getMode("c"))) + { + xparam = "c"; + }else if(buffer.getMode().equals(jEdit.getMode("objective-c"))) + { + xparam = "objective-c"; + }else if(buffer.getMode().equals(jEdit.getMode("c++"))) + { + xparam = "c++"; + }else + { + return false; + } + + if(Util.isHeaderFile(buffer.getFile())) + { + xparam += "-header"; + } + + cmds.add("-x"); + cmds.add(xparam); + + return true; + } + + public void exec() throws IOException + { + String [] cmdsArr = new String[cmds.size()]; + cmds.toArray(cmdsArr); + + if(listener == null) + { + Runtime.getRuntime().exec(cmdsArr); + return; + } + + final Process process = Runtime.getRuntime().exec(cmdsArr); + new Thread() + { + public void run() + { + try + { + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream())); + String input = reader.readLine(); + while(input!=null) + { + listener.errorRecieved(input); + input = reader.readLine(); + } + }catch(IOException ex) + { + ex.printStackTrace(); + } + } + }.start(); + + new Thread() + { + public void run() + { + try + { + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + String input = reader.readLine(); + while(input != null) + { + listener.outputRecieved(input); + input = reader.readLine(); + } + }catch(IOException ex) + { + ex.printStackTrace(); + } + + try + { + process.waitFor(); + }catch(InterruptedException ex) + { + ex.printStackTrace(); + }finally + { + listener.exited(); + } + } + }.start(); + } +} Added: plugins/ClangCompletion/trunk/src/clangcompletion/ClangBuilderListener.java =================================================================== --- plugins/ClangCompletion/trunk/src/clangcompletion/ClangBuilderListener.java (rev 0) +++ plugins/ClangCompletion/trunk/src/clangcompletion/ClangBuilderListener.java 2012-08-29 18:35:51 UTC (rev 22093) @@ -0,0 +1,10 @@ +package clangcompletion; + +public interface ClangBuilderListener +{ + public void errorRecieved(String line); + + public void outputRecieved(String line); + + public void exited(); +} Modified: plugins/ClangCompletion/trunk/src/clangcompletion/ClangCompletionCandidate.java =================================================================== --- plugins/ClangCompletion/trunk/src/clangcompletion/ClangCompletionCandidate.java 2012-08-29 00:01:13 UTC (rev 22092) +++ plugins/ClangCompletion/trunk/src/clangcompletion/ClangCompletionCandidate.java 2012-08-29 18:35:51 UTC (rev 22093) @@ -28,7 +28,7 @@ private ClangCompletionCandidate() { super(""); - renderer = new ClangCompletionRenderer(); + renderer = new CompletionListCellRenderer(); } @Override Deleted: plugins/ClangCompletion/trunk/src/clangcompletion/ClangCompletionConfiguration.java =================================================================== --- plugins/ClangCompletion/trunk/src/clangcompletion/ClangCompletionConfiguration.java 2012-08-29 00:01:13 UTC (rev 22092) +++ plugins/ClangCompletion/trunk/src/clangcompletion/ClangCompletionConfiguration.java 2012-08-29 18:35:51 UTC (rev 22093) @@ -1,359 +0,0 @@ -package clangcompletion; - -import java.awt.GridBagConstraints; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.concurrent.Callable; -import java.util.HashMap; -import java.util.Vector; -import java.io.*; -import javax.swing.DefaultListModel; -import javax.swing.JButton; -import javax.swing.JFileChooser; -import javax.swing.JLabel; -import javax.swing.JList; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; - -import org.gjt.sp.jedit.AbstractOptionPane; -import org.gjt.sp.jedit.GUIUtilities; -import org.gjt.sp.jedit.MiscUtilities; -import org.gjt.sp.jedit.OptionGroup; -import org.gjt.sp.jedit.OptionPane; -import org.gjt.sp.jedit.jEdit; -import org.gjt.sp.jedit.gui.RolloverButton; -import org.gjt.sp.jedit.View; -import org.gjt.sp.jedit.browser.VFSBrowser; -import org.gjt.sp.jedit.browser.VFSFileChooserDialog; - -import projectviewer.ProjectManager; -import projectviewer.config.OptionsService; -import projectviewer.vpt.VPTProject; -import projectviewer.ProjectViewer; -public class ClangCompletionConfiguration extends AbstractOptionPane -{ - public static final String DEFINITIONS = "CLANG_DEFINITIONS"; - - public static final String INCLUDES = "CLANG_INCLUDES"; - - public static final String PRECOMPILEDS = "CLANG_PRECOMPILEDS"; - - private JList definitions, includes, precompileds; - - private DefaultListModel definitionModel, includesModel, precompiledsModel; - - private VPTProject project; - - public ClangCompletionConfiguration(VPTProject project) - { - super("ClangCompletion-Configuration"); - this.project = project; - } - - @Override - protected void _init() - { - includesModel = getListModel(INCLUDES); - includes = createList("Includes:", includesModel, new Callable<String>() - { - public String call() - { - return showIncludeSelectionDialog(); - } - }); - addSeparator(); - - definitionModel = getListModel(DEFINITIONS); - definitions = createList("Pre-compiled definition:", definitionModel, new Callable<String>() - { - public String call() - { - return ShowInputDefinitionDialog(); - } - }); - addSeparator(); - - precompiledsModel = getListModel(PRECOMPILEDS); - precompileds = createListPrecompileds("Pre-compiled headers:", precompiledsModel, new Callable<String>() - { - public String call() - { - return ShowInputPrecompiledsDialog(); - } - }); - addSeparator(); - } - - private void setListModel(String propertyName, DefaultListModel model) - { - Vector<String> list = new Vector<String>(); - for (int i = 0; i < model.size(); i++) - { - list.add((String) model.getElementAt(i)); - } - setListProperty(propertyName, list); - } - private DefaultListModel getListModel(String propertyName) - { - Vector<String> list = getListProperty(propertyName); - DefaultListModel model = new DefaultListModel(); - for (int i = 0; i < list.size(); i++) - { - model.addElement(list.get(i)); - } - return model; - } - - private Vector<String> getListProperty(String propertyName) - { - return getListProperty(project, propertyName); - } - - private void setListProperty(String propertyName, Vector<String> list) - { - for (int i = 0; i < list.size(); i++) - { - project.setProperty(propertyName + i, list.get(i)); - } - - for (int i = list.size(); true; i++) - { - String prop = propertyName + i; - if (project.getProperty(prop) == null) - { - break; - }else - { - project.removeProperty(prop); - } - } - } - - private void clearPthBuffer() - { - View view = jEdit.getActiveView(); - VPTProject project = ProjectViewer.getActiveProject(view); - File filePth = new File(ClangCompletionPlugin.pluginHome, project.getName()+".pth"); - System.out.println(filePth); - filePth.delete(); - } - - private JList createListPrecompileds(String title, final DefaultListModel model, final Callable<String> callable) - { - addComponent(new JLabel(title)); - final JList list = new JList(model); - addComponent(new JScrollPane(list), GridBagConstraints.HORIZONTAL); - JPanel buttons = new JPanel(); - JButton add = new RolloverButton(GUIUtilities.loadIcon("Plus.png")); - add.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - try - { - String s = callable.call(); - if (s != null) - { - int index = list.getSelectedIndex(); - model.add(index + 1, s); - list.setSelectedIndex(index + 1); - - clearPthBuffer(); - } - }catch(Exception ex) - { - ex.printStackTrace(); - } - } - }); - JButton remove = new RolloverButton(GUIUtilities.loadIcon("Minus.png")); - remove.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - int index = list.getSelectedIndex(); - if (index >= 0) - { - model.removeElementAt(index); - if (index < model.size()) - { - list.setSelectedIndex(index); - }else if (! model.isEmpty()) - { - list.setSelectedIndex(model.size() - 1); - } - clearPthBuffer(); - } - } - }); - - - JButton refresh = new RolloverButton(GUIUtilities.loadIcon("Clear.png")); - refresh.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - clearPthBuffer(); - } - }); - - buttons.add(add); - buttons.add(remove); - buttons.add(refresh); - addComponent(buttons); - return list; - } - - private JList createList(String title, final DefaultListModel model, final Callable<String> callable) - { - addComponent(new JLabel(title)); - final JList list = new JList(model); - addComponent(new JScrollPane(list), GridBagConstraints.HORIZONTAL); - JPanel buttons = new JPanel(); - JButton add = new RolloverButton(GUIUtilities.loadIcon("Plus.png")); - add.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - try - { - String s = callable.call(); - if (s != null) - { - int index = list.getSelectedIndex(); - model.add(index + 1, s); - list.setSelectedIndex(index + 1); - } - }catch(Exception ex) - { - ex.printStackTrace(); - } - } - }); - JButton remove = new RolloverButton(GUIUtilities.loadIcon("Minus.png")); - remove.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - int index = list.getSelectedIndex(); - if (index >= 0) - { - model.removeElementAt(index); - if (index < model.size()) - { - list.setSelectedIndex(index); - }else if (! model.isEmpty()) - { - list.setSelectedIndex(model.size() - 1); - } - } - } - }); - - - buttons.add(add); - buttons.add(remove); - addComponent(buttons); - return list; - } - - private String ShowInputPrecompiledsDialog() - { - View view = jEdit.getActiveView(); - String path = jEdit.getProperty("projectviewer.filechooser.directory", - System.getProperty("user.home")); - String [] result = GUIUtilities.showVFSFileDialog(GUIUtilities.getParentDialog(this), - view, path, VFSBrowser.OPEN_DIALOG, false); - if(result != null && result.length > 0) - { - return result[0]; - }else - { - return null; - } - } - - private String ShowInputDefinitionDialog() - { - return (String) JOptionPane.showInputDialog(this, "Input definition:", "Definitions", - JOptionPane.QUESTION_MESSAGE); - } - - private String showIncludeSelectionDialog() - { - View view = jEdit.getActiveView(); - String path = jEdit.getProperty("projectviewer.filechooser.directory", - System.getProperty("user.home")); - String [] result = GUIUtilities.showVFSFileDialog(GUIUtilities.getParentDialog(this), - view, path, VFSBrowser.CHOOSE_DIRECTORY_DIALOG, false); - if(result != null && result.length > 0) - { - return result[0]; - }else - { - return null; - } - } - - @Override - protected void _save() - { - setListModel(DEFINITIONS, definitionModel); - setListModel(INCLUDES, includesModel); - setListModel(PRECOMPILEDS, precompiledsModel); - } - - public static Vector<String> getListProperty(VPTProject project, String propertyName) - { - Vector<String> list = new Vector<String>(); - int i = 0; - while (true) - { - String value = project.getProperty(propertyName + i); - if (value != null) - { - list.add(value); - i++; - }else - { - break; - } - } - return list; - } - - public static HashMap<String, Vector<String>> getProperties(String projectName) - { - HashMap<String, Vector<String>> map = new HashMap<String, Vector<String>>(); - VPTProject project = ProjectManager.getInstance().getProject(projectName); - if (project == null) - { - return map; - } - - Vector<String> definitions = getListProperty(project, DEFINITIONS); - map.put(DEFINITIONS , definitions); - - Vector<String> includes = getListProperty(project, INCLUDES); - map.put(INCLUDES, includes); - - Vector<String> precompileds = getListProperty(project, PRECOMPILEDS); - map.put(PRECOMPILEDS, precompileds); - - return map; - } - - public static class ClangCompletionOptionService implements OptionsService - { - public OptionGroup getOptionGroup(VPTProject proj) - { - return null; - } - - public OptionPane getOptionPane(VPTProject proj) - { - return new ClangCompletionConfiguration(proj); - } - } -} Added: plugins/ClangCompletion/trunk/src/clangcompletion/ClangCompletionOptionPane.java =================================================================== --- plugins/ClangCompletion/trunk/src/clangcompletion/ClangCompletionOptionPane.java (rev 0) +++ plugins/ClangCompletion/trunk/src/clangcompletion/ClangCompletionOptionPane.java 2012-08-29 18:35:51 UTC (rev 22093) @@ -0,0 +1,71 @@ +package clangcompletion; +import java.awt.Color; +import java.awt.GridBagConstraints; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.concurrent.Callable; +import java.util.HashMap; +import java.util.Vector; +import java.io.*; +import javax.swing.DefaultListModel; +import javax.swing.JButton; +import javax.swing.JFileChooser; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; + +import org.gjt.sp.jedit.AbstractOptionPane; +import org.gjt.sp.jedit.GUIUtilities; +import org.gjt.sp.jedit.MiscUtilities; +import org.gjt.sp.jedit.OptionGroup; +import org.gjt.sp.jedit.*; +import org.gjt.sp.jedit.jEdit; +import org.gjt.sp.jedit.gui.RolloverButton; +import org.gjt.sp.jedit.View; +import org.gjt.sp.jedit.browser.VFSBrowser; +import org.gjt.sp.jedit.browser.VFSFileChooserDialog; + +import projectviewer.ProjectManager; +import projectviewer.config.OptionsService; +import projectviewer.vpt.VPTProject; +import projectviewer.ProjectViewer; +import javax.swing.JCheckBox; +import javax.swing.JPanel; +import javax.swing.JTextArea; +import javax.swing.JTextField; +import javax.swing.border.EmptyBorder; +import javax.swing.border.TitledBorder; + +public class ClangCompletionOptionPane extends AbstractOptionPane +{ + + private static final long serialVersionUID = 1L; + + private JTextField clangPathTF; + private JCheckBox passBufferCheckBox; + + public ClangCompletionOptionPane() + { + super("ClangCompletion"); + setBorder(new EmptyBorder(5, 5, 5, 5)); + + clangPathTF = new JTextField(jEdit.getProperty( "clangcompletion.clang_path", "clang") , 40); + addComponent("Clang Path: ", clangPathTF); + + passBufferCheckBox = new JCheckBox( + "Parse buffer on file saved", + jEdit.getBooleanProperty("clangcompletion.parse_buffer", true)); + addComponent(passBufferCheckBox); + } + + + @Override + protected void _save() + { + jEdit.setProperty("clangcompletion.clang_path", clangPathTF.getText()); + jEdit.setBooleanProperty("clangcompletion.parse_buffer", passBufferCheckBox.isSelected()); + } +} + Modified: plugins/ClangCompletion/trunk/src/clangcompletion/ClangCompletionPlugin.java =================================================================== --- plugins/ClangCompletion/trunk/src/clangcompletion/ClangCompletionPlugin.java 2012-08-29 00:01:13 UTC (rev 22092) +++ plugins/ClangCompletion/trunk/src/clangcompletion/ClangCompletionPlugin.java 2012-08-29 18:35:51 UTC (rev 22093) @@ -1,35 +1,17 @@ package clangcompletion; -//{{{ Imports import java.io.*; import org.gjt.sp.jedit.EditPlugin; import errorlist.ErrorSource; import errorlist.DefaultErrorSource; import errorlist.DefaultErrorSource.DefaultError; -//}}} public class ClangCompletionPlugin extends EditPlugin { - public static DefaultErrorSource errorSrc; - - public static File pluginHome; - public void start() { - pluginHome = getPluginHome(); - pluginHome.mkdirs(); - + getPluginHome().mkdirs(); new BufferWatcher(); - if(errorSrc == null) - { - errorSrc = new DefaultErrorSource(this.getClass().getName()); - ErrorSource.registerErrorSource(errorSrc); - } } public void stop() { - if(errorSrc != null) - { - - ErrorSource.unregisterErrorSource(errorSrc);errorSrc = null; - } } } Modified: plugins/ClangCompletion/trunk/src/clangcompletion/ClangCompletionProvider.java =================================================================== --- plugins/ClangCompletion/trunk/src/clangcompletion/ClangCompletionProvider.java 2012-08-29 00:01:13 UTC (rev 22092) +++ plugins/ClangCompletion/trunk/src/clangcompletion/ClangCompletionProvider.java 2012-08-29 18:35:51 UTC (rev 22093) @@ -15,8 +15,8 @@ import java.util.regex.Pattern; import java.util.regex.Matcher; import javax.swing.SwingUtilities; - -import org.gjt.sp.jedit.Buffer; +import java.util.concurrent.atomic.*; +import org.gjt.sp.jedit.*; import org.gjt.sp.jedit.Mode; import org.gjt.sp.jedit.View; import org.gjt.sp.jedit.jEdit; @@ -58,12 +58,14 @@ @Override public List<CompletionCandidate> getCompletionCandidates(View view) { + + + final Vector<CompletionCandidate> codeCompletions = new Vector<CompletionCandidate>(); String prefix = CompletionUtil.getCompletionPrefix(view); if(prefix == null || prefix.trim().length() == 0) { - return new ArrayList<CompletionCandidate>(); + return codeCompletions; } - prefix = prefix.toLowerCase(); Buffer buffer = view.getBuffer(); buffer.autosave(); @@ -75,150 +77,84 @@ column -= CompletionUtil.getCompletionPrefix(view).length(); column+=1;//clang counts col starts from 1 line += 1; - String xparam = null; - if(buffer.getMode().equals(jEdit.getMode("c"))) - { - xparam = "c"; - }else if(buffer.getMode().equals(jEdit.getMode("objective-c"))) - { - xparam = "objective-c"; - }else //if(buffer.getMode().equals(jEdit.getMode("c++"))) - { - xparam = "c++"; - } - if(buffer.getFile().getName().endsWith("hpp") || buffer.getFile().getName().endsWith("h")) - { - xparam += "-header"; - } - String path = buffer.getPath(); if(buffer.getAutosaveFile().exists()) { path = buffer.getAutosaveFile().getPath(); } - ArrayList<String> args = new ArrayList<String>(); - args.add("clang"); - args.add("-cc1"); - args.add("-w"); - args.add("-fsyntax-only"); - args.add("-fno-caret-diagnostics"); - args.add("-fdiagnostics-print-source-range-info"); - args.add("-code-completion-at="+path+":"+line+":"+column); - args.add(path); - args.add("-x"); - args.add(xparam); - /* - StringBuilder cmd = new StringBuilder("clang -cc1 -w -fsyntax-only -fno-caret-diagnostics -fdiagnostics-print-source-range-info -code-completion-at="); - cmd.append(path); - cmd.append(":" ); - cmd.append(line ); - cmd.append(":" ); - cmd.append(column ); - cmd.append(" " ); - cmd.append(path ); - cmd.append(" -x " ); - cmd.append(xparam ); - */ + ClangBuilder builder = new ClangBuilder(); + builder.add("-cc1"); + builder.add("-w"); + builder.add("-fsyntax-only"); + builder.add("-fno-caret-diagnostics"); + builder.add("-fdiagnostics-print-source-range-info"); + builder.add("-code-completion-at="+path+":"+line+":"+column); + builder.add(path); + if(!builder.setTarget(buffer)) + { + return codeCompletions; + } + VPTProject project = ProjectViewer.getActiveProject(view); - HashMap<String, Vector<String>> properties = ClangCompletionConfiguration.getProperties(project.getName()); - Vector<String> includes = properties.get(ClangCompletionConfiguration.INCLUDES); + HashMap<String, Vector<String>> properties = ProjectsOptionPane.getProperties(project.getName()); + Vector<String> includes = properties.get(ProjectsOptionPane.INCLUDES); if(includes != null) { - for(int i = 0; i < includes.size(); i++) - { - args.add("-I" +includes.get(i) ); - } + builder.addIncludes(includes); + }else + { + Util.generatePTHFileForActiveProject(); } - Vector<String> definitions = properties.get(ClangCompletionConfiguration.DEFINITIONS); + Vector<String> definitions = properties.get(ProjectsOptionPane.DEFINITIONS); if(definitions != null) { - for(int i = 0; i < definitions.size(); i++) - { - args.add("-D" +definitions.get(i) ); - } + builder.addDefinitions(definitions); } - tryGeneratePth(project); - File filePth = new File(ClangCompletionPlugin.pluginHome, project.getName()+".pth"); + //tryGeneratePth(project); + File filePth = Util.getPTHFileOfActiveProject(); if(filePth.exists()) { - args.add("-include-pth"); - args.add(filePth.getPath() ); + builder.add("-include-pth"); + builder.add(filePth.getPath() ); } - /* - Vector<String> arguments = properties.get(ClangCompletionConfiguration.ARGUMENTS); - if(arguments != null) - { - for(int i = 0; i < arguments.size(); i++) - { - args.add(arguments.get(i)); - } - } - */ - List<CompletionCandidate> codeCompletions = new ArrayList<CompletionCandidate>(); - - StringBuilder cmd = new StringBuilder(); - for(int i = 0; i < args.size();i++) - { - cmd.append(args.get(i) +" "); - } - System.out.println(cmd); - - try - { - String [] argsArr = new String[args.size()]; - args.toArray(argsArr); - final Process process = Runtime.getRuntime().exec(argsArr); - - new Thread() + System.out.println(builder); + final AtomicBoolean isClangBuilderAlive = new AtomicBoolean(); + builder.setListener(new ClangBuilderListener() { - public void run() + public void errorRecieved(String line){}; + + public void outputRecieved(String line) { - try + ClangCompletionCandidate candidate = ClangCompletionCandidate.parse(line); + if(candidate != null) { - BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream())); - String input = reader.readLine(); - while(input!=null) - { - //System.out.println("stderr: " + input); - //parseError(input); - input = reader.readLine(); - - } - }catch(IOException ex) - { - ex.printStackTrace(); + codeCompletions.add(candidate ); } - } - }.start(); - - BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); - String input = reader.readLine(); - while(input != null) - { - ClangCompletionCandidate candidate = ClangCompletionCandidate.parse(input); + }; - if(candidate != null /* && candidate.getDescription().toLowerCase().startsWith(prefix) */) + public void exited() { - //if(candidate != null && !codeCompletions.contains(candidate) ) - codeCompletions.add(candidate ); - - } - input = reader.readLine(); + isClangBuilderAlive.set(false); + }; + }); + + try + { + isClangBuilderAlive.set(true); + builder.exec(); + while(isClangBuilderAlive.get()) + { + Thread.yield(); } - - - }catch(IOException ex) + }catch(Exception ex) { - System.out.println(ex); ex.printStackTrace(); - }finally - { - //cleanUp(); } + return codeCompletions; } @@ -231,70 +167,4 @@ return completionModes; } - private void tryGeneratePth(VPTProject project) - { - File filePth = new File(ClangCompletionPlugin.pluginHome, project.getName()+".pth"); - if(!filePth.exists()) - { - HashMap<String, Vector<String>> properties = ClangCompletionConfiguration.getProperties(project.getName()); - - - ArrayList<String> args = new ArrayList<String>(); - args.add("clang"); - args.add("-cc1"); - args.add("-w"); - - Vector<String> precompileds = properties.get(ClangCompletionConfiguration.PRECOMPILEDS); - if(precompileds != null) - { - for(int i = 0; i < precompileds.size(); i++) - { - args.add(precompileds.get(i) ); - } - } - args.add("-emit-pth"); - args.add("-o"); - args.add(filePth.getPath()); - - - Vector<String> includes = properties.get(ClangCompletionConfiguration.INCLUDES); - if(includes != null) - { - for(int i = 0; i < includes.size(); i++) - { - args.add("-I" +includes.get(i) ); - } - } - - - - Vector<String> definitions = properties.get(ClangCompletionConfiguration.DEFINITIONS); - if(definitions != null) - { - for(int i = 0; i < definitions.size(); i++) - { - args.add("-D" +definitions.get(i) ); - } - } - - args.add("-x"); - args.add("c++-header"); - - StringBuilder cmd = new StringBuilder(); - for(int i = 0; i < args.size();i++) - { - cmd.append(args.get(i) +" "); - } - System.out.println(cmd); - - try - { - String [] argsArr = new String[args.size()]; - args.toArray(argsArr); - Process process = Runtime.getRuntime().exec(argsArr); - }catch(IOException ex) - { - } - } - } } Deleted: plugins/ClangCompletion/trunk/src/clangcompletion/ClangCompletionRenderer.java =================================================================== --- plugins/ClangCompletion/trunk/src/clangcompletion/ClangCompletionRenderer.java 2012-08-29 00:01:13 UTC (rev 22092) +++ plugins/ClangCompletion/trunk/src/clangcompletion/ClangCompletionRenderer.java 2012-08-29 18:35:51 UTC (rev 22093) @@ -1,23 +0,0 @@ -package clangcompletion; - -import completion.service.CompletionCandidate; -import java.awt.Component; -import javax.swing.*; -import completion.util.*; - - -public class ClangCompletionRenderer extends DefaultListCellRenderer -{ - - public ClangCompletionRenderer() - { - } - - public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) - { - JLabel renderer = (JLabel)super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - ClangCompletionCandidate cc = (ClangCompletionCandidate)value; - renderer.setText(CompletionUtil.prefixByIndex(cc.getDescription(), index)); - return renderer; - } -} Added: plugins/ClangCompletion/trunk/src/clangcompletion/CompletionListCellRenderer.java =================================================================== --- plugins/ClangCompletion/trunk/src/clangcompletion/CompletionListCellRenderer.java (rev 0) +++ plugins/ClangCompletion/trunk/src/clangcompletion/CompletionListCellRenderer.java 2012-08-29 18:35:51 UTC (rev 22093) @@ -0,0 +1,23 @@ +package clangcompletion; + +import completion.service.CompletionCandidate; +import java.awt.Component; +import javax.swing.*; +import completion.util.*; + + +public class CompletionListCellRenderer extends DefaultListCellRenderer +{ + + public CompletionListCellRenderer() + { + } + + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) + { + JLabel renderer = (JLabel)super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + ClangCompletionCandidate cc = (ClangCompletionCandidate)value; + renderer.setText(CompletionUtil.prefixByIndex(cc.getDescription(), index)); + return renderer; + } +} Added: plugins/ClangCompletion/trunk/src/clangcompletion/ProjectsOptionPane.java =================================================================== --- plugins/ClangCompletion/trunk/src/clangcompletion/ProjectsOptionPane.java (rev 0) +++ plugins/ClangCompletion/trunk/src/clangcompletion/ProjectsOptionPane.java 2012-08-29 18:35:51 UTC (rev 22093) @@ -0,0 +1,371 @@ +package clangcompletion; + +import java.awt.GridBagConstraints; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.concurrent.Callable; +import java.util.HashMap; +import java.util.Vector; +import java.io.*; +import javax.swing.DefaultListModel; +import javax.swing.JButton; +import javax.swing.JFileChooser; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; + +import org.gjt.sp.jedit.AbstractOptionPane; +import org.gjt.sp.jedit.GUIUtilities; +import org.gjt.sp.jedit.MiscUtilities; +import org.gjt.sp.jedit.OptionGroup; +import org.gjt.sp.jedit.*; +import org.gjt.sp.jedit.jEdit; +import org.gjt.sp.jedit.gui.RolloverButton; +import org.gjt.sp.jedit.View; +import org.gjt.sp.jedit.browser.VFSBrowser; +import org.gjt.sp.jedit.browser.VFSFileChooserDialog; + +import projectviewer.ProjectManager; +import projectviewer.config.OptionsService; +import projectviewer.vpt.VPTProject; +import projectviewer.ProjectViewer; +public class ProjectsOptionPane extends AbstractOptionPane +{ + public static final String DEFINITIONS = "CLANG_DEFINITIONS"; + + public static final String INCLUDES = "CLANG_INCLUDES"; + + public static final String PRECOMPILEDS = "CLANG_PRECOMPILEDS"; + + private JList definitions, includes, precompileds; + + private DefaultListModel definitionModel, includesModel, precompiledsModel; + + private VPTProject project; + + public ProjectsOptionPane(VPTProject project) + { + super("ClangCompletion-Configuration"); + this.project = project; + } + + @Override + protected void _init() + { + includesModel = getListModel(INCLUDES); + includes = createList("Includes:", includesModel, new Callable<String>() + { + public String call() + { + return showIncludeSelectionDialog(); + } + }); + addSeparator(); + + definitionModel = getListModel(DEFINITIONS); + definitions = createList("Pre-compiled definition:", definitionModel, new Callable<String>() + { + public String call() + { + return ShowInputDefinitionDialog(); + } + }); + addSeparator(); + + precompiledsModel = getListModel(PRECOMPILEDS); + precompileds = createListPrecompileds("Pre-compiled headers:", precompiledsModel, new Callable<String>() + { + public String call() + { + return ShowInputPrecompiledsDialog(); + } + }); + addSeparator(); + } + + private void setListModel(String propertyName, DefaultListModel model) + { + Vector<String> list = new Vector<String>(); + for (int i = 0; i < model.size(); i++) + { + list.add((String) model.getElementAt(i)); + } + setListProperty(propertyName, list); + } + private DefaultListModel getListModel(String propertyName) + { + Vector<String> list = getListProperty(propertyName); + DefaultListModel model = new DefaultListModel(); + for (int i = 0; i < list.size(); i++) + { + model.addElement(list.get(i)); + } + return model; + } + + private Vector<String> getListProperty(String propertyName) + { + return getListProperty(project, propertyName); + } + + private void setListProperty(String propertyName, Vector<String> list) + { + for (int i = 0; i < list.size(); i++) + { + project.setProperty(propertyName + i, list.get(i)); + } + + for (int i = list.size(); true; i++) + { + String prop = propertyName + i; + if (project.getProperty(prop) == null) + { + break; + }else + { + project.removeProperty(prop); + } + } + } + + + + private JList createListPrecompileds(String title, final DefaultListModel model, final Callable<String> callable) + { + addComponent(new JLabel(title)); + final JList list = new JList(model); + addComponent(new JScrollPane(list), GridBagConstraints.HORIZONTAL); + JPanel buttons = new JPanel(); + JButton add = new RolloverButton(GUIUtilities.loadIcon("Plus.png")); + add.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + try + { + String s = callable.call(); + if (s != null) + { + int index = list.getSelectedIndex(); + model.add(index + 1, s); + list.setSelectedIndex(index + 1); + + File pth = Util.getPTHFileOfActiveProject(); + if(pth != null) + { + pth.delete(); + } + } + }catch(Exception ex) + { + ex.printStackTrace(); + } + } + }); + JButton remove = new RolloverButton(GUIUtilities.loadIcon("Minus.png")); + remove.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + int index = list.getSelectedIndex(); + if (index >= 0) + { + model.removeElementAt(index); + if (index < model.size()) + { + list.setSelectedIndex(index); + }else if (! model.isEmpty()) + { + list.setSelectedIndex(model.size() - 1); + } + File pth = Util.getPTHFileOfActiveProject(); + if(pth != null) + { + pth.delete(); + } + } + } + }); + + + JButton refresh = new RolloverButton(GUIUtilities.loadIcon("Reload.png")); + refresh.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + File pth = Util.getPTHFileOfActiveProject(); + if(pth != null) + { + pth.delete(); + } + Util.generatePTHFileForActiveProject(); + try + { + Thread.sleep(1000); + }catch(Exception ex) + { + } + } + }); + + buttons.add(add); + buttons.add(remove); + buttons.add(refresh); + addComponent(buttons); + return list; + } + + private JList createList(String title, final DefaultListModel model, final Callable<String> callable) + { + addComponent(new JLabel(title)); + final JList list = new JList(model); + addComponent(new JScrollPane(list), GridBagConstraints.HORIZONTAL); + JPanel buttons = new JPanel(); + JButton add = new RolloverButton(GUIUtilities.loadIcon("Plus.png")); + add.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + try + { + String s = callable.call(); + if (s != null) + { + int index = list.getSelectedIndex(); + model.add(index + 1, s); + list.setSelectedIndex(index + 1); + } + }catch(Exception ex) + { + ex.printStackTrace(); + } + } + }); + JButton remove = new RolloverButton(GUIUtilities.loadIcon("Minus.png")); + remove.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + int index = list.getSelectedIndex(); + if (index >= 0) + { + model.removeElementAt(index); + if (index < model.size()) + { + list.setSelectedIndex(index); + }else if (! model.isEmpty()) + { + list.setSelectedIndex(model.size() - 1); + } + } + } + }); + + + buttons.add(add); + buttons.add(remove); + addComponent(buttons); + return list; + } + + private String ShowInputPrecompiledsDialog() + { + View view = jEdit.getActiveView(); + String path = jEdit.getProperty("projectviewer.filechooser.directory", + System.getProperty("user.home")); + String [] result = GUIUtilities.showVFSFileDialog(GUIUtilities.getParentDialog(this), + view, path, VFSBrowser.OPEN_DIALOG, false); + if(result != null && result.length > 0) + { + return result[0]; + }else + { + return null; + } + } + + private String ShowInputDefinitionDialog() + { + return (String) JOptionPane.showInputDialog(this, "Input definition:", "Definitions", + JOptionPane.QUESTION_MESSAGE); + } + + private String showIncludeSelectionDialog() + { + View view = jEdit.getActiveView(); + String path = jEdit.getProperty("projectviewer.filechooser.directory", + System.getProperty("user.home")); + String [] result = GUIUtilities.showVFSFileDialog(GUIUtilities.getParentDialog(this), + view, path, VFSBrowser.CHOOSE_DIRECTORY_DIALOG, false); + if(result != null && result.length > 0) + { + return result[0]; + }else + { + return null; + } + } + + @Override + protected void _save() + { + setListModel(DEFINITIONS, definitionModel); + setListModel(INCLUDES, includesModel); + setListModel(PRECOMPILEDS, precompiledsModel); + } + + public static Vector<String> getListProperty(VPTProject project, String propertyName) + { + Vector<String> list = new Vector<String>(); + int i = 0; + while (true) + { + String value = project.getProperty(propertyName + i); + if (value != null) + { + list.add(value); + i++; + }else + { + break; + } + } + return list; + } + + public static HashMap<String, Vector<String>> getProperties(String projectName) + { + HashMap<String, Vector<String>> map = new HashMap<String, Vector<String>>(); + VPTProject project = ProjectManager.getInstance().getProject(projectName); + if (project == null) + { + return map; + } + + Vector<String> definitions = getListProperty(project, DEFINITIONS); + map.put(DEFINITIONS , definitions); + + Vector<String> includes = getListProperty(project, INCLUDES); + map.put(INCLUDES, includes); + + Vector<String> precompileds = getListProperty(project, PRECOMPILEDS); + map.put(PRECOMPILEDS, precompileds); + + return map; + } + + public static class ClangCompletionOptionService implements OptionsService + { + public OptionGroup getOptionGroup(VPTProject proj) + { + return null; + } + + public OptionPane getOptionPane(VPTProject proj) + { + return new ProjectsOptionPane(proj); + } + } +} Added: plugins/ClangCompletion/trunk/src/clangcompletion/Util.java =================================================================== --- plugins/ClangCompletion/trunk/src/clangcompletion/Util.java (rev 0) +++ plugins/ClangCompletion/trunk/src/clangcompletion/Util.java 2012-08-29 18:35:51 UTC (rev 22093) @@ -0,0 +1,80 @@ +package clangcompletion; +import org.gjt.sp.jedit.*; +import java.io.*; +import java.util.*; +import projectviewer.ProjectViewer; +import projectviewer.vpt.VPTProject; +public class Util +{ + public static boolean isHeaderFile(File f) + { + return f.getName().endsWith(".hpp") || f.getName().endsWith(".h"); + } + + public static File getPTHFileOfActiveProject() + { + View view = jEdit.getActiveView(); + VPTProject project = ProjectViewer.getActiveProject(view); + return new File(EditPlugin.getPluginHome(ClangCompletionPlugin.class), project.getName()+".pth"); + } + + public static boolean generatePTHFileForActiveProject() + { + View view = jEdit.getActiveView(); + VPTProject project = ProjectViewer.getActiveProject(view); + File filePth = new File(EditPlugin.getPluginHome(ClangCompletionPlugin.class), project.getName()+".pth"); + + if(filePth.exists()) + { + return false; + } + + HashMap<String, Vector<String>> properties = ProjectsOptionPane.getProperties(project.getName()); + + ClangBuilder builder = new ClangBuilder(); + builder.add("-cc1"); + builder.add("-w"); + + Vector<String> precompileds = properties.get(ProjectsOptionPane.PRECOMPILEDS); + if(precompileds == null || precompileds.size() == 0) + { + return false; + } + + for(int i = 0; i < precompileds.size(); i++) + { + builder.add(precompileds.get(i) ); + } + + builder.add("-emit-pth"); + builder.add("-o"); + builder.add(filePth.getPath()); + + Vector<String> includes = properties.get(ProjectsOptionPane.INCLUDES); + if(includes != null) + { + builder.addIncludes(includes); + } + + Vector<String> definitions = properties.get(ProjectsOptionPane.DEFINITIONS); + if(definitions != null) + { + builder.addDefinitions(definitions); + } + + builder.add("-x"); + builder.add("c++-header"); + + System.out.println("pth: " + builder); + + try + { + builder.exec(); + }catch(IOException ex) + { + ex.printStackTrace(); + return false; + } + return true; + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |