package com.baselet.element.facet;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.baselet.control.enums.Priority;
import com.baselet.gui.AutocompletionText;
/**
* A Facet is a simple handler method which acts on certain lines and does a specific job if it should act.
* It is important that Facets are ALWAYS STATELESS.
* If any State is required, it should be stored using the {@link PropertiesParserState#getOrInitFacetResponse(Class, Object)} method
*/
public abstract class Facet {
protected Logger log = LoggerFactory.getLogger(Facet.class);
/**
* @param line the current line which is parsed
* @param state the current state of the parser
* @return true if the handleLine() method of this facet should be applied
*/
public abstract boolean checkStart(String line, PropertiesParserState state);
/**
* This method is invoked at the time when a specific line is parsed
* @param line the current line which is parsed
* @param state the current state of the parser
*/
public abstract void handleLine(String line, PropertiesParserState state);
/**
* @return a list of objects where each one represents one line for autocompletion
*/
public abstract List<AutocompletionText> getAutocompletionStrings();
/**
* This method is called once for every Facet AFTER all lines of text has been parsed
* E.g. useful for facets which collect information with every line but need complete knowledge before they can do something with it
*
* @param state the current state of the parser
* @param handledLines the list of lines this facet has been applied to (in the order of the handleLine calls)
*/
public void parsingFinished(PropertiesParserState state, List<String> handledLines) {
// default is no action
}
/**
* facets with higher priority will be applied before facets with lower priority:
* The order is: For all lines
* 1. Check all First-Run Facets from HIGHEST ... LOWEST
* 2. Check all Second-Run Facets from HIGHEST ... LOWEST
*/
public Priority getPriority() {
return Priority.DEFAULT;
}
/**
* The parser runs twice. Facets where this method returns true, are part of the first run, other facets are part of the second run
*
* Typically facets of the first run will influence the whole diagram, even if they are located at the bottom.
* e.g. bg=red must be known before drawing the common content of an element; style=autoresize must be known as soon as possible to make the size-calculations
*
* Facets of the second run have less side effects (e.g. printText just prints the current line, -- transforms to a horizontal line at the current print-position)
*/
public boolean handleOnFirstRun() {
return false;
}
}