1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

new icons and improvement on the MakefileEditor

by using a working copy to maintain the parse makefile
This commit is contained in:
Alain Magloire 2003-09-19 05:04:37 +00:00
parent 0de973e3c5
commit eaab8181d0
13 changed files with 540 additions and 62 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 B

After

Width:  |  Height:  |  Size: 135 B

View file

@ -54,10 +54,19 @@ public class MakeUIImages {
public static final String IMG_OBJS_MAKEFILE_MACRO = NAME_PREFIX + "macro_obj.gif"; //$NON-NLS-1$ public static final String IMG_OBJS_MAKEFILE_MACRO = NAME_PREFIX + "macro_obj.gif"; //$NON-NLS-1$
public static final ImageDescriptor DESC_MAKEFILE_MACRO = createManaged(OBJ, IMG_OBJS_MAKEFILE_MACRO); public static final ImageDescriptor DESC_MAKEFILE_MACRO = createManaged(OBJ, IMG_OBJS_MAKEFILE_MACRO);
public static final String IMG_OBJS_MAKEFILE_TARGET_RULE = NAME_PREFIX + "trule_obj.gif"; //$NON-NLS-1$ public static final String IMG_OBJS_MAKEFILE_TARGET_RULE = NAME_PREFIX + "trule_obj.gif"; //$NON-NLS-1$
public static final ImageDescriptor DESC_MAKEFILE_TARGET_RULE = createManaged(OBJ, IMG_OBJS_MAKEFILE_TARGET_RULE); public static final ImageDescriptor DESC_MAKEFILE_TARGET_RULE = createManaged(OBJ, IMG_OBJS_MAKEFILE_TARGET_RULE);
public static final String IMG_OBJS_MAKEFILE_INFERENCE_RULE = NAME_PREFIX + "irule_obj.gif"; //$NON-NLS-1$ public static final String IMG_OBJS_MAKEFILE_INFERENCE_RULE = NAME_PREFIX + "irule_obj.gif"; //$NON-NLS-1$
public static final ImageDescriptor DESC_MAKEFILE_INFERENCE_RULE = createManaged(OBJ, IMG_OBJS_MAKEFILE_INFERENCE_RULE); public static final ImageDescriptor DESC_MAKEFILE_INFERENCE_RULE = createManaged(OBJ, IMG_OBJS_MAKEFILE_INFERENCE_RULE);
public static final String IMG_OBJS_MAKEFILE_RELATION = NAME_PREFIX + "relation_obj.gif"; //$NON-NLS-1$
public static final ImageDescriptor DESC_MAKEFILE_RELATION = createManaged(OBJ, IMG_OBJS_MAKEFILE_RELATION);
public static final String IMG_OBJS_MAKEFILE_COMMAND = NAME_PREFIX + "command_obj.gif"; //$NON-NLS-1$
public static final ImageDescriptor DESC_MAKEFILE_COMMAND = createManaged(OBJ, IMG_OBJS_MAKEFILE_COMMAND);
public static final String IMG_TOOLS_MAKEFILE_SEGMENT_EDIT= NAME_PREFIX + "segment_edit.gif"; public static final String IMG_TOOLS_MAKEFILE_SEGMENT_EDIT= NAME_PREFIX + "segment_edit.gif";
private static ImageDescriptor createManaged(String prefix, String name) { private static ImageDescriptor createManaged(String prefix, String name) {

View file

@ -4,6 +4,10 @@ import java.lang.reflect.InvocationTargetException;
import java.util.MissingResourceException; import java.util.MissingResourceException;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import org.eclipse.cdt.make.internal.ui.editor.IMakefileDocumentProvider;
import org.eclipse.cdt.make.internal.ui.editor.MakefileDocumentProvider;
import org.eclipse.cdt.make.internal.ui.editor.WorkingCopyManager;
import org.eclipse.cdt.make.ui.IWorkingCopyManager;
import org.eclipse.cdt.make.ui.actions.UpdateMakeProjectAction; import org.eclipse.cdt.make.ui.actions.UpdateMakeProjectAction;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspace;
@ -30,6 +34,9 @@ public class MakeUIPlugin extends AbstractUIPlugin implements IStartup {
//Resource bundle. //Resource bundle.
private ResourceBundle resourceBundle; private ResourceBundle resourceBundle;
private IWorkingCopyManager fWorkingCopyManager;
private IMakefileDocumentProvider fMakefileDocumentProvider;
/** /**
* The constructor. * The constructor.
*/ */
@ -215,4 +222,28 @@ public class MakeUIPlugin extends AbstractUIPlugin implements IStartup {
return windows[0].getShell(); return windows[0].getShell();
} }
} }
public synchronized IMakefileDocumentProvider getMakefileDocumentProvider() {
if (fMakefileDocumentProvider == null) {
fMakefileDocumentProvider= new MakefileDocumentProvider();
}
return fMakefileDocumentProvider;
}
public synchronized IWorkingCopyManager getWorkingCopyManager() {
if (fWorkingCopyManager == null) {
IMakefileDocumentProvider provider= getMakefileDocumentProvider();
fWorkingCopyManager= new WorkingCopyManager(provider);
}
return fWorkingCopyManager;
}
public void shutdown() throws CoreException {
super.shutdown();
if (fWorkingCopyManager != null) {
fWorkingCopyManager.shutdown();
fWorkingCopyManager= null;
}
}
} }

View file

@ -0,0 +1,25 @@
/*
*/
package org.eclipse.cdt.make.internal.ui.editor;
import org.eclipse.cdt.make.core.makefile.IMakefile;
import org.eclipse.ui.texteditor.IDocumentProvider;
/**
*/
public interface IMakefileDocumentProvider extends IDocumentProvider {
/**
* Shuts down this provider.
*/
void shutdown();
/**
* Returns the working copy for the given element.
*
* @param element the element
* @return the working copy for the given element
*/
IMakefile getWorkingCopy(Object element);
}

View file

@ -11,17 +11,22 @@
package org.eclipse.cdt.make.internal.ui.editor; package org.eclipse.cdt.make.internal.ui.editor;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import org.eclipse.cdt.make.core.makefile.ICommand;
import org.eclipse.cdt.make.core.makefile.IComment;
import org.eclipse.cdt.make.core.makefile.IEmptyLine;
import org.eclipse.cdt.make.core.makefile.IInferenceRule; import org.eclipse.cdt.make.core.makefile.IInferenceRule;
import org.eclipse.cdt.make.core.makefile.IMacroDefinition; import org.eclipse.cdt.make.core.makefile.IMacroDefinition;
import org.eclipse.cdt.make.core.makefile.IMakefile; import org.eclipse.cdt.make.core.makefile.IMakefile;
import org.eclipse.cdt.make.core.makefile.IParent;
import org.eclipse.cdt.make.core.makefile.IRule; import org.eclipse.cdt.make.core.makefile.IRule;
import org.eclipse.cdt.make.core.makefile.IStatement; import org.eclipse.cdt.make.core.makefile.IDirective;
import org.eclipse.cdt.make.core.makefile.ITargetRule; import org.eclipse.cdt.make.core.makefile.ITargetRule;
import org.eclipse.cdt.make.internal.core.makefile.NullMakefile; import org.eclipse.cdt.make.internal.core.makefile.NullMakefile;
import org.eclipse.cdt.make.internal.ui.MakeUIImages; import org.eclipse.cdt.make.internal.ui.MakeUIImages;
import org.eclipse.cdt.make.internal.ui.MakeUIPlugin;
import org.eclipse.cdt.make.ui.IWorkingCopyManager;
import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ILabelProvider;
@ -35,7 +40,7 @@ import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.texteditor.IDocumentProvider; import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.views.contentoutline.ContentOutlinePage; import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
import org.eclipse.ui.views.contentoutline.IContentOutlinePage; import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
@ -59,6 +64,8 @@ public class MakefileContentOutlinePage extends ContentOutlinePage implements IC
public Object[] getChildren(Object element) { public Object[] getChildren(Object element) {
if (element == fInput) { if (element == fInput) {
return getElements(element); return getElements(element);
} else if (element instanceof IParent) {
return getElements(element);
} }
return new Object[0]; return new Object[0];
} }
@ -67,7 +74,7 @@ public class MakefileContentOutlinePage extends ContentOutlinePage implements IC
* @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object) * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
*/ */
public Object getParent(Object element) { public Object getParent(Object element) {
if (element instanceof IStatement) if (element instanceof IDirective)
return fInput; return fInput;
return fInput; return fInput;
} }
@ -76,22 +83,41 @@ public class MakefileContentOutlinePage extends ContentOutlinePage implements IC
* @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object) * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
*/ */
public boolean hasChildren(Object element) { public boolean hasChildren(Object element) {
return element == fInput; if (element == fInput) {
return true;
} else if (element instanceof IParent) {
return true;
}
return false;
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
*/ */
public Object[] getElements(Object inputElement) { public Object[] getElements(Object inputElement) {
List list = new ArrayList(); IDirective[] statements;
if (showMacroDefinition) { if (inputElement == fInput) {
list.addAll(Arrays.asList(makefile.getMacroDefinitions())); statements = makefile.getStatements();
} else if (inputElement instanceof IParent) {
statements = ((IParent)inputElement).getStatements();
} else {
statements = new IDirective[0];
}
List list = new ArrayList(statements.length);
for (int i = 0; i < statements.length; i++) {
if (showMacroDefinition && statements[i] instanceof IMacroDefinition) {
list.add(statements[i]);
} else if (showInferenceRule && statements[i] instanceof IInferenceRule) {
list.add(statements[i]);
} else if (showTargetRule && statements[i] instanceof ITargetRule) {
list.add(statements[i]);
} else {
boolean irrelevant = (statements[i] instanceof IComment ||
statements[i] instanceof IEmptyLine);
if (!irrelevant) {
list.add(statements[i]);
} }
if (showInferenceRule) {
list.addAll(Arrays.asList(makefile.getInferenceRules()));
} }
if (showTargetRule) {
list.addAll(Arrays.asList(makefile.getTargetRules()));
} }
return list.toArray(); return list.toArray();
} }
@ -111,8 +137,19 @@ public class MakefileContentOutlinePage extends ContentOutlinePage implements IC
} }
if (newInput != null) { if (newInput != null) {
IDocument document= fDocumentProvider.getDocument(newInput); IWorkingCopyManager manager= MakeUIPlugin.getDefault().getWorkingCopyManager();
makefile = fEditor.getMakefile(document); makefile = manager.getWorkingCopy((IEditorInput)newInput);
if (makefile == null) {
makefile = nullMakefile;
}
// IDocument document= fDocumentProvider.getDocument(newInput);
// makefile = fEditor.getMakefile();
// try {
// String content = document.get();
// Reader r = new StringReader(content);
// makefile.parse(r);
// } catch (IOException e) {
// }
} }
} }
@ -130,6 +167,10 @@ public class MakefileContentOutlinePage extends ContentOutlinePage implements IC
return MakeUIImages.getImage(MakeUIImages.IMG_OBJS_MAKEFILE_INFERENCE_RULE); return MakeUIImages.getImage(MakeUIImages.IMG_OBJS_MAKEFILE_INFERENCE_RULE);
} else if (element instanceof IMacroDefinition) { } else if (element instanceof IMacroDefinition) {
return MakeUIImages.getImage(MakeUIImages.IMG_OBJS_MAKEFILE_MACRO); return MakeUIImages.getImage(MakeUIImages.IMG_OBJS_MAKEFILE_MACRO);
} else if (element instanceof IParent) {
return MakeUIImages.getImage(MakeUIImages.IMG_OBJS_MAKEFILE_RELATION);
} else if (element instanceof ICommand) {
return MakeUIImages.getImage(MakeUIImages.IMG_OBJS_MAKEFILE_COMMAND);
} }
return super.getImage(element); return super.getImage(element);
} }
@ -138,23 +179,30 @@ public class MakefileContentOutlinePage extends ContentOutlinePage implements IC
* @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object) * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
*/ */
public String getText(Object element) { public String getText(Object element) {
String name;
if (element instanceof IRule) { if (element instanceof IRule) {
return ((IRule) element).getTarget().toString(); name = ((IRule) element).getTarget().toString().trim();
} else if (element instanceof IMacroDefinition) { } else if (element instanceof IMacroDefinition) {
return ((IMacroDefinition) element).getName(); name = ((IMacroDefinition) element).getName().trim();
} else {
name = super.getText(element);
} }
return super.getText(element); if (name != null) {
name = name.trim();
if (name.length() > 20) {
name = name.substring(0, 20) + "..."; //$NON-NLS-1$
}
}
return name;
} }
} }
protected IDocumentProvider fDocumentProvider;
protected MakefileEditor fEditor; protected MakefileEditor fEditor;
protected Object fInput; protected Object fInput;
public MakefileContentOutlinePage(IDocumentProvider provider, MakefileEditor editor) { public MakefileContentOutlinePage(MakefileEditor editor) {
super(); super();
fDocumentProvider = provider;
fEditor = editor; fEditor = editor;
} }
@ -202,8 +250,8 @@ public class MakefileContentOutlinePage extends ContentOutlinePage implements IC
fEditor.resetHighlightRange(); fEditor.resetHighlightRange();
} else if (selection instanceof IStructuredSelection){ } else if (selection instanceof IStructuredSelection){
Object element = ((IStructuredSelection) selection).getFirstElement(); Object element = ((IStructuredSelection) selection).getFirstElement();
if (element instanceof IStatement) { if (element instanceof IDirective) {
IStatement statement = (IStatement)element; IDirective statement = (IDirective)element;
int startLine = statement.getStartLine() - 1; int startLine = statement.getStartLine() - 1;
int endLine = statement.getEndLine() - 1; int endLine = statement.getEndLine() - 1;
try { try {
@ -232,7 +280,7 @@ public class MakefileContentOutlinePage extends ContentOutlinePage implements IC
if (control != null && !control.isDisposed()) { if (control != null && !control.isDisposed()) {
control.setRedraw(false); control.setRedraw(false);
viewer.setInput(fInput); viewer.setInput(fInput);
viewer.expandAll(); //viewer.expandAll();
control.setRedraw(true); control.setRedraw(true);
} }
} }

View file

@ -10,19 +10,47 @@
***********************************************************************/ ***********************************************************************/
package org.eclipse.cdt.make.internal.ui.editor; package org.eclipse.cdt.make.internal.ui.editor;
import java.io.IOException;
import java.io.StringReader;
import java.util.Iterator;
import org.eclipse.cdt.make.core.MakeCorePlugin;
import org.eclipse.cdt.make.core.makefile.IMakefile;
import org.eclipse.cdt.make.internal.ui.text.makefile.MakefilePartitionScanner; import org.eclipse.cdt.make.internal.ui.text.makefile.MakefilePartitionScanner;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentPartitioner; import org.eclipse.jface.text.IDocumentPartitioner;
import org.eclipse.jface.text.rules.DefaultPartitioner; import org.eclipse.jface.text.rules.DefaultPartitioner;
import org.eclipse.jface.text.source.IAnnotationModel;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.editors.text.FileDocumentProvider; import org.eclipse.ui.editors.text.FileDocumentProvider;
/** /**
*/ */
public class MakefileDocumentProvider extends FileDocumentProvider { public class MakefileDocumentProvider extends FileDocumentProvider implements IMakefileDocumentProvider {
private static MakefilePartitionScanner scanner = null; private static MakefilePartitionScanner scanner = null;
/**
* Bundle of all required informations to allow working copy management.
*/
protected class MakefileInfo extends FileInfo {
IMakefile fCopy;
public MakefileInfo(IDocument document, IAnnotationModel model, FileSynchronizer fileSynchronizer, IMakefile copy) {
super(document, model, fileSynchronizer);
fCopy = copy;
}
public void setModificationStamp(long timeStamp) {
fModificationStamp = timeStamp;
}
}
/** /**
* Constructor for MakefileDocumentProvider. * Constructor for MakefileDocumentProvider.
*/ */
@ -53,4 +81,96 @@ public class MakefileDocumentProvider extends FileDocumentProvider {
return scanner; return scanner;
} }
/*
* @see AbstractDocumentProvider#createElementInfo(Object)
*/
protected ElementInfo createElementInfo(Object element) throws CoreException {
if (element instanceof IFileEditorInput) {
IFileEditorInput input = (IFileEditorInput) element;
IMakefile makefile = createMakefile(input.getFile());
if (makefile == null) {
return super.createElementInfo(element);
}
try {
refreshFile(input.getFile());
} catch (CoreException x) {
handleCoreException(x, "FileDocumentProvider.createElementInfo");
}
IDocument d = null;
IStatus s = null;
try {
d = createDocument(element);
} catch (CoreException x) {
s = x.getStatus();
d = createEmptyDocument();
}
IAnnotationModel m = createAnnotationModel(element);
FileSynchronizer f = new FileSynchronizer(input);
f.install();
FileInfo info = new MakefileInfo(d, m, f, makefile);
info.fModificationStamp = computeModificationStamp(input.getFile());
info.fStatus = s;
info.fEncoding = getPersistedEncoding(input);
return info;
}
return super.createElementInfo(element);
}
/**
* @param file
* @return
*/
private IMakefile createMakefile(IFile file) {
return MakeCorePlugin.getDefault().createMakefile(file);
}
/*
* @see AbstractDocumentProvider#doSaveDocument(IProgressMonitor, Object, IDocument, boolean)
*/
protected void doSaveDocument(IProgressMonitor monitor, Object element, IDocument document, boolean overwrite) throws CoreException {
// Update the makefile directives tree;
ElementInfo elementInfo= getElementInfo(element);
if (elementInfo instanceof MakefileInfo) {
MakefileInfo info= (MakefileInfo) elementInfo;
String content = document.get();
StringReader reader = new StringReader(content);
try {
info.fCopy.parse(reader);
} catch (IOException e) {
}
}
super.doSaveDocument(monitor, element, document, overwrite);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.make.internal.ui.editor.IMakefileDocumentProvider#shutdown()
*/
public void shutdown() {
Iterator e = getConnectedElements();
while (e.hasNext()) {
disconnect(e.next());
}
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ICompilationUnitDocumentProvider#getWorkingCopy(java.lang.Object)
*/
public IMakefile getWorkingCopy(Object element) {
ElementInfo elementInfo = getElementInfo(element);
if (elementInfo instanceof MakefileInfo) {
MakefileInfo info = (MakefileInfo) elementInfo;
return info.fCopy;
}
return null;
}
} }

View file

@ -10,19 +10,13 @@
***********************************************************************/ ***********************************************************************/
package org.eclipse.cdt.make.internal.ui.editor; package org.eclipse.cdt.make.internal.ui.editor;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import org.eclipse.cdt.make.core.makefile.IMakefile; import org.eclipse.cdt.make.core.makefile.IMakefile;
import org.eclipse.cdt.make.internal.core.makefile.NullMakefile;
import org.eclipse.cdt.make.internal.core.makefile.posix.PosixMakefile;
import org.eclipse.cdt.make.internal.ui.MakeUIPlugin; import org.eclipse.cdt.make.internal.ui.MakeUIPlugin;
import org.eclipse.cdt.make.internal.ui.text.MakefileColorManager; import org.eclipse.cdt.make.internal.ui.text.MakefileColorManager;
import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IAction;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.ui.editors.text.TextEditor; import org.eclipse.ui.editors.text.TextEditor;
import org.eclipse.ui.texteditor.DefaultRangeIndicator; import org.eclipse.ui.texteditor.DefaultRangeIndicator;
@ -40,31 +34,45 @@ public class MakefileEditor extends TextEditor {
private MakefileContentOutlinePage getOutlinePage() { private MakefileContentOutlinePage getOutlinePage() {
if (page == null) { if (page == null) {
page = new MakefileContentOutlinePage(getDocumentProvider(), this); page = new MakefileContentOutlinePage(this);
page.setInput(getEditorInput()); page.setInput(getEditorInput());
} }
return page; return page;
} }
public IMakefile getMakefile() { // public IMakefile getMakefile() {
IDocument document = getDocumentProvider().getDocument(getEditorInput()); // IDocument document = getDocumentProvider().getDocument(getEditorInput());
return getMakefile(document); // if (makefile == null) {
} // makefile = new GNUMakefile();
// try {
public IMakefile getMakefile(IDocument document) { // String content = document.get();
if (document != null) { // Reader r = new StringReader(content);
if (makefile == null || isDirty()) { // makefile.parse(r);
try { // } catch (IOException e) {
String content = document.get(); // }
Reader r = new StringReader(content); // IEditorInput input = getEditorInput();
makefile = new PosixMakefile(r); // if (makefile instanceof GNUMakefile) {
} catch (IOException e) { // GNUMakefile gnu = (GNUMakefile)makefile;
makefile = new NullMakefile(); // if (input instanceof IFileEditorInput) {
} // IFile file = ((IFileEditorInput)input).getFile();
} // String[] dirs = gnu.getIncludeDirectories();
} // String[] includes = new String[dirs.length + 1];
return makefile; // System.arraycopy(dirs, 0, includes, 0, dirs.length);
} // String cwd = file.getLocation().removeLastSegments(1).toOSString();
// includes[dirs.length] = cwd;
// gnu.setIncludeDirectories(includes);
// }
// }
// } else if (isDirty()) {
// try {
// String content = document.get();
// Reader r = new StringReader(content);
// makefile.parse(r);
// } catch (IOException e) {
// }
// }
// return makefile;
// }
public MakefileEditor() { public MakefileEditor() {
super(); super();
@ -80,7 +88,7 @@ public class MakefileEditor extends TextEditor {
setRangeIndicator(new DefaultRangeIndicator()); setRangeIndicator(new DefaultRangeIndicator());
setEditorContextMenuId("#MakefileEditorContext"); //$NON-NLS-1$ setEditorContextMenuId("#MakefileEditorContext"); //$NON-NLS-1$
setRulerContextMenuId("#MakefileRulerContext"); //$NON-NLS-1$ setRulerContextMenuId("#MakefileRulerContext"); //$NON-NLS-1$
setDocumentProvider(new MakefileDocumentProvider()); setDocumentProvider(MakeUIPlugin.getDefault().getMakefileDocumentProvider());
} }
/* (non-Javadoc) /* (non-Javadoc)

View file

@ -0,0 +1,106 @@
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.make.internal.ui.editor;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.cdt.make.core.makefile.IMakefile;
import org.eclipse.cdt.make.ui.IWorkingCopyManager;
import org.eclipse.cdt.make.ui.IWorkingCopyManagerExtension;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.text.Assert;
import org.eclipse.ui.IEditorInput;
/**
* This working copy manager works together with a given compilation unit document provider and
* additionally offers to "overwrite" the working copy provided by this document provider.
*/
public class WorkingCopyManager implements IWorkingCopyManager, IWorkingCopyManagerExtension {
private IMakefileDocumentProvider fDocumentProvider;
private Map fMap;
private boolean fIsShuttingDown;
/**
* Creates a new working copy manager that co-operates with the given
* compilation unit document provider.
*
* @param provider the provider
*/
public WorkingCopyManager(IMakefileDocumentProvider provider) {
Assert.isNotNull(provider);
fDocumentProvider= provider;
}
/*
* @see org.eclipse.jdt.ui.IWorkingCopyManager#connect(org.eclipse.ui.IEditorInput)
*/
public void connect(IEditorInput input) throws CoreException {
fDocumentProvider.connect(input);
}
/*
* @see org.eclipse.jdt.ui.IWorkingCopyManager#disconnect(org.eclipse.ui.IEditorInput)
*/
public void disconnect(IEditorInput input) {
fDocumentProvider.disconnect(input);
}
/*
* @see org.eclipse.jdt.ui.IWorkingCopyManager#shutdown()
*/
public void shutdown() {
if (!fIsShuttingDown) {
fIsShuttingDown= true;
try {
if (fMap != null) {
fMap.clear();
fMap= null;
}
fDocumentProvider.shutdown();
} finally {
fIsShuttingDown= false;
}
}
}
/*
* @see org.eclipse.jdt.ui.IWorkingCopyManager#getWorkingCopy(org.eclipse.ui.IEditorInput)
*/
public IMakefile getWorkingCopy(IEditorInput input) {
IMakefile unit= fMap == null ? null : (IMakefile) fMap.get(input);
return unit != null ? unit : fDocumentProvider.getWorkingCopy(input);
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.IWorkingCopyManagerExtension#setWorkingCopy(org.eclipse.ui.IEditorInput, org.eclipse.jdt.core.ICompilationUnit)
*/
public void setWorkingCopy(IEditorInput input, IMakefile workingCopy) {
if (fDocumentProvider.getDocument(input) != null) {
if (fMap == null)
fMap= new HashMap();
fMap.put(input, workingCopy);
}
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.IWorkingCopyManagerExtension#removeWorkingCopy(org.eclipse.ui.IEditorInput)
*/
public void removeWorkingCopy(IEditorInput input) {
fMap.remove(input);
if (fMap.isEmpty())
fMap= null;
}
}

View file

@ -15,10 +15,11 @@ import java.util.ArrayList;
import org.eclipse.cdt.make.core.makefile.IMacroDefinition; import org.eclipse.cdt.make.core.makefile.IMacroDefinition;
import org.eclipse.cdt.make.core.makefile.IMakefile; import org.eclipse.cdt.make.core.makefile.IMakefile;
import org.eclipse.cdt.make.core.makefile.IRule; import org.eclipse.cdt.make.core.makefile.IRule;
import org.eclipse.cdt.make.core.makefile.IStatement; import org.eclipse.cdt.make.core.makefile.IDirective;
import org.eclipse.cdt.make.internal.ui.MakeUIImages; import org.eclipse.cdt.make.internal.ui.MakeUIImages;
import org.eclipse.cdt.make.internal.ui.editor.MakefileEditor; import org.eclipse.cdt.make.internal.ui.MakeUIPlugin;
import org.eclipse.cdt.make.internal.ui.text.WordPartDetector; import org.eclipse.cdt.make.internal.ui.text.WordPartDetector;
import org.eclipse.cdt.make.ui.IWorkingCopyManager;
import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.ITextViewer;
@ -31,6 +32,7 @@ import org.eclipse.jface.text.contentassist.IContextInformation;
import org.eclipse.jface.text.contentassist.IContextInformationPresenter; import org.eclipse.jface.text.contentassist.IContextInformationPresenter;
import org.eclipse.jface.text.contentassist.IContextInformationValidator; import org.eclipse.jface.text.contentassist.IContextInformationValidator;
import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IEditorPart;
/** /**
* MakefileCompletionProcessor * MakefileCompletionProcessor
@ -70,10 +72,13 @@ public class MakefileCompletionProcessor implements IContentAssistProcessor {
protected IContextInformationValidator fValidator = new Validator(); protected IContextInformationValidator fValidator = new Validator();
protected Image imageMacro = MakeUIImages.getImage(MakeUIImages.IMG_OBJS_MAKEFILE_MACRO); protected Image imageMacro = MakeUIImages.getImage(MakeUIImages.IMG_OBJS_MAKEFILE_MACRO);
protected Image imageTarget = MakeUIImages.getImage(MakeUIImages.IMG_OBJS_MAKEFILE_TARGET_RULE); protected Image imageTarget = MakeUIImages.getImage(MakeUIImages.IMG_OBJS_MAKEFILE_TARGET_RULE);
protected MakefileEditor fEditor;
public MakefileCompletionProcessor(MakefileEditor editor) { protected IEditorPart fEditor;
protected IWorkingCopyManager fManager;
public MakefileCompletionProcessor(IEditorPart editor) {
fEditor = editor; fEditor = editor;
fManager = MakeUIPlugin.getDefault().getWorkingCopyManager();
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -81,8 +86,12 @@ public class MakefileCompletionProcessor implements IContentAssistProcessor {
*/ */
public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int documentOffset) { public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int documentOffset) {
boolean macro = inMacro(viewer, documentOffset); boolean macro = inMacro(viewer, documentOffset);
IMakefile makefile = fEditor.getMakefile(viewer.getDocument()); IMakefile makefile = fManager.getWorkingCopy(fEditor.getEditorInput());
IStatement[] statements = null; // IMakefile makefile = fEditor.getMakefile();
// String content = viewer.getDocument().get();
// Reader r = new StringReader(content);
// makefile.parse(r);
IDirective[] statements = null;
if (macro) { if (macro) {
statements = makefile.getMacroDefinitions(); statements = makefile.getMacroDefinitions();
} else { } else {
@ -100,7 +109,7 @@ public class MakefileCompletionProcessor implements IContentAssistProcessor {
if (statements[i] instanceof IMacroDefinition) { if (statements[i] instanceof IMacroDefinition) {
name = ((IMacroDefinition) statements[i]).getName(); name = ((IMacroDefinition) statements[i]).getName();
image = imageMacro; image = imageMacro;
infoString = ((IMacroDefinition)statements[i]).getValue(); infoString = ((IMacroDefinition)statements[i]).getValue().toString();
} else if (statements[i] instanceof IRule) { } else if (statements[i] instanceof IRule) {
name = ((IRule) statements[i]).getTarget().toString(); name = ((IRule) statements[i]).getTarget().toString();
image = imageTarget; image = imageTarget;
@ -131,15 +140,17 @@ public class MakefileCompletionProcessor implements IContentAssistProcessor {
public IContextInformation[] computeContextInformation(ITextViewer viewer, int documentOffset) { public IContextInformation[] computeContextInformation(ITextViewer viewer, int documentOffset) {
WordPartDetector wordPart = new WordPartDetector(viewer, documentOffset); WordPartDetector wordPart = new WordPartDetector(viewer, documentOffset);
boolean macro = inMacro(viewer, documentOffset); boolean macro = inMacro(viewer, documentOffset);
IMakefile makefile = fEditor.getMakefile(viewer.getDocument()); IMakefile makefile = fManager.getWorkingCopy(fEditor.getEditorInput());
//IMakefile makefile = fEditor.getMakefile(viewer.getDocument());
//IMakefile makefile = fEditor.getMakefile();
ArrayList contextList = new ArrayList(); ArrayList contextList = new ArrayList();
if (macro) { if (macro) {
IStatement[] statements = makefile.getMacroDefinitions(); IDirective[] statements = makefile.getMacroDefinitions();
for (int i = 0; i < statements.length; i++) { for (int i = 0; i < statements.length; i++) {
if (statements[i] instanceof IMacroDefinition) { if (statements[i] instanceof IMacroDefinition) {
String name = ((IMacroDefinition) statements[i]).getName(); String name = ((IMacroDefinition) statements[i]).getName();
if (name != null && name.equals(wordPart.getString())) { if (name != null && name.equals(wordPart.getString())) {
String value = ((IMacroDefinition) statements[i]).getValue(); String value = ((IMacroDefinition) statements[i]).getValue().toString();
if (value != null && value.length() > 0) { if (value != null && value.length() > 0) {
contextList.add(value); contextList.add(value);
} }

View file

@ -0,0 +1,77 @@
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.make.ui;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.ui.IEditorInput;
import org.eclipse.cdt.make.core.makefile.IMakefile;
/**
* Interface for accessing working copies of <code>IMakefile</code>
* objects. The original unit is only given indirectly by means
* of an <code>IEditorInput</code>. The life cycle is as follows:
* <ul>
* <li> <code>connect</code> creates and remembers a working copy of the
* unit which is encoded in the given editor input</li>
* <li> <code>getWorkingCopy</code> returns the working copy remembered on
* <code>connect</code></li>
* <li> <code>disconnect</code> destroys the working copy remembered on
* <code>connect</code></li>
* </ul>
* <p>
* This interface is not intended to be implemented by clients.
* </p>
*
*
*/
public interface IWorkingCopyManager {
/**
* Connects the given editor input to this manager. After calling
* this method, a working copy will be available for the compilation unit encoded
* in the given editor input (does nothing if there is no encoded compilation unit).
*
* @param input the editor input
* @exception CoreException if the working copy cannot be created for the
* unit
*/
void connect(IEditorInput input) throws CoreException;
/**
* Disconnects the given editor input from this manager. After calling
* this method, a working copy for the compilation unit encoded
* in the given editor input will no longer be available. Does nothing if there
* is no encoded compilation unit, or if there is no remembered working copy for
* the compilation unit.
*
* @param input the editor input
*/
void disconnect(IEditorInput input);
/**
* Returns the working copy remembered for the compilation unit encoded in the
* given editor input.
*
* @param input the editor input
* @return the working copy of the compilation unit, or <code>null</code> if the
* input does not encode an editor input, or if there is no remembered working
* copy for this compilation unit
*/
IMakefile getWorkingCopy(IEditorInput input);
/**
* Shuts down this working copy manager. All working copies still remembered
* by this manager are destroyed.
*/
void shutdown();
}

View file

@ -0,0 +1,43 @@
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.make.ui;
import org.eclipse.ui.IEditorInput;
import org.eclipse.cdt.make.core.makefile.IMakefile;
/**
* Extension interface for <code>IWorkingCopyManager</code>.
* @since 2.1
*/
public interface IWorkingCopyManagerExtension {
/**
* Sets the given working copy for the given editor input. If the given editor input
* is not connected to this working copy manager, this call has no effect. <p>
* This working copy manager does not assume the ownership of this working copy, i.e.,
* the given working copy is not automatically be freed when this manager is shut down.
*
* @param input the editor input
* @param workingCopy the working copy
*/
void setWorkingCopy(IEditorInput input, IMakefile workingCopy);
/**
* Removes the working copy set for the given editor input. If there is no
* working copy set for this input or this input is not connected to this
* working copy manager, this call has no effect.
*
* @param input the editor input
*/
void removeWorkingCopy(IEditorInput input);
}