Java tutorial
/******************************************************************************* * Copyright (c) 2015 UNIT Information Technologies R&D Ltd All rights reserved. This program and * the accompanying materials are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: Ferhat Erata - initial API and implementation H. Emre Kirmizi - initial API and * implementation Serhat Celik - initial API and implementation U. Anil Ozturk - initial API and * implementation *******************************************************************************/ package eu.modelwriter.marker.startup; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Scanner; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.emf.ecore.presentation.EcoreEditor; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.Document; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.viewers.AbstractTreeViewer; import org.eclipse.jface.viewers.DecoratingLabelProvider; import org.eclipse.jface.viewers.ILabelDecorator; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ITreeSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.text.edits.InsertEdit; import org.eclipse.text.edits.MalformedTreeException; import org.eclipse.text.edits.RangeMarker; import org.eclipse.text.edits.TextEdit; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.IPartListener2; import org.eclipse.ui.IStartup; import org.eclipse.ui.IViewReference; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPartReference; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.commands.ICommandService; import eu.modelwriter.marker.command.MarkerVisibilityHandler; import eu.modelwriter.marker.internal.MarkUtilities; import eu.modelwriter.marker.internal.MarkerFactory; import eu.modelwriter.marker.internal.MarkerUpdater; import eu.modelwriter.marker.model.SelectionChangeListener; import eu.modelwriter.marker.ui.internal.views.contextualview.ContextualView; public class Startup implements IStartup { public static IMarker preMarker = null; public static ITreeSelection preSelection = null; private boolean isFirst = true; private IEditorPart lastEditor; private IWorkbenchWindow window = null; @Override public void earlyStartup() { System.out.println("My plugin has been early started"); final IWorkbench workbench = PlatformUI.getWorkbench(); workbench.getDisplay().asyncExec(new Runnable() { @Override public void run() { window = workbench.getActiveWorkbenchWindow(); if (window != null) { IEditorPart part = window.getActivePage().getActiveEditor(); lastEditor = part; Startup.this.initContextualView(part); if (part instanceof EcoreEditor) { Startup.this.initSelectionChangeListener((EcoreEditor) part); Startup.this.iniResourceChangeListener((EcoreEditor) part); } window.getActivePage().addPartListener(new IPartListener2() { @Override public void partActivated(IWorkbenchPartReference partRef) { if (partRef instanceof IViewReference) { return; } if (partRef.getPart(false) instanceof IEditorPart) { IEditorPart editor = (IEditorPart) partRef.getPart(false); if (isFirst == false && lastEditor != null && !lastEditor.equals(window.getActivePage().getActiveEditor())) { ContextualView.refreshTree(); } if (editor instanceof EcoreEditor) { EcoreEditor eEditor = (EcoreEditor) editor; Startup.this.initDecoratingLabelProvider(eEditor); Startup.this.initSelectionChangeListener(eEditor); eEditor.getViewer().refresh(); // When change model, fix Xml file Startup.this.iniResourceChangeListener(eEditor); } lastEditor = window.getActivePage().getActiveEditor(); } } @Override public void partBroughtToTop(IWorkbenchPartReference partRef) { } @Override public void partClosed(IWorkbenchPartReference partRef) { IEditorPart editor; if (partRef.getPart(false) instanceof IEditorPart) { editor = (IEditorPart) partRef.getPart(false); } else { return; } if (editor instanceof EcoreEditor) { EcoreEditor eEditor = (EcoreEditor) editor; IFileEditorInput input = (IFileEditorInput) eEditor.getEditorInput(); IFile eFile = input.getFile(); List<IMarker> list = MarkerFactory.findMarkers(eFile); for (IMarker iMarker : list) { try { // If marker has old Uri and Text, setting these again. if (iMarker.getAttribute("oldText") != null && iMarker.getAttribute("oldUri") != null) { iMarker.setAttribute(IMarker.TEXT, iMarker.getAttribute("oldText")); iMarker.setAttribute(IMarker.MESSAGE, iMarker.getAttribute("oldText")); iMarker.setAttribute("uri", iMarker.getAttribute("oldUri")); // Clearing old Text and Uri. iMarker.setAttribute("oldText", null); iMarker.setAttribute("oldUri", null); } } catch (CoreException e) { e.printStackTrace(); } } } // Removing SelectionChangeListener from editor. Startup.this.removeSelectionChangeListener(partRef); SelectionChangeListener.preMarker = null; SelectionChangeListener.preSelection = null; ContextualView.refreshTree(); } @Override public void partDeactivated(IWorkbenchPartReference partRef) { Startup.this.removeSelectionChangeListener(partRef); } @Override public void partHidden(IWorkbenchPartReference partRef) { } @Override public void partInputChanged(IWorkbenchPartReference partRef) { } @Override public void partOpened(IWorkbenchPartReference partRef) { } @Override public void partVisible(IWorkbenchPartReference partRef) { } }); // If the an EcoreEditor is already opened before the part listener added. IEditorPart editor = window.getActivePage().getActiveEditor(); if (editor instanceof EcoreEditor) { Startup.this.initDecoratingLabelProvider((EcoreEditor) editor); } // Update Marker Visibility label final ICommandService commandService = window.getService(ICommandService.class); if (commandService != null) { commandService.refreshElements(MarkerVisibilityHandler.COMMAND_ID, null); } } isFirst = false; } }); } private void iniResourceChangeListener(EcoreEditor eEditor) { IFileEditorInput input = (IFileEditorInput) eEditor.getEditorInput(); IFile eFile = input.getFile(); ResourcesPlugin.getWorkspace().addResourceChangeListener(new IResourceChangeListener() { @Override public void resourceChanged(IResourceChangeEvent event) { IFileEditorInput input = (IFileEditorInput) eEditor.getEditorInput(); IFile file = input.getFile(); IResourceDelta delta = event.getDelta().findMember(file.getFullPath()); if (delta == null) { return; } int flags = delta.getFlags(); if (delta.getKind() == IResourceDelta.CHANGED && (flags & IResourceDelta.CONTENT) != 0) { List<IMarker> list = MarkerFactory.findMarkers(eFile); if (eFile.getFileExtension().equals("ecore")) { for (IMarker iMarker : list) { setOldTextAndUri(iMarker); try { MarkerFactory.updateMarkerfromXMLForModel(iMarker, eFile); } catch (Exception e) { // System.out.println( // e.toString() + " ->updateMarkerfromXMLForModel in resourceChange in StartUp"); } try { if (iMarker != null && MarkUtilities.getLinenumber(iMarker) == -1) { try { // MarkerUpdater.updateTargetsToDelete(iMarker); // MarkerUpdater.updateSourcesToDelete(iMarker); } catch (Exception e) { // System.out.println(e.toString() // + " ->updateTargetsToDelete && updateSourcesToDelete - // updateMarkerfromXMLForModel in resourceChange in StartUp"); } iMarker.delete(); } else { MarkerUpdater.update(iMarker); // MarkerUpdater.updateTargets(iMarker); // MarkerUpdater.updateSources(iMarker); } } catch (CoreException e) { e.printStackTrace(); } } } else if (eFile.getFileExtension().equals("reqif")) { for (IMarker iMarker : list) { setOldTextAndUri(iMarker); try { MarkerFactory.updateMarkerfromXMLForReqIf(iMarker, eFile); } catch (Exception e) { // System.out.println( // e.toString() + " ->updateMarkerfromXMLForReqIf in resourceChange in StartUp"); } try { if (iMarker != null && MarkUtilities.getLinenumber(iMarker) == -1) { try { // MarkerUpdater.updateTargetsToDelete(iMarker); // MarkerUpdater.updateSourcesToDelete(iMarker); } catch (Exception e) { // System.out.println(e.toString() // + " ->updateTargetsToDelete && updateSourcesToDelete - // updateMarkerfromXMLForReqIf in resourceChange in StartUp"); } iMarker.delete(); } else { MarkerUpdater.update(iMarker); // MarkerUpdater.updateTargets(iMarker); // MarkerUpdater.updateSources(iMarker); } } catch (CoreException e) { e.printStackTrace(); } } } else { for (IMarker iMarker : list) { setOldTextAndUri(iMarker); try { MarkerFactory.updateMarkerfromXMLForInstance(iMarker, eFile); } catch (Exception e) { // System.out.println(e.toString() // + " ->updateMarkerfromXMLForInstance in resourceChange in StartUp"); } try { if (iMarker != null && MarkUtilities.getLinenumber(iMarker) == -1) { try { // MarkerUpdater.updateTargetsToDelete(iMarker); // MarkerUpdater.updateSourcesToDelete(iMarker); } catch (Exception e) { // System.out.println(e.toString() // + " ->updateTargetsToDelete && updateSourcesToDelete - // updateMarkerfromXMLForInstance in resourceChange in StartUp"); } iMarker.delete(); } else { MarkerUpdater.update(iMarker); // MarkerUpdater.updateTargets(iMarker); // MarkerUpdater.updateSources(iMarker); } } catch (CoreException e) { e.printStackTrace(); } } } } } public void setOldTextAndUri(IMarker iMarker) { try { if (iMarker.getAttribute("oldText") != null && iMarker.getAttribute("oldUri") != null) { // Clearing old Text and Uri. iMarker.setAttribute("oldText", null); iMarker.setAttribute("oldUri", null); } } catch (CoreException e) { e.printStackTrace(); } } }, IResourceChangeEvent.POST_BUILD); } /** * Initializes decorator for given EcoreEditor. */ private void initDecoratingLabelProvider(EcoreEditor eEditor) { TreeViewer treeViewer = (TreeViewer) eEditor.getViewer(); ILabelProvider labelProvider = (ILabelProvider) treeViewer.getLabelProvider(); if (labelProvider instanceof DecoratingLabelProvider) { return; } else { ILabelDecorator decorator = window.getWorkbench().getDecoratorManager().getLabelDecorator(); treeViewer.setLabelProvider(new DecoratingLabelProvider(labelProvider, decorator)); } } private void initContextualView(IEditorPart editor) { if (editor == null) { return; } IFile file = editor.getEditorInput().getAdapter(IFile.class); TreeViewer treeViewer = ContextualView.getTreeViewer(); if (treeViewer != null) { // Finding all markers in given file. ArrayList<IMarker> allMarkers; allMarkers = MarkerFactory.findMarkersAsArrayList(file); if (allMarkers == null) { return; } Iterator<IMarker> iter = allMarkers.iterator(); while (iter.hasNext()) { IMarker marker = iter.next(); if (MarkUtilities.getLeaderId(marker) == null && MarkUtilities.getGroupId(marker) != null) { iter.remove(); } } if (!treeViewer.getTree().isDisposed()) { treeViewer.setInput(allMarkers.toArray()); } treeViewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS); } } @SuppressWarnings("unused") private boolean initResourceChangeListener(EcoreEditor eEditor) { ResourcesPlugin.getWorkspace().addResourceChangeListener(new IResourceChangeListener() { @Override public void resourceChanged(IResourceChangeEvent event) { IFileEditorInput input = (IFileEditorInput) eEditor.getEditorInput(); IFile file = input.getFile(); IResourceDelta delta = event.getDelta().findMember(file.getFullPath()); int flags = delta.getFlags(); if (delta != null && delta.getKind() == IResourceDelta.CHANGED && (flags & IResourceDelta.CONTENT) != 0) { Scanner scanner = null; try { scanner = new Scanner(file.getContents(), "UTF-8"); } catch (CoreException e) { e.printStackTrace(); } IDocument document = new Document(scanner.useDelimiter("\\A").next()); System.out.println("Document before change:\n" + document.get()); scanner.close(); InsertEdit edit = new InsertEdit(0, document.get()); List<IMarker> list = MarkerFactory.findMarkers(file); HashMap<String, RangeMarker> mapRangeMarker = new HashMap<String, RangeMarker>(); HashMap<String, IMarker> mapMarker = new HashMap<String, IMarker>(); for (IMarker iMarker : list) { try { int offset = MarkUtilities.getStart(iMarker); int length = MarkUtilities.getLength(iMarker); String id = MarkUtilities.getSourceId(iMarker); RangeMarker rm = new RangeMarker(offset, length); mapRangeMarker.put(id, rm); rm.apply(document); mapMarker.put(id, iMarker); } catch (MalformedTreeException | BadLocationException e) { e.printStackTrace(); } } edit = new InsertEdit(5, "#FERHAT#"); try { edit.apply(document, TextEdit.UPDATE_REGIONS); } catch (MalformedTreeException | BadLocationException e1) { e1.printStackTrace(); } System.out.println("========================="); System.out.println("New Document:\n" + document.get()); for (Map.Entry<String, RangeMarker> entry : mapRangeMarker.entrySet()) { IMarker marker = mapMarker.get(entry.getKey()); int start = entry.getValue().getOffset(); int end = entry.getValue().getOffset() + entry.getValue().getLength(); System.out.println("Old Start: " + MarkUtilities.getStart(marker) + " - " + "Old End: " + MarkUtilities.getEnd(marker)); MarkUtilities.setStart(marker, start); MarkUtilities.setEnd(marker, end); System.out.println("New Start: " + start + " - " + "New End: " + end); } } } }, IResourceChangeEvent.POST_BUILD); return false; } private boolean initSelectionChangeListener(EcoreEditor eEditor) { IFileEditorInput eInput = (IFileEditorInput) eEditor.getEditorInput(); IFile eFile = eInput.getFile(); // Adding SelectionChangeListener to editor. eEditor.getViewer().addSelectionChangedListener(SelectionChangeListener.getInstance(eFile)); return false; } private void removeSelectionChangeListener(IWorkbenchPartReference partRef) { if (partRef.getPart(false) instanceof IEditorPart) { IEditorPart editor = (IEditorPart) partRef.getPart(false); initContextualView(editor); if (editor instanceof EcoreEditor) { EcoreEditor eEditor = (EcoreEditor) editor; IFileEditorInput eInput = (IFileEditorInput) eEditor.getEditorInput(); IFile eFile = eInput.getFile(); // Removing SelectionChangeListener from editor. ((EcoreEditor) editor).getViewer() .removeSelectionChangedListener(SelectionChangeListener.getInstance(eFile)); } } } }