E(fx)clipse eclipse con

97
JavaFX @ eclipse.org Tom Schindl <[email protected]> Twitter: @tomsontom Blog: http://tomsondev.bestsolution.at Website: http://www.bestsolution.at

Transcript of E(fx)clipse eclipse con

JavaFX @ eclipse.org

Tom Schindl <[email protected]>

Twitter: @tomsontomBlog: http://tomsondev.bestsolution.atWebsite: http://www.bestsolution.at

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

About Me‣ CTO BestSolution.at Systemhaus GmbH

‣ Eclipse Committer

‣ e4

‣ Platform

‣ EMF

‣ Project lead

‣ e(fx)clipse

‣ Twitter: @tomsontom

‣ Blog: tomsondev.bestsolution.at

‣ Cooperate: http://bestsolution.at

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Tooling

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Tooling News 1.0 - 1.2‣ CSS-Editor - Add gradient editor

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Tooling News 1.0 - 1.2‣ CSS-Editor - Add gradient editor

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

‣ CSS-Editor - Support for custom controls

Tooling News 1.0 - 1.2

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

‣ Java-Editor - Wizard to generate JavaFX Getter/setters

Tooling News 1.0 - 1.2

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

‣ Java-Editor - Wizard to generate JavaFX Getter/setters

Tooling News 1.0 - 1.2

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

‣ FXML-Editor - Generating controller stub

Tooling News 1.0 - 1.2

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Reuseable Tooling

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Components for reuse

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Components for reuse‣ l10n-DSL: if you Java8, e4 and want dynamic language flipping

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Components for reuse‣ l10n-DSL: if you Java8, e4 and want dynamic language flipping

‣ RRobot-DSL: allows you to describe eclipse-project setups

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Components for reuse‣ l10n-DSL: if you Java8, e4 and want dynamic language flipping

‣ RRobot-DSL: allows you to describe eclipse-project setups

‣ LivePreview: Reuse the live preview to present your textual content in a visual way

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Components for reuse‣ l10n-DSL: if you Java8, e4 and want dynamic language flipping

‣ RRobot-DSL: allows you to describe eclipse-project setups

‣ LivePreview: Reuse the live preview to present your textual content in a visual way

‣ CSSExt-DSL: allows you to define your custom CSS-Properties

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

l10n

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

l10n-DSL

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

‣ DSL to define translations

l10n-DSL

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

‣ DSL to define translations

‣ Uses Xtext

l10n-DSL

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

‣ DSL to define translations

‣ Uses Xtext

‣ Generates code and text files

l10n-DSL

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

‣ DSL to define translations

‣ Uses Xtext

‣ Generates code and text files

‣ Requires Java8

‣ Makes use of Java8 functional interfaces and method references

l10n-DSL

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

l10n-DSL‣ DSL to store language definitions

package sample.l10n.app.themes {bundle BasicMessages default en {

HelloWorld {en : '''Hello World''',de : '''Hallo Welt'''

}}bundle SamplePartMessages default en {

Button_title [ BasicMessages.HelloWorld ]Current_Date(DATE now) {

en : '''«now "MM/dd/yyyy"»''',de : '''«now "dd.MM.yyyy"»'''

}}

}

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

l10n-DSL‣ Generated artifacts

‣ ${bundle}.java: e4 message class

‣ ${bundle}.properties: Default transalations

‣ ${bundle}_${lang}.properties: Translations for the lang

‣ ${bundle}Registry.java: Registry to use for binding

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

‣ Use in code (Sample JavaFX)

l10n-DSL

package sample.l10n.app.themes;

public class SamplePart {@InjectSamplePartMessagesRegistry messagesReg;

@PostConstructvoid init(BorderPane pane) {

Button b = new Button();messagesReg.register(b::setText, messagesReg::Button_title);pane.setCenter(b);

Label l = new Label();messagesReg.register(b::setText,

messagesReg.Current_Date_supplier(new Date()));pane.setTop(l);

}}

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

‣ Use in code (Sample SWT)

l10n-DSL

package sample.l10n.app.themes;

public class SamplePart {@InjectSamplePartMessagesRegistry messagesReg;

@PostConstructvoid init(Composite pane) {

Button b = new Button(pane,SWT.PUSH);messagesReg.register(b::setText, messagesReg::Button_title);

Label l = new Label(pane,SWT.NONE);messagesReg.register(b::setText,

messagesReg.Current_Date_supplier(new Date()));}

}

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Demo (Elementary)

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

RRobot-DSL

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

RRobot-DSL‣ DSL to describe Eclipse project setups

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

RRobot-DSL‣ DSL to describe Eclipse project setups

‣ Uses Xtext

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

RRobot-DSL‣ DSL to describe Eclipse project setups

‣ Uses Xtext

‣ Allows to setup

‣ JDT Projects

‣ PDE-Projects Bundles & Features

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

RRobot-DSLRobotTask {

// Variables to be used later onvariables = {

## Name of the bundleSTRING "BundleName" default "econsample"

}projects = {

BundleProject "${BundleName}" {manifest = ManifestFile "${BundleName}" "1.0.0" "JavaSE-1.8" {

bundlename = "${BundleName}"vendor = "BestSolution.at"

}build = BuildProperties {

}resources = {

Folder "src"}rootfragments = {

fragment "default-src" "src"}

}}

}

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Demo (Run Task)

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

LivePreview

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

LivePreview‣ LivePreview was developed for FXML/FXGraph immediate feedback

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

LivePreview‣ LivePreview was developed for FXML/FXGraph immediate feedback

‣ Expects FXML passed

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

LivePreview‣ LivePreview was developed for FXML/FXGraph immediate feedback

‣ Expects FXML passed

‣ LivePreview requests FXML from editors who adapt to IFXMLProviderAdapter

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Demo (Elemenatry & Lego-DSL & FXML-

Viewer)

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

LivePreviewpublic class FXMLProviderAdapter implements IFXMLProviderAdapter {

private XtextEditor editor;

public FXMLProviderAdapter(XtextEditor editor) {this.editor = editor;

}

@Overridepublic IEditorPart getEditorPart() {

return editor;}

@Overridepublic String getPreviewFXML() {

return editor.getDocument().readOnly(new IUnitOfWork<String, XtextResource>() {

@Overridepublic String exec(XtextResource resource) throws Exception {

Injector injector = LegoActivator.getInstance().getInjector("at.bestsolution.lego.Lego");PreviewGenerator generator = injector.getInstance(PreviewGenerator.class);return generator.generatePreview((Model) resource.getContents().get(0)).toString();

}

});}

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

CSSExt-DSL

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

CSSExt-DSL‣ CSS-Editor has NO hard coded properties

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

CSSExt-DSL‣ CSS-Editor has NO hard coded properties

‣ Properties available are defined in an extra file ending with .cssext

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

CSSExt-DSL‣ CSS-Editor has NO hard coded properties

‣ Properties available are defined in an extra file ending with .cssext

‣ CSS-Editor looks up .cssext-Files from projects classpath

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

package svg {prop_alignment-baseline = [ auto | baseline | before-edge | text-before-edge | middle | central | after-edge | text-after-edge | ideographic | alphabetic | hanging | mathematical | inherit ];

/** * */tspan {

/** * Documentation */alignment-baseline <prop_alignment-baseline> default: auto;

}}

CSSExt-DSL

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Demo (SVG-CSS-Properties)

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Runtime

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Components for reuse

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

‣ DI-Extensions: @Log, @ContextValue, @Service

Components for reuse

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

‣ DI-Extensions: @Log, @ContextValue, @Service

‣ Filesystem-Service

Components for reuse

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

‣ DI-Extensions: @Log, @ContextValue, @Service

‣ Filesystem-Service

‣ Controls

‣ Filesystem controls

‣ StyledText & JFace-Text-Port

Components for reuse

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

@Log & Logger-API

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

@Log & Logger-API‣ Simple slf4j like API

‣ Used internally by e(fx)clipse runtime

‣ Implementation provided as an OSGi-Service/ServiceLoader

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

@Log & Logger-API‣ Simple slf4j like API

‣ Used internally by e(fx)clipse runtime

‣ Implementation provided as an OSGi-Service/ServiceLoader

‣ Multiple ways to consume

‣ Through OSGi-Service-Registry

‣ Through a factory

‣ Through DI with @Log

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

@Log & Logger-API

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

@Log & Logger-API

@Componentpublic class OSGiComponent {

private Logger logger;

@Referencepublic synchronized void setLoggerFactory(LoggerFactory factory) {

this.logger = factory.createLogger(OSGiComponent.class.getName());}

}

OSGi-Component

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

@Log & Logger-API

public class DIComponent {@Inject@Logprivate Logger logger;

}

Eclipse-DI

@Componentpublic class OSGiComponent {

private Logger logger;

@Referencepublic synchronized void setLoggerFactory(LoggerFactory factory) {

this.logger = factory.createLogger(OSGiComponent.class.getName());}

}

OSGi-Component

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

@Log & Logger-API

public class DIComponent {@Inject@Logprivate Logger logger;

}

Eclipse-DI

public class PlainJava {private static Logger logger = LoggerCreator.createLogger(PlainJava.class);

}

Plain Java

@Componentpublic class OSGiComponent {

private Logger logger;

@Referencepublic synchronized void setLoggerFactory(LoggerFactory factory) {

this.logger = factory.createLogger(OSGiComponent.class.getName());}

}

OSGi-Component

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

‣ Current shipped backends

‣ java.util.logging (default)

‣ log4j

‣ slf4j

@Log & Logger-API

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

@ContextValue‣ Allows you to abstract away IEclipseContext#modify

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

@ContextValue‣ Allows you to abstract away IEclipseContext#modify

public class ValuePublisherComponent {

@Injectprivate IEclipseContext context;

public void publishContext() {ListView<String> values = new ListView<>();values.getSelectionModel().selectedItemProperty().addListener( (o,newVal,oldVal) -> value.modify("contextValue",newVal));

}}

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

@ContextValue‣ Allows you to abstract away IEclipseContext#modify

public class ValuePublisherComponent {

@Injectprivate IEclipseContext context;

public void publishContext() {ListView<String> values = new ListView<>();values.getSelectionModel().selectedItemProperty().addListener( (o,newVal,oldVal) -> value.modify("contextValue",newVal));

}}

public class ValuePublisherComponent {@Inject@ContextValue("contextValue")private ContextBoundValue<String> value;

public void publishContext() {ListView<String> values = new ListView<>();values.getSelectionModel().selectedItemProperty().addListener( (o,newVal,oldVal) -> value.publish(newVal));

}}

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

@ContextValue‣ Allows you to abstract away IEclipseContext#modify

public class ValuePublisherComponent {

@Injectprivate IEclipseContext context;

public void publishContext() {ListView<String> values = new ListView<>();values.getSelectionModel().selectedItemProperty().addListener( (o,newVal,oldVal) -> value.modify("contextValue",newVal));

}}

public class ValuePublisherComponent {@Inject@ContextValue("contextValue")private ContextBoundValue<String> value;

public void publishContext() {ListView<String> values = new ListView<>();values.getSelectionModel().selectedItemProperty().addListener( (o,newVal,oldVal) -> value.publish(newVal));

}}

public class ValuePublisherComponent {@Inject@ContextValue("contextValue")private Property<String> value;

public void publishContext() {ListView<String> values = new ListView<>();fxProperty.bind(values.getSelectionModel().selectedItemProperty());

}}

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

@Service

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

@Service‣ Eclipse DI by default does NOT conform to OSGi-Service semantics

‣ Services can come and go

‣ Requestor of services is important if a ServiceFactory is used

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

public class DIServiceConsumer {@Injectpublic void setServices(@Service List<LoggerFactory> serviceList) {

}

@Injectpublic void setServices(@Service LoggerFactory serviceList) {

}}

@Service

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Fileystem Service‣ Service on top of NIO2 low level API

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Fileystem Service‣ Service on top of NIO2 low level API

public class FilesystemSample extends Application {

@Overridepublic void start(Stage primaryStage) throws Exception {

FilesystemService fs = Util.lookupService(FilesystemSample.class, FilesystemService.class);Subscription observePath = fs.observePath(Paths.get(URI.create("file:/Users/tomschindl")), (k,p) -> {

System.err.print("filesystem item '"+p+"' has been ");switch (k) {case CREATE:

System.err.println("created.");break;

case DELETE:System.err.println("deleted.");break;

default:System.err.println("modified.");break;

}});

// .....observePath.dispose();

}

}

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Filesystem controls

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Filesystem controlsFo

lder

Vie

wer

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Filesystem controlsFo

lder

Vie

wer

Folder Content Viewer

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Filesystem controlsFo

lder

Vie

wer

Folder Content Viewer

File

Con

tent

Vie

wer

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

StyledText APIs‣ Non Editable Text: StyledLabel & StyledString

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

StyledText APIs‣ Non Editable Text: StyledLabel & StyledString

StyledString s = new StyledString();s.appendSegment("Hello", "h1");s.appendSegment("World!", "h1","colorful");

StyledLabel label = new StyledLabel(s);

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

StyledText APIs‣ Non Editable Text: StyledLabel & StyledString

StyledString s = new StyledString();s.appendSegment("Hello", "h1");s.appendSegment("World!", "h1","colorful");

StyledLabel label = new StyledLabel(s);.h1 {

-fx-font-size: 20pt;}

.colorful {-fx-font-weight: bold;-fx-fill: linear-gradient( from 0.0% 0.0% to 100.0% 100.0%, rgb(128,179,128)

0.0, rgb(255,179,102) 100.0);}

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

‣ StyledText in List/Table/TreeView

StyledText APIs

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

‣ StyledText in List/Table/TreeView

StyledText APIs

public interface OutlineItem {public CharSequence getLabel();public Node getGraphic();public OutlineItem getParent();public ObservableList<OutlineItem> getChildren();

}

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

‣ StyledText in List/Table/TreeView

StyledText APIs

public interface OutlineItem {public CharSequence getLabel();public Node getGraphic();public OutlineItem getParent();public ObservableList<OutlineItem> getChildren();

}private TreeView<OutlineItem> createView() {TreeView<OutlineItem> outlineView = new TreeView<>();outlineView.setShowRoot(false);outlineView.setCellFactory(this::createCell);return outlineView;

}

TreeCell<OutlineItem> createCell(TreeView<OutlineItem> param) {return new SimpleTreeCell<OutlineItem>(i -> i.getLabel(), i -> i.getGraphic(), i -> Collections.emptyList());

}

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

StyledText APIs‣ Editable StyledText

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

StyledText APIs‣ Editable StyledText

StyledTextArea t = new StyledTextArea();t.getContent().setText("package test;\n\n…");t.setStyleRanges(new StyleRange("keyword",0,6,null,null),/* */);

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

StyledText APIs‣ Editable StyledText

StyledTextArea t = new StyledTextArea();t.getContent().setText("package test;\n\n…");t.setStyleRanges(new StyleRange("keyword",0,6,null,null),/* */);

.keyword {-styled-text-color: rgb(127, 0, 85);-fx-font-weight: bold;

}

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Compensator

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Compensator

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Compensator‣ Mission 0: Must look slick!

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Compensator‣ Mission 0: Must look slick!

‣ Mission 1: Create a simple source editor like Notepad++ who:

‣ Is process light-weight

‣ Makes it easy to add new language highlightings

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Compensator‣ Mission 0: Must look slick!

‣ Mission 1: Create a simple source editor like Notepad++ who:

‣ Is process light-weight

‣ Makes it easy to add new language highlightings

‣ Mission 2: Allow the simple source editor to expand to a (simple) IDE:

‣ where Source-Editor, VCS (git), Ticketsystem (eg. github), CI (eg. travis) are core components fully integrated with each other

‣ Easy to integrate: Does not depend on core.resources

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Compensator

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Compensator

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Demo (Basic-Editor + Python

install)

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Compensator - HSL+CSS

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Python { partition __dftl_partition_content_type partition __python_multiline_comment partition __python_singleline_comment partition __python_string rule_damager rule_damager __dftl_partition_content_type { default token python_default token python_string token python_operator token python_bracket token python_keyword_return token python_keyword keywords python_keyword_return [ "return" ] keywords python_keyword [ "and", "as", „assert", /* … */] } rule_damager __python_singleline_comment { default token python_single_line_comment } /* … */ rule_partitioner { single_line __python_string '"' => '"' single_line __python_singleline_comment "#" multi_line __python_multiline_comment "'''" => "'''" single_line __python_string "'" => "'" }} for "text/python"

Compensator - HSL+CSS

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Python { partition __dftl_partition_content_type partition __python_multiline_comment partition __python_singleline_comment partition __python_string rule_damager rule_damager __dftl_partition_content_type { default token python_default token python_string token python_operator token python_bracket token python_keyword_return token python_keyword keywords python_keyword_return [ "return" ] keywords python_keyword [ "and", "as", „assert", /* … */] } rule_damager __python_singleline_comment { default token python_single_line_comment } /* … */ rule_partitioner { single_line __python_string '"' => '"' single_line __python_singleline_comment "#" multi_line __python_multiline_comment "'''" => "'''" single_line __python_string "'" => "'" }} for "text/python"

Compensator - HSL+CSS

/* */.Python.styled-text-area .python_doc_default {

-styled-text-color: rgb(63, 95, 191);}

.Python.styled-text-area .python_single_line_comment {-styled-text-color: rgb(63, 127, 95);

}/* */

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Demo

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Compensator

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Compensator - Roadmap‣ Tighter integration with git workflow

‣ Improve Java autocomplete & Error Annotations

‣ Support for JavaScript auto-complete & error reporting

‣ Support for Xtext-Languages (their upcoming IntelliJ support should help us)

‣ Connect it to Flux to get a Flux Compensator