[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Newsgroup Home]
[news.eclipse.platform] Why two editor?

I developed a little plugin for eclipse, for editing of a language of programming...After the compiler, I need to signal the error by annotation...
I try to do this, with :


public class BglEditor extends TextEditor implements ISelectionChangedListener { // , IPropertyChangeListener private ColorManager colorManager;
/*private EMonoCSharpFolder fFolder;*/
private ISourceViewer sourceViewer;
private IDocument document;
//private IdleTimer idleTimer;
private ProjectionSupport projectionSupport;
private BglConfiguration configuration;
/*protected EMonoOutlinePage page;*/
protected BglEditorExamineJob examinJob;
private BglBracketInserter bracketInserter;
protected BglBracketMatcher bracketMatcher = new BglBracketMatcher();
/*private TaskTracker taskTracker;*/
private ArrayList menuActionName;
private ArrayList menuActionSection;
private IWorkbenchWindow window;
private boolean compileWhenSave = false;
private String pathOfOutput = "";

/**
* MODIFICHE 30 GIUGNO 2008
*/
// error identifiers, images and colors
public static String ERROR_TYPE = "error.type";
public static Image ERROR_IMAGE = new Image(Display.getDefault(), "C:\\Documents and Settings\\Utente\\Desktop\\Tesi\\workspace\\bglEditor\\icons\\sample.gif");;
public static final RGB ERROR_RGB = new RGB(255, 0, 0);
private AnnotationModel fAnnotationModel = new AnnotationModel();



/**
* The property change listener gets notified if the preferences for this plug-in change
*/
private final IPropertyChangeListener prefChangeListener = new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty().equals(DefaultPrefsSetter.QUOTESCOMPLETION) ||
event.getProperty().equals(DefaultPrefsSetter.BRACESCOMPLETIONATENTER) ||
event.getProperty().equals(DefaultPrefsSetter.BRACESCOMPLETION) ||
event.getProperty().equals(DefaultPrefsSetter.BRACKETCOMPLETION) ||
event.getProperty().equals(DefaultPrefsSetter.COMPILEWHENSAVE)) {
//|| event.getProperty().equals(DefaultPrefsSetter.PATHOUTPUT)) {

// update completions of bracket inserter
bracketInserter.setCloseBracketsEnabled(getPreferenceStore().getBoolean(
DefaultPrefsSetter.BRACKETCOMPLETION));
bracketInserter.setCloseBracesEnabled(
getPreferenceStore().getBoolean(DefaultPrefsSetter.BRACESCOMPLETION) && !
getPreferenceStore().getBoolean(DefaultPrefsSetter.BRACESCOMPLETIONATENTER));
bracketInserter.setCloseStringsEnabled(getPreferenceStore().getBoolean(
DefaultPrefsSetter.QUOTESCOMPLETION));

compileWhenSave = BglPlugin.getDefault().getPreferenceStore().getBoolean(DefaultPrefsSetter.COMPILEWHENSAVE);
//pathOfOutput = BglPlugin.getDefault().getPreferenceStore().getString(DefaultPrefsSetter.PATHOUTPUT);

// get the BglAutoIndentStrategy via our source viewer configuration and
// call its setBracesCompletion() method
((BglAutoIndentStrategy)configuration.getAutoEditStrategies(
sourceViewer,IDocument.DEFAULT_CONTENT_TYPE)[0]).setBracesCompletion(
BglPlugin.getDefault().getPreferenceStore().getBoolean(DefaultPrefsSetter.BRACESCOMPLETIONATENTER) && BglPlugin.getDefault().getPreferenceStore().getBoolean(DefaultPrefsSetter.BRACESCOMPLETION)
);
}
}
};
private Composite compositeParent;



/**
* Constructor
*/
public BglEditor() {
super();
examinJob = new BglEditorExamineJob(this,"ExamineEditor");
colorManager = new ColorManager();
configuration = new BglConfiguration(colorManager,this);
setSourceViewerConfiguration(configuration);
setDocumentProvider(new BglDocumentProvider());
IPreferenceStore generalTextStore = EditorsUI.getPreferenceStore();
ChainedPreferenceStore preferenceStore = new ChainedPreferenceStore(new IPreferenceStore[] {BglPlugin.getDefault().getPreferenceStore(), generalTextStore});
setPreferenceStore(preferenceStore);
compileWhenSave = BglPlugin.getDefault().getPreferenceStore().getBoolean(DefaultPrefsSetter.COMPILEWHENSAVE);
//pathOfOutput = BglPlugin.getDefault().getPreferenceStore().getString(DefaultPrefsSetter.PATHOUTPUT);
}


/**
* Is called on changes in the preferences. Triggers update of editor colors
* on changes in syntax coloring.
* @param event The event containing the preference changes
*/
protected boolean affectsTextPresentation(PropertyChangeEvent event)
{
if (event.getProperty().equals(DefaultPrefsSetter.STRINGCOLOR) ||
event.getProperty().equals(DefaultPrefsSetter.STRINGBOLD) ||
event.getProperty().equals(DefaultPrefsSetter.COMMENTBOLD) ||
event.getProperty().equals(DefaultPrefsSetter.COMMENTCOLOR) ||
event.getProperty().equals(DefaultPrefsSetter.CALCBOLD) ||
event.getProperty().equals(DefaultPrefsSetter.CALCCOLOR) ||
event.getProperty().equals(DefaultPrefsSetter.KEYWORDBOLD) ||
event.getProperty().equals(DefaultPrefsSetter.KEYWORDCOLOR)) {


			// this will update the tokens of the scanners - must be done before
			configuration.updateScannerColors();
			// this will kick the scanner
			return true;
		}
		return false;
	}


/**
* @see org.eclipse.ui.editors.text.TextEditor#dispose()
*/
public void dispose() {
if (colorManager != null) colorManager.dispose();

if (examinJob != null) examinJob.cancel();

//actions
/*String[] actionIds = DefaultBglSourceDelegate.getEditorActions();
for (int i = 0; i < actionIds.length; i++) {
IAction action = getAction(actionIds[i]);
if (action instanceof DefaultBglSourceAction)
((DefaultBglSourceAction) action).dispose();
}*/
if (sourceViewer instanceof ITextViewerExtension)
((ITextViewerExtension) sourceViewer).removeVerifyKeyListener(bracketInserter);
// remove property listener of preference store
getPreferenceStore().removePropertyChangeListener(prefChangeListener);
super.dispose();
}




/**
* @see org.eclipse.ui.texteditor.AbstractTextEditor#rulerContextMenuAboutToShow(IMenuManager)
*/
public void rulerContextMenuAboutToShow(IMenuManager menu) {
super.rulerContextMenuAboutToShow(menu);
// We dont use it quite now, but may be we add some ations to the ruler menu some time

// ViewerActionBuilder builder = new ViewerActionBuilder();
// builder.readViewerContributions("#CSharpRulerContext",
// getSelectionProvider(), this);
// builder.contribute(menu, null, true);
}



/**
* Returns the ExamineJob that is responsible for various jobs (scanning, parsing, ...)
* @return The CSharpEditorExamineJob instance of this editor
*/
public BglEditorExamineJob getExamineJob(){
return examinJob;
}



/**
* @see org.eclipse.ui.texteditor.AbstractTextEditor#createActions()
*/
protected void createActions() {
super.createActions();
IDocumentProvider provider = getDocumentProvider();
document = provider.getDocument(getEditorInput());
sourceViewer = getSourceViewer();
sourceViewer.setDocument(document);



// create BracketInserter; do it here because we need the sourceViewer
bracketInserter = new BglBracketInserter(this, sourceViewer);
bracketInserter.setCloseBracketsEnabled(getPreferenceStore().getBoolean(DefaultPrefsSetter.BRACKETCOMPLETION));
bracketInserter.setCloseBracesEnabled(getPreferenceStore().getBoolean(DefaultPrefsSetter.BRACESCOMPLETION) && !getPreferenceStore().getBoolean(DefaultPrefsSetter.BRACESCOMPLETIONATENTER) );
bracketInserter.setCloseStringsEnabled(getPreferenceStore().getBoolean(DefaultPrefsSetter.QUOTESCOMPLETION));


	
	}

/**
* @see org.eclipse.ui.texteditor.AbstractTextEditor#editorContextMenuAboutToShow(IMenuManager)
*/
public void editorContextMenuAboutToShow(IMenuManager menu) {
super.editorContextMenuAboutToShow(menu);
Separator s = new Separator();
menu.appendToGroup("additions", s);
if (menuActionName != null && menuActionSection != null) {
for (int i = 0; i < menuActionName.size(); i++) {
addAction(menu, (String) menuActionSection.get(i),
(String) menuActionName.get(i));
}
}
}


	/**
	 * @see org.eclipse.ui.editors.text.TextEditor#getAdapter(Class)
	 */
	public Object getAdapter(Class adapter) {

if (ProjectionAnnotationModel.class.equals(adapter)) {
if (projectionSupport != null) {
// forward request
Object result = projectionSupport.getAdapter(getSourceViewer(), adapter);
if (result != null) {
return result;
}
}
}


		// Adapter for the Outline view
		/*if (adapter.equals(IContentOutlinePage.class)) {
			if (page == null)
				page = new EMonoOutlinePage(this, getSourceViewer());
			//this.registerIdleListener(page);
			//page.addSelectionChangedListener(this);
			return page;
		}*/
		return super.getAdapter(adapter);
	}


/**
* @see org.eclipse.ui.texteditor.AbstractTextEditor#createPartControl(Composite)
*/
public void createPartControl(Composite parent) {
super.createPartControl(parent);

/* Tolto il 2 luglio 2008
ProjectionViewer viewer = (ProjectionViewer) getSourceViewer();
projectionSupport = new ProjectionSupport(viewer,
getAnnotationAccess(), getSharedColors());
projectionSupport
.addSummarizableAnnotationType("org.eclipse.ui.workbench.texteditor.error");
projectionSupport
.addSummarizableAnnotationType("org.eclipse.ui.workbench.texteditor.warning");
projectionSupport.install();
viewer.doOperation(ProjectionViewer.TOGGLE);
* fin qui
*/

// Verify key listener for Bracket Inserter
if (sourceViewer instanceof ITextViewerExtension) {
((ITextViewerExtension) sourceViewer).prependVerifyKeyListener(bracketInserter);
}

// listen for property changes
getPreferenceStore().addPropertyChangeListener(prefChangeListener);

setProva();
}



/**
* @see org.eclipse.ui.texteditor.AbstractTextEditor#createSourceViewer(Composite, IVerticalRuler, int)
*/
protected final ISourceViewer createSourceViewer(Composite parent, IVerticalRuler ruler, int styles) {
fOverviewRuler = createOverviewRuler(getSharedColors());
ISourceViewer sourceViewer = new BglSourceViewer(parent, ruler, fOverviewRuler, isOverviewRulerVisible(), styles);
getSourceViewerDecorationSupport(sourceViewer);
compositeParent = parent;
return sourceViewer;
}


protected void configureSourceViewerDecorationSupport(SourceViewerDecorationSupport support) {
support.setCharacterPairMatcher(bracketMatcher);
support.setMatchingCharacterPainterPreferenceKeys(DefaultPrefsSetter.BRACKETMATCHING, DefaultPrefsSetter.BRACKETMATCHINGCOLOR);
super.configureSourceViewerDecorationSupport(support);
}

protected void editorSaved(){
super.editorSaved();
IResource resource = (IResource) getEditorInput().getAdapter(IResource.class);
/*if (resource != null) {
taskTracker.checkForTasks(document, resource);
}*/

/*****************************
******* Modifiche ***********
*****************************
*/
if (compileWhenSave) {
MessageConsole console = findConsole("BusinessGame compiler");
MessageConsoleStream out = console.newMessageStream();

String s = eseguiExe();
if (s.equals("Editor nullo")) {
MessageDialog.openInformation(
window.getShell(),
"BGL Plug-in",
"Nessun modello correntemente aperto!!!");
}
else if (s.equals("Estensione non corretta")) {
MessageDialog.openInformation(
window.getShell(),
"BGL Plug-in",
"Il file che si desidera compilare non e' un \"BGL model\"!!!");
}
else {
out.println(s);
}
}
prova2();
}


/**
* Returns the source viewer
* @return the source viewer
*/
public ISourceViewer getViewer(){
return sourceViewer;
}



public void selectionChanged(SelectionChangedEvent event) {
// Nothing to do there in the moment

}

private MessageConsole findConsole(String name) {
ConsolePlugin plugin = ConsolePlugin.getDefault();
IConsoleManager conMan = plugin.getConsoleManager();
MessageConsole console = new MessageConsole(name, null);
console.activate();
conMan.addConsoles(new IConsole[]{console});
return console;
}

public String eseguiExe()
{
String s = "";
IWorkbench wb = PlatformUI.getWorkbench();
IWorkbenchWindow win = wb.getActiveWorkbenchWindow();
IWorkbenchPage page = win.getActivePage();
IEditorPart editor = page.getActiveEditor();
if (editor == null) {
return "Editor nullo";
}
else {
IFile original = ((FileEditorInput)editor.getEditorInput()).getFile();
if (!(original.getFileExtension().equals("bgl"))) return "Estensione non corretta";
s += original.getLocation().toString();
try
{
BGCompileOutput out = BGCompiler.compile(s);
s = out.getOutput();
if (out.success()) {
// Crea il modello
BGModel modello = out.getBGModel();
// String nomeProgetto = original.getProject().getName();
if (pathOfOutput.equals("")) {
IProject progetto = original.getProject();
String percorsoProgetto = progetto.getLocation().toString();
int pos = original.getName().lastIndexOf(".");
String nome = original.getName().substring(0, pos);
File fileOutput = new File(percorsoProgetto+"/bgm_output");
fileOutput.mkdir();
String fileName = percorsoProgetto + "/bgm_output/"+nome+".bgm";
FileOutputStream f = new FileOutputStream(fileName);
ObjectOutputStream oos = new ObjectOutputStream(f);
oos.writeObject(modello);
oos.flush();
oos.close();
}
else {
int pos = original.getName().lastIndexOf(".");
String nome = original.getName().substring(0, pos);
String fileName = pathOfOutput + "\\"+nome+".bgm";
FileOutputStream f = new FileOutputStream(fileName);
ObjectOutputStream oos = new ObjectOutputStream(f);
oos.writeObject(modello);
oos.flush();
oos.close();
}
}
}
catch(Throwable e)
{
e.printStackTrace();
s = "Eccezione nella compilazione";
}
return s;
}
}

/**
* MODIFICHE 30 GIUGNO 2008
*/
class AnnotationConfiguration implements IInformationControlCreator {
public IInformationControl createInformationControl(Shell shell) {
return new DefaultInformationControl(shell);
}
}


   class ColorCache implements ISharedTextColors {
       public Color getColor(RGB rgb) {
           return new Color(Display.getDefault(), rgb);
       }

       public void dispose() {
       }
   }

// santa's little helper
class AnnotationMarkerAccess implements IAnnotationAccess, IAnnotationAccessExtension {
public Object getType(Annotation annotation) {
return annotation.getType();
}


       public boolean isMultiLine(Annotation annotation) {
           return true;
       }

       public boolean isTemporary(Annotation annotation) {
           return !annotation.isPersistent();
       }

       public String getTypeLabel(Annotation annotation) {
           if (annotation instanceof ErrorAnnotation)
               return "Errors";

           return null;
       }

       public int getLayer(Annotation annotation) {
           if (annotation instanceof ErrorAnnotation)
               return ((ErrorAnnotation)annotation).getLayer();

           return 0;
       }

public void paint(Annotation annotation, GC gc, Canvas canvas, Rectangle bounds) {
ImageUtilities.drawImage(((ErrorAnnotation)annotation).getImage(), gc, canvas, bounds, SWT.CENTER, SWT.TOP);
}


       public boolean isPaintable(Annotation annotation) {
           if (annotation instanceof ErrorAnnotation)
               return ((ErrorAnnotation)annotation).getImage() != null;

           return false;
       }

public boolean isSubtype(Object annotationType, Object potentialSupertype) {
if (annotationType.equals(potentialSupertype))
return true;


           return false;

       }

       public Object[] getSupertypes(Object annotationType) {
           return new Object[0];
       }
   }

   // source viewer configuration
   class CodeViewerConfiguration extends SourceViewerConfiguration {
       private ColorCache manager;

       public CodeViewerConfiguration(ColorCache manager) {
           this.manager = manager;
       }

public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) {
PresentationReconciler reconciler = new PresentationReconciler();
return reconciler;
}


public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) {
return new AnnotationHover();
}
}


// annotation hover manager
class AnnotationHover implements IAnnotationHover, ITextHover {
public String getHoverInfo(ISourceViewer sourceViewer, int lineNumber) {
Iterator ite = fAnnotationModel.getAnnotationIterator();


           ArrayList<String> all = new ArrayList<String>();

           while (ite.hasNext()) {
               Annotation a = (Annotation) ite.next();
               if (a instanceof ErrorAnnotation) {
                   all.add(((ErrorAnnotation)a).getText());
               }
           }

StringBuffer total = new StringBuffer();
for (int x = 0; x < all.size(); x++) {
String str = (String) all.get(x);
total.append(" " + str + (x == (all.size()-1) ? "" : "\n"));
}


           return total.toString();
       }

public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) {
return null;
}


       public IRegion getHoverRegion(ITextViewer textViewer, int offset) {
           return null;
       }
   }

   // one error annotation
   class ErrorAnnotation extends Annotation {
       private IMarker marker;
       private String text;
       private int line;
       private Position position;

       public ErrorAnnotation(IMarker marker) {
           this.marker = marker;
       }

       public ErrorAnnotation(int line, String text) {
           super(ERROR_TYPE, true, null);
           this.marker = null;
           this.line = line;
           this.text = text;
       }

       public IMarker getMarker() {
           return marker;
       }

       public int getLine() {
           return line;
       }

       public String getText() {
           return text;
       }

       public Image getImage() {
           return ERROR_IMAGE;
       }

       public int getLayer() {
           return 3;
       }

       public String getType() {
           return ERROR_TYPE;
       }

       public Position getPosition() {
           return position;
       }

public void setPosition(Position position) {
this.position = position;
}
}
private void setProva() {
if (document == null) {
System.out.println("document nullo");
}
if (compositeParent == null) {
System.out.println("parent nullo");
return;
}

int styles = SWT.V_SCROLL | SWT.H_SCROLL | SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION;
fAnnotationAccess = new AnnotationMarkerAccess();
ColorCache cc = new ColorCache();
CompositeRuler fCompositeRuler = new CompositeRuler();
fOverviewRuler = new OverviewRuler(fAnnotationAccess, 12, getSharedColors());
AnnotationRulerColumn annotationRuler = new AnnotationRulerColumn(fAnnotationModel, 16, fAnnotationAccess);
fCompositeRuler.setModel(fAnnotationModel);
fOverviewRuler.setModel(fAnnotationModel);
fCompositeRuler.addDecorator(0, annotationRuler);
annotationRuler.addAnnotationType(ERROR_TYPE);
fOverviewRuler.addAnnotationType(ERROR_TYPE);
fOverviewRuler.addHeaderAnnotationType(ERROR_TYPE);
fOverviewRuler.setAnnotationTypeLayer(ERROR_TYPE, 3);
fOverviewRuler.setAnnotationTypeColor(ERROR_TYPE, new Color(Display.getDefault(), ERROR_RGB));
sourceViewer = new BglSourceViewer(compositeParent, fCompositeRuler, fOverviewRuler, isOverviewRulerVisible(), styles);
sourceViewer.setDocument(document, fAnnotationModel);
AnnotationBarHoverManager fAnnotationHoverManager = new AnnotationBarHoverManager(fCompositeRuler, sourceViewer, new AnnotationHover(), new AnnotationConfiguration());
fAnnotationHoverManager.install(annotationRuler.getControl());
AnnotationPainter ap = new AnnotationPainter(sourceViewer, fAnnotationAccess);
ap.addAnnotationType(ERROR_TYPE);
ap.setAnnotationTypeColor(ERROR_TYPE, new Color(Display.getDefault(), ERROR_RGB));
((BglSourceViewer)sourceViewer).addPainter(ap);
sourceViewer.configure(new CodeViewerConfiguration(cc));
}
private void prova2() {
ErrorAnnotation errorAnnotation = new ErrorAnnotation(1, "Error!!!");
fAnnotationModel.addAnnotation(errorAnnotation, new Position(5, 12));
}
}


the method "setProva()" call in createPartControl(Composite parent), open two textEditor in a window...

Can anyone help me please???