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 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 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 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";
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.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.core.resources.IProject;
import org.eclipse.core.resources.IWorkspace;
@ -30,6 +34,9 @@ public class MakeUIPlugin extends AbstractUIPlugin implements IStartup {
//Resource bundle.
private ResourceBundle resourceBundle;
private IWorkingCopyManager fWorkingCopyManager;
private IMakefileDocumentProvider fMakefileDocumentProvider;
/**
* The constructor.
*/
@ -215,4 +222,28 @@ public class MakeUIPlugin extends AbstractUIPlugin implements IStartup {
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;
import java.util.ArrayList;
import java.util.Arrays;
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.IMacroDefinition;
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.IStatement;
import org.eclipse.cdt.make.core.makefile.IDirective;
import org.eclipse.cdt.make.core.makefile.ITargetRule;
import org.eclipse.cdt.make.internal.core.makefile.NullMakefile;
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.IDocument;
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.widgets.Composite;
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.IContentOutlinePage;
@ -59,6 +64,8 @@ public class MakefileContentOutlinePage extends ContentOutlinePage implements IC
public Object[] getChildren(Object element) {
if (element == fInput) {
return getElements(element);
} else if (element instanceof IParent) {
return getElements(element);
}
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)
*/
public Object getParent(Object element) {
if (element instanceof IStatement)
if (element instanceof IDirective)
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)
*/
public boolean hasChildren(Object element) {
return element == fInput;
if (element == fInput) {
return true;
} else if (element instanceof IParent) {
return true;
}
return false;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
*/
public Object[] getElements(Object inputElement) {
List list = new ArrayList();
if (showMacroDefinition) {
list.addAll(Arrays.asList(makefile.getMacroDefinitions()));
IDirective[] statements;
if (inputElement == fInput) {
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();
}
@ -111,8 +137,19 @@ public class MakefileContentOutlinePage extends ContentOutlinePage implements IC
}
if (newInput != null) {
IDocument document= fDocumentProvider.getDocument(newInput);
makefile = fEditor.getMakefile(document);
IWorkingCopyManager manager= MakeUIPlugin.getDefault().getWorkingCopyManager();
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);
} else if (element instanceof IMacroDefinition) {
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);
}
@ -138,23 +179,30 @@ public class MakefileContentOutlinePage extends ContentOutlinePage implements IC
* @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
*/
public String getText(Object element) {
String name;
if (element instanceof IRule) {
return ((IRule) element).getTarget().toString();
name = ((IRule) element).getTarget().toString().trim();
} 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 Object fInput;
public MakefileContentOutlinePage(IDocumentProvider provider, MakefileEditor editor) {
public MakefileContentOutlinePage(MakefileEditor editor) {
super();
fDocumentProvider = provider;
fEditor = editor;
}
@ -202,8 +250,8 @@ public class MakefileContentOutlinePage extends ContentOutlinePage implements IC
fEditor.resetHighlightRange();
} else if (selection instanceof IStructuredSelection){
Object element = ((IStructuredSelection) selection).getFirstElement();
if (element instanceof IStatement) {
IStatement statement = (IStatement)element;
if (element instanceof IDirective) {
IDirective statement = (IDirective)element;
int startLine = statement.getStartLine() - 1;
int endLine = statement.getEndLine() - 1;
try {
@ -232,7 +280,7 @@ public class MakefileContentOutlinePage extends ContentOutlinePage implements IC
if (control != null && !control.isDisposed()) {
control.setRedraw(false);
viewer.setInput(fInput);
viewer.expandAll();
//viewer.expandAll();
control.setRedraw(true);
}
}

View file

@ -10,19 +10,47 @@
***********************************************************************/
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.core.resources.IFile;
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.IDocumentPartitioner;
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;
/**
*/
public class MakefileDocumentProvider extends FileDocumentProvider {
public class MakefileDocumentProvider extends FileDocumentProvider implements IMakefileDocumentProvider {
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.
*/
@ -53,4 +81,96 @@ public class MakefileDocumentProvider extends FileDocumentProvider {
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;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.util.ResourceBundle;
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.text.MakefileColorManager;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.ui.editors.text.TextEditor;
import org.eclipse.ui.texteditor.DefaultRangeIndicator;
@ -40,31 +34,45 @@ public class MakefileEditor extends TextEditor {
private MakefileContentOutlinePage getOutlinePage() {
if (page == null) {
page = new MakefileContentOutlinePage(getDocumentProvider(), this);
page = new MakefileContentOutlinePage(this);
page.setInput(getEditorInput());
}
return page;
}
public IMakefile getMakefile() {
IDocument document = getDocumentProvider().getDocument(getEditorInput());
return getMakefile(document);
}
public IMakefile getMakefile(IDocument document) {
if (document != null) {
if (makefile == null || isDirty()) {
try {
String content = document.get();
Reader r = new StringReader(content);
makefile = new PosixMakefile(r);
} catch (IOException e) {
makefile = new NullMakefile();
}
}
}
return makefile;
}
// public IMakefile getMakefile() {
// IDocument document = getDocumentProvider().getDocument(getEditorInput());
// if (makefile == null) {
// makefile = new GNUMakefile();
// try {
// String content = document.get();
// Reader r = new StringReader(content);
// makefile.parse(r);
// } catch (IOException e) {
// }
// IEditorInput input = getEditorInput();
// if (makefile instanceof GNUMakefile) {
// GNUMakefile gnu = (GNUMakefile)makefile;
// if (input instanceof IFileEditorInput) {
// IFile file = ((IFileEditorInput)input).getFile();
// String[] dirs = gnu.getIncludeDirectories();
// String[] includes = new String[dirs.length + 1];
// 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() {
super();
@ -80,7 +88,7 @@ public class MakefileEditor extends TextEditor {
setRangeIndicator(new DefaultRangeIndicator());
setEditorContextMenuId("#MakefileEditorContext"); //$NON-NLS-1$
setRulerContextMenuId("#MakefileRulerContext"); //$NON-NLS-1$
setDocumentProvider(new MakefileDocumentProvider());
setDocumentProvider(MakeUIPlugin.getDefault().getMakefileDocumentProvider());
}
/* (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.IMakefile;
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.editor.MakefileEditor;
import org.eclipse.cdt.make.internal.ui.MakeUIPlugin;
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.IDocument;
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.IContextInformationValidator;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IEditorPart;
/**
* MakefileCompletionProcessor
@ -70,10 +72,13 @@ public class MakefileCompletionProcessor implements IContentAssistProcessor {
protected IContextInformationValidator fValidator = new Validator();
protected Image imageMacro = MakeUIImages.getImage(MakeUIImages.IMG_OBJS_MAKEFILE_MACRO);
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;
fManager = MakeUIPlugin.getDefault().getWorkingCopyManager();
}
/* (non-Javadoc)
@ -81,8 +86,12 @@ public class MakefileCompletionProcessor implements IContentAssistProcessor {
*/
public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int documentOffset) {
boolean macro = inMacro(viewer, documentOffset);
IMakefile makefile = fEditor.getMakefile(viewer.getDocument());
IStatement[] statements = null;
IMakefile makefile = fManager.getWorkingCopy(fEditor.getEditorInput());
// IMakefile makefile = fEditor.getMakefile();
// String content = viewer.getDocument().get();
// Reader r = new StringReader(content);
// makefile.parse(r);
IDirective[] statements = null;
if (macro) {
statements = makefile.getMacroDefinitions();
} else {
@ -100,7 +109,7 @@ public class MakefileCompletionProcessor implements IContentAssistProcessor {
if (statements[i] instanceof IMacroDefinition) {
name = ((IMacroDefinition) statements[i]).getName();
image = imageMacro;
infoString = ((IMacroDefinition)statements[i]).getValue();
infoString = ((IMacroDefinition)statements[i]).getValue().toString();
} else if (statements[i] instanceof IRule) {
name = ((IRule) statements[i]).getTarget().toString();
image = imageTarget;
@ -131,15 +140,17 @@ public class MakefileCompletionProcessor implements IContentAssistProcessor {
public IContextInformation[] computeContextInformation(ITextViewer viewer, int documentOffset) {
WordPartDetector wordPart = new WordPartDetector(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();
if (macro) {
IStatement[] statements = makefile.getMacroDefinitions();
IDirective[] statements = makefile.getMacroDefinitions();
for (int i = 0; i < statements.length; i++) {
if (statements[i] instanceof IMacroDefinition) {
String name = ((IMacroDefinition) statements[i]).getName();
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) {
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);
}