/** * */ package com.sap.ide.refactoring.core.textual; import java.util.List; import java.util.Map; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import com.sap.ide.refactoring.Activator; import com.sap.ide.refactoring.core.textual.ModelElementDocumentNodeChangeDescriptor.ChangeType; /** * Listener that analyzes ModelChange events to determine the minimal TextBlock trees that need * pretty printing. * * @author Stephan Erb (d049157) * */ public class TextBlocksNeedingPrettyPrintChangeListener implements ChangeListener, PreChangeListener { private final TextBlockInChangeCalculator tbChangeCalculator = new TextBlockInChangeCalculator(); /** * Pre change events */ @Override public void prepare(ChangeEvent event) { try { // We need to handle deleted elements before they are actually deleted. if (event instanceof ElementDeleteEvent) { ElementDeleteEvent elementEvent = (ElementDeleteEvent) event; RefObject affectedElement = elementEvent.getAffectedElement(event.getEventTriggerConnection()); if (affectedElement != null) { tbChangeCalculator.add(affectedElement, ChangeType.DELETED); } } } catch (Exception e) { Activator.logError(e, "Failed to calculate changed text blocks"); } } /** * Post change events. */ @Override public void notify(ChangeEvent event) { try { if (event instanceof ElementChangeEvent) { ElementChangeEvent elementEvent = (ElementChangeEvent) event; RefObject affectedElement = elementEvent.getAffectedElement(event.getEventTriggerConnection()); if (affectedElement != null) { if (event instanceof ElementCreateEvent) { tbChangeCalculator.add(affectedElement, ChangeType.CREATED); } else if (event instanceof ElementDeleteEvent) { // do nothing; already handled in the prepare handler } else { tbChangeCalculator.add(affectedElement, ChangeType.CHANGED); } } } if (event instanceof LinkChangeEvent) { LinkChangeEvent linkEvent = (LinkChangeEvent) event; RefObject affectedElement = linkEvent.getFirstLinkEnd(event.getEventTriggerConnection()); if (affectedElement != null) { tbChangeCalculator.add(affectedElement, ChangeType.CHANGED); } affectedElement = linkEvent.getSecondLinkEnd(event.getEventTriggerConnection()); if (affectedElement != null) { tbChangeCalculator.add(affectedElement, ChangeType.CHANGED); } } } catch (Exception e) { Activator.logError(e, "Failed to calculate changed text blocks"); } } public Map<RootElementTextBlockTuple, List<ModelElementDocumentNodeChangeDescriptor>> getTextBlocksNeedingPrettyPrinting() { return tbChangeCalculator.getTextBlocksNeedingPrettyPrinting(); } public Map<RootElementTextBlockTuple, List<ModelElementDocumentNodeChangeDescriptor>> getTextBlocksNeedingShortPrettyPrinting() { return tbChangeCalculator.getTextBlocksNeedingShortPrettyPrinting(); } }