SlideShare une entreprise Scribd logo
1  sur  97
Télécharger pour lire hors ligne
JavaFX @ eclipse.org
Tom Schindl <tom.schindl@bestsolution.at>
Twitter: @tomsontom
Blog: http://tomsondev.bestsolution.at
Website: 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 {
@Inject
SamplePartMessagesRegistry messagesReg;
@PostConstruct
void 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 {
@Inject
SamplePartMessagesRegistry messagesReg;
@PostConstruct
void 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-DSL
RobotTask {
// Variables to be used later on
variables = {
## Name of the bundle
STRING "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
LivePreview
public class FXMLProviderAdapter implements IFXMLProviderAdapter {
private XtextEditor editor;
public FXMLProviderAdapter(XtextEditor editor) {
this.editor = editor;
}
@Override
public IEditorPart getEditorPart() {
return editor;
}
@Override
public String getPreviewFXML() {
return editor.getDocument().readOnly(new IUnitOfWork<String, XtextResource>() {
@Override
public 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
@Component
public class OSGiComponent {
private Logger logger;
@Reference
public 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
@Log
private Logger logger;
}
Eclipse-DI
@Component
public class OSGiComponent {
private Logger logger;
@Reference
public 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
@Log
private Logger logger;
}
Eclipse-DI
public class PlainJava {
private static Logger logger =
LoggerCreator.createLogger(PlainJava.class);
}
Plain Java
@Component
public class OSGiComponent {
private Logger logger;
@Reference
public 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 {
@Inject
private 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 {
@Inject
private 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 {
@Inject
private 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 {
@Inject
public void setServices(@Service List<LoggerFactory> serviceList) {
}
@Inject
public 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 {
@Override
public 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 controlsFolderViewer
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Filesystem controlsFolderViewer
Folder Content Viewer
(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
Filesystem controlsFolderViewer
Folder Content Viewer
FileContentViewer
(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;nn…");
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;nn…");
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

Contenu connexe

Tendances

Introduction to Griffon
Introduction to GriffonIntroduction to Griffon
Introduction to GriffonJames Williams
 
Google io extended '17 인천
Google io extended '17 인천Google io extended '17 인천
Google io extended '17 인천Pluu love
 
CPAN Packager
CPAN PackagerCPAN Packager
CPAN Packagertechmemo
 
Composer - Package Management for PHP. Silver Bullet?
Composer - Package Management for PHP. Silver Bullet?Composer - Package Management for PHP. Silver Bullet?
Composer - Package Management for PHP. Silver Bullet?Kirill Chebunin
 
parenscript-tutorial
parenscript-tutorialparenscript-tutorial
parenscript-tutorialtutorialsruby
 
Scalable Real Time Chat (Text, Audio, Video) - Implemented using XMPP
Scalable Real Time Chat (Text, Audio, Video) - Implemented using XMPPScalable Real Time Chat (Text, Audio, Video) - Implemented using XMPP
Scalable Real Time Chat (Text, Audio, Video) - Implemented using XMPPUdaya Kiran
 
HTML5 - The Python Angle (PyCon Ireland 2010)
HTML5 - The Python Angle (PyCon Ireland 2010)HTML5 - The Python Angle (PyCon Ireland 2010)
HTML5 - The Python Angle (PyCon Ireland 2010)Kevin Gill
 
Html5 Open Video Tutorial
Html5 Open Video TutorialHtml5 Open Video Tutorial
Html5 Open Video TutorialSilvia Pfeiffer
 
Compile time dependency injection in Play 2.4 with macwire
Compile time dependency injection in Play 2.4 with macwireCompile time dependency injection in Play 2.4 with macwire
Compile time dependency injection in Play 2.4 with macwireyann_s
 
Vagrant move over, here is Docker
Vagrant move over, here is DockerVagrant move over, here is Docker
Vagrant move over, here is DockerNick Belhomme
 
CPAN Packager
CPAN PackagerCPAN Packager
CPAN Packagertechmemo
 
PHP Dependency Management with Composer
PHP Dependency Management with ComposerPHP Dependency Management with Composer
PHP Dependency Management with ComposerAdam Englander
 

Tendances (17)

Introduction to Griffon
Introduction to GriffonIntroduction to Griffon
Introduction to Griffon
 
Google io extended '17 인천
Google io extended '17 인천Google io extended '17 인천
Google io extended '17 인천
 
How to Add Original Library to Android NDK
How to Add Original Library to Android NDKHow to Add Original Library to Android NDK
How to Add Original Library to Android NDK
 
CPAN Packager
CPAN PackagerCPAN Packager
CPAN Packager
 
Phalcon 2 - PHP Brazil Conference
Phalcon 2 - PHP Brazil ConferencePhalcon 2 - PHP Brazil Conference
Phalcon 2 - PHP Brazil Conference
 
Troubleshooting Puppet
Troubleshooting PuppetTroubleshooting Puppet
Troubleshooting Puppet
 
Composer - Package Management for PHP. Silver Bullet?
Composer - Package Management for PHP. Silver Bullet?Composer - Package Management for PHP. Silver Bullet?
Composer - Package Management for PHP. Silver Bullet?
 
parenscript-tutorial
parenscript-tutorialparenscript-tutorial
parenscript-tutorial
 
Scalable Real Time Chat (Text, Audio, Video) - Implemented using XMPP
Scalable Real Time Chat (Text, Audio, Video) - Implemented using XMPPScalable Real Time Chat (Text, Audio, Video) - Implemented using XMPP
Scalable Real Time Chat (Text, Audio, Video) - Implemented using XMPP
 
How to Make Android Native Application
How to Make Android Native ApplicationHow to Make Android Native Application
How to Make Android Native Application
 
HTML5 - The Python Angle (PyCon Ireland 2010)
HTML5 - The Python Angle (PyCon Ireland 2010)HTML5 - The Python Angle (PyCon Ireland 2010)
HTML5 - The Python Angle (PyCon Ireland 2010)
 
Html5 Open Video Tutorial
Html5 Open Video TutorialHtml5 Open Video Tutorial
Html5 Open Video Tutorial
 
Compile time dependency injection in Play 2.4 with macwire
Compile time dependency injection in Play 2.4 with macwireCompile time dependency injection in Play 2.4 with macwire
Compile time dependency injection in Play 2.4 with macwire
 
Vagrant move over, here is Docker
Vagrant move over, here is DockerVagrant move over, here is Docker
Vagrant move over, here is Docker
 
CPAN Packager
CPAN PackagerCPAN Packager
CPAN Packager
 
Speedy TDD with Rails
Speedy TDD with RailsSpeedy TDD with Rails
Speedy TDD with Rails
 
PHP Dependency Management with Composer
PHP Dependency Management with ComposerPHP Dependency Management with Composer
PHP Dependency Management with Composer
 

En vedette

EclipseCon - Building an IDE for Apache Cassandra
EclipseCon - Building an IDE for Apache CassandraEclipseCon - Building an IDE for Apache Cassandra
EclipseCon - Building an IDE for Apache CassandraMichaël Figuière
 
The Next Generation Eclipse Graphical Editing Framework
The Next Generation Eclipse Graphical Editing FrameworkThe Next Generation Eclipse Graphical Editing Framework
The Next Generation Eclipse Graphical Editing FrameworkAlexander Nyßen
 
Managing XML documents with Epsilon
Managing XML documents with EpsilonManaging XML documents with Epsilon
Managing XML documents with EpsilonDimitris Kolovos
 

En vedette (7)

EclipseCon - Building an IDE for Apache Cassandra
EclipseCon - Building an IDE for Apache CassandraEclipseCon - Building an IDE for Apache Cassandra
EclipseCon - Building an IDE for Apache Cassandra
 
The Next Generation Eclipse Graphical Editing Framework
The Next Generation Eclipse Graphical Editing FrameworkThe Next Generation Eclipse Graphical Editing Framework
The Next Generation Eclipse Graphical Editing Framework
 
GEF4 - Sightseeing Mars
GEF4 - Sightseeing MarsGEF4 - Sightseeing Mars
GEF4 - Sightseeing Mars
 
GEF(4) Dot Oh Dot Oh
GEF(4) Dot Oh Dot OhGEF(4) Dot Oh Dot Oh
GEF(4) Dot Oh Dot Oh
 
Managing XML documents with Epsilon
Managing XML documents with EpsilonManaging XML documents with Epsilon
Managing XML documents with Epsilon
 
Epsilon
EpsilonEpsilon
Epsilon
 
Eugenia
EugeniaEugenia
Eugenia
 

Similaire à E(fx)clipse eclipse con

Java fx smart code econ
Java fx smart code econJava fx smart code econ
Java fx smart code econTom Schindl
 
Railo Presentation Railo 3.1
Railo Presentation Railo 3.1Railo Presentation Railo 3.1
Railo Presentation Railo 3.1Rhinofly
 
Overview & Downloading the Baseline using Global Configuration Managemen tand...
Overview & Downloading the Baseline using Global Configuration Managemen tand...Overview & Downloading the Baseline using Global Configuration Managemen tand...
Overview & Downloading the Baseline using Global Configuration Managemen tand...Bharat Malge
 
Democamp - Munich - Java9
Democamp - Munich - Java9Democamp - Munich - Java9
Democamp - Munich - Java9Tom Schindl
 
Writing highly scalable WebSocket using the Atmosphere Framework and Scala
Writing highly scalable WebSocket using the Atmosphere Framework and ScalaWriting highly scalable WebSocket using the Atmosphere Framework and Scala
Writing highly scalable WebSocket using the Atmosphere Framework and Scalajfarcand
 
David Rey Lessons Learned Updating Content Licensing To Be Plone 3 Compat...
David Rey   Lessons Learned   Updating Content Licensing To Be Plone 3 Compat...David Rey   Lessons Learned   Updating Content Licensing To Be Plone 3 Compat...
David Rey Lessons Learned Updating Content Licensing To Be Plone 3 Compat...Vincenzo Barone
 
Flash Security, OWASP Chennai
Flash Security, OWASP ChennaiFlash Security, OWASP Chennai
Flash Security, OWASP Chennailavakumark
 
Open Source XMPP for Cloud Services
Open Source XMPP for Cloud ServicesOpen Source XMPP for Cloud Services
Open Source XMPP for Cloud Servicesmattjive
 
Progscon 2017: Taming the wild fronteer - Adventures in Clojurescript
Progscon 2017: Taming the wild fronteer - Adventures in ClojurescriptProgscon 2017: Taming the wild fronteer - Adventures in Clojurescript
Progscon 2017: Taming the wild fronteer - Adventures in ClojurescriptJohn Stevenson
 
Googleappengineintro 110410190620-phpapp01
Googleappengineintro 110410190620-phpapp01Googleappengineintro 110410190620-phpapp01
Googleappengineintro 110410190620-phpapp01Tony Frame
 
New and cool in OSGi R7 - David Bosschaert & Carsten Ziegeler
New and cool in OSGi R7 - David Bosschaert & Carsten ZiegelerNew and cool in OSGi R7 - David Bosschaert & Carsten Ziegeler
New and cool in OSGi R7 - David Bosschaert & Carsten Ziegelermfrancis
 
What's New in ASP.NET Core 3
What's New in ASP.NET Core 3What's New in ASP.NET Core 3
What's New in ASP.NET Core 3Andrea Dottor
 
Ed presents JSF 2.2 and WebSocket to Gameduell.
Ed presents JSF 2.2 and WebSocket to Gameduell.Ed presents JSF 2.2 and WebSocket to Gameduell.
Ed presents JSF 2.2 and WebSocket to Gameduell.Edward Burns
 
Igalia Focus and Goals 2020 (2019 WebKit Contributors Meeting)
Igalia Focus and Goals 2020 (2019 WebKit Contributors Meeting)Igalia Focus and Goals 2020 (2019 WebKit Contributors Meeting)
Igalia Focus and Goals 2020 (2019 WebKit Contributors Meeting)Igalia
 
Building a social network in under 4 weeks with Serverless and GraphQL
Building a social network in under 4 weeks with Serverless and GraphQLBuilding a social network in under 4 weeks with Serverless and GraphQL
Building a social network in under 4 weeks with Serverless and GraphQLYan Cui
 
Structure your Play application with the cake pattern (and test it)
Structure your Play application with the cake pattern (and test it)Structure your Play application with the cake pattern (and test it)
Structure your Play application with the cake pattern (and test it)yann_s
 
Build social network in 4 weeks
Build social network in 4 weeksBuild social network in 4 weeks
Build social network in 4 weeksYan Cui
 

Similaire à E(fx)clipse eclipse con (20)

Java fx smart code econ
Java fx smart code econJava fx smart code econ
Java fx smart code econ
 
Java fx tools
Java fx toolsJava fx tools
Java fx tools
 
Java fx & xtext
Java fx & xtextJava fx & xtext
Java fx & xtext
 
Java fx ap is
Java fx ap isJava fx ap is
Java fx ap is
 
Railo Presentation Railo 3.1
Railo Presentation Railo 3.1Railo Presentation Railo 3.1
Railo Presentation Railo 3.1
 
Overview & Downloading the Baseline using Global Configuration Managemen tand...
Overview & Downloading the Baseline using Global Configuration Managemen tand...Overview & Downloading the Baseline using Global Configuration Managemen tand...
Overview & Downloading the Baseline using Global Configuration Managemen tand...
 
Democamp - Munich - Java9
Democamp - Munich - Java9Democamp - Munich - Java9
Democamp - Munich - Java9
 
Writing highly scalable WebSocket using the Atmosphere Framework and Scala
Writing highly scalable WebSocket using the Atmosphere Framework and ScalaWriting highly scalable WebSocket using the Atmosphere Framework and Scala
Writing highly scalable WebSocket using the Atmosphere Framework and Scala
 
David Rey Lessons Learned Updating Content Licensing To Be Plone 3 Compat...
David Rey   Lessons Learned   Updating Content Licensing To Be Plone 3 Compat...David Rey   Lessons Learned   Updating Content Licensing To Be Plone 3 Compat...
David Rey Lessons Learned Updating Content Licensing To Be Plone 3 Compat...
 
Flash Security, OWASP Chennai
Flash Security, OWASP ChennaiFlash Security, OWASP Chennai
Flash Security, OWASP Chennai
 
Open Source XMPP for Cloud Services
Open Source XMPP for Cloud ServicesOpen Source XMPP for Cloud Services
Open Source XMPP for Cloud Services
 
Progscon 2017: Taming the wild fronteer - Adventures in Clojurescript
Progscon 2017: Taming the wild fronteer - Adventures in ClojurescriptProgscon 2017: Taming the wild fronteer - Adventures in Clojurescript
Progscon 2017: Taming the wild fronteer - Adventures in Clojurescript
 
Googleappengineintro 110410190620-phpapp01
Googleappengineintro 110410190620-phpapp01Googleappengineintro 110410190620-phpapp01
Googleappengineintro 110410190620-phpapp01
 
New and cool in OSGi R7 - David Bosschaert & Carsten Ziegeler
New and cool in OSGi R7 - David Bosschaert & Carsten ZiegelerNew and cool in OSGi R7 - David Bosschaert & Carsten Ziegeler
New and cool in OSGi R7 - David Bosschaert & Carsten Ziegeler
 
What's New in ASP.NET Core 3
What's New in ASP.NET Core 3What's New in ASP.NET Core 3
What's New in ASP.NET Core 3
 
Ed presents JSF 2.2 and WebSocket to Gameduell.
Ed presents JSF 2.2 and WebSocket to Gameduell.Ed presents JSF 2.2 and WebSocket to Gameduell.
Ed presents JSF 2.2 and WebSocket to Gameduell.
 
Igalia Focus and Goals 2020 (2019 WebKit Contributors Meeting)
Igalia Focus and Goals 2020 (2019 WebKit Contributors Meeting)Igalia Focus and Goals 2020 (2019 WebKit Contributors Meeting)
Igalia Focus and Goals 2020 (2019 WebKit Contributors Meeting)
 
Building a social network in under 4 weeks with Serverless and GraphQL
Building a social network in under 4 weeks with Serverless and GraphQLBuilding a social network in under 4 weeks with Serverless and GraphQL
Building a social network in under 4 weeks with Serverless and GraphQL
 
Structure your Play application with the cake pattern (and test it)
Structure your Play application with the cake pattern (and test it)Structure your Play application with the cake pattern (and test it)
Structure your Play application with the cake pattern (and test it)
 
Build social network in 4 weeks
Build social network in 4 weeksBuild social network in 4 weeks
Build social network in 4 weeks
 

Dernier

%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrainmasabamasaba
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfkalichargn70th171
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVshikhaohhpro
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...Shane Coughlan
 
Exploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfExploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfproinshot.com
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Modelsaagamshah0812
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️Delhi Call girls
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfonteinmasabamasaba
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsJhone kinadey
 
10 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 202410 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 2024Mind IT Systems
 
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfPayment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfkalichargn70th171
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is insideshinachiaurasa2
 
Sector 18, Noida Call girls :8448380779 Model Escorts | 100% verified
Sector 18, Noida Call girls :8448380779 Model Escorts | 100% verifiedSector 18, Noida Call girls :8448380779 Model Escorts | 100% verified
Sector 18, Noida Call girls :8448380779 Model Escorts | 100% verifiedDelhi Call girls
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️Delhi Call girls
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsArshad QA
 
Pharm-D Biostatistics and Research methodology
Pharm-D Biostatistics and Research methodologyPharm-D Biostatistics and Research methodology
Pharm-D Biostatistics and Research methodologyAnusha Are
 
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...kalichargn70th171
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdfPearlKirahMaeRagusta1
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsAlberto González Trastoy
 

Dernier (20)

%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTV
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
 
Exploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfExploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdf
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
10 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 202410 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 2024
 
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfPayment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
 
Sector 18, Noida Call girls :8448380779 Model Escorts | 100% verified
Sector 18, Noida Call girls :8448380779 Model Escorts | 100% verifiedSector 18, Noida Call girls :8448380779 Model Escorts | 100% verified
Sector 18, Noida Call girls :8448380779 Model Escorts | 100% verified
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
Pharm-D Biostatistics and Research methodology
Pharm-D Biostatistics and Research methodologyPharm-D Biostatistics and Research methodology
Pharm-D Biostatistics and Research methodology
 
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdf
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 

E(fx)clipse eclipse con

  • 1. JavaFX @ eclipse.org Tom Schindl <tom.schindl@bestsolution.at> Twitter: @tomsontom Blog: http://tomsondev.bestsolution.at Website: http://www.bestsolution.at
  • 2. (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
  • 3. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
  • 4. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 Tooling
  • 5. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 Tooling News 1.0 - 1.2 ‣ CSS-Editor - Add gradient editor
  • 6. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 Tooling News 1.0 - 1.2 ‣ CSS-Editor - Add gradient editor
  • 7. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 ‣ CSS-Editor - Support for custom controls Tooling News 1.0 - 1.2
  • 8. (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
  • 9. (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
  • 10. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 ‣ FXML-Editor - Generating controller stub Tooling News 1.0 - 1.2
  • 11. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 Reuseable Tooling
  • 12. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 Components for reuse
  • 13. (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
  • 14. (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
  • 15. (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
  • 16. (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
  • 17. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 l10n
  • 18. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 l10n-DSL
  • 19. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 ‣ DSL to define translations l10n-DSL
  • 20. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 ‣ DSL to define translations ‣ Uses Xtext l10n-DSL
  • 21. (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
  • 22. (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
  • 23. (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"»''' } } }
  • 24. (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
  • 25. (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 { @Inject SamplePartMessagesRegistry messagesReg; @PostConstruct void 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); } }
  • 26. (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 { @Inject SamplePartMessagesRegistry messagesReg; @PostConstruct void 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())); } }
  • 27. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 Demo (Elementary)
  • 28. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 RRobot-DSL
  • 29. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 RRobot-DSL ‣ DSL to describe Eclipse project setups
  • 30. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 RRobot-DSL ‣ DSL to describe Eclipse project setups ‣ Uses Xtext
  • 31. (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
  • 32. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 RRobot-DSL RobotTask { // Variables to be used later on variables = { ## Name of the bundle STRING "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" } } } }
  • 33. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 Demo (Run Task)
  • 34. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 LivePreview
  • 35. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 LivePreview ‣ LivePreview was developed for FXML/FXGraph immediate feedback
  • 36. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 LivePreview ‣ LivePreview was developed for FXML/FXGraph immediate feedback ‣ Expects FXML passed
  • 37. (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
  • 38. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 Demo (Elemenatry & Lego-DSL & FXML- Viewer)
  • 39. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 LivePreview public class FXMLProviderAdapter implements IFXMLProviderAdapter { private XtextEditor editor; public FXMLProviderAdapter(XtextEditor editor) { this.editor = editor; } @Override public IEditorPart getEditorPart() { return editor; } @Override public String getPreviewFXML() { return editor.getDocument().readOnly(new IUnitOfWork<String, XtextResource>() { @Override public 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(); } }); }
  • 40. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 CSSExt-DSL
  • 41. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 CSSExt-DSL ‣ CSS-Editor has NO hard coded properties
  • 42. (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
  • 43. (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
  • 44. (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
  • 45. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 Demo (SVG-CSS- Properties)
  • 46. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
  • 47. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 Runtime
  • 48. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 Components for reuse
  • 49. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 ‣ DI-Extensions: @Log, @ContextValue, @Service Components for reuse
  • 50. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 ‣ DI-Extensions: @Log, @ContextValue, @Service ‣ Filesystem-Service Components for reuse
  • 51. (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
  • 52. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 @Log & Logger-API
  • 53. (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
  • 54. (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
  • 55. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 @Log & Logger-API
  • 56. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 @Log & Logger-API @Component public class OSGiComponent { private Logger logger; @Reference public synchronized void setLoggerFactory(LoggerFactory factory) { this.logger = factory.createLogger(OSGiComponent.class.getName()); } } OSGi-Component
  • 57. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 @Log & Logger-API public class DIComponent { @Inject @Log private Logger logger; } Eclipse-DI @Component public class OSGiComponent { private Logger logger; @Reference public synchronized void setLoggerFactory(LoggerFactory factory) { this.logger = factory.createLogger(OSGiComponent.class.getName()); } } OSGi-Component
  • 58. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 @Log & Logger-API public class DIComponent { @Inject @Log private Logger logger; } Eclipse-DI public class PlainJava { private static Logger logger = LoggerCreator.createLogger(PlainJava.class); } Plain Java @Component public class OSGiComponent { private Logger logger; @Reference public synchronized void setLoggerFactory(LoggerFactory factory) { this.logger = factory.createLogger(OSGiComponent.class.getName()); } } OSGi-Component
  • 59. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 ‣ Current shipped backends ‣ java.util.logging (default) ‣ log4j ‣ slf4j @Log & Logger-API
  • 60. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 @ContextValue ‣ Allows you to abstract away IEclipseContext#modify
  • 61. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 @ContextValue ‣ Allows you to abstract away IEclipseContext#modify public class ValuePublisherComponent { @Inject private IEclipseContext context; public void publishContext() { ListView<String> values = new ListView<>(); values.getSelectionModel().selectedItemProperty().addListener( (o,newVal,oldVal) -> value.modify("contextValue",newVal)); } }
  • 62. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 @ContextValue ‣ Allows you to abstract away IEclipseContext#modify public class ValuePublisherComponent { @Inject private 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)); } }
  • 63. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 @ContextValue ‣ Allows you to abstract away IEclipseContext#modify public class ValuePublisherComponent { @Inject private 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()); } }
  • 64. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 @Service
  • 65. (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
  • 66. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 public class DIServiceConsumer { @Inject public void setServices(@Service List<LoggerFactory> serviceList) { } @Inject public void setServices(@Service LoggerFactory serviceList) { } } @Service
  • 67. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 Fileystem Service ‣ Service on top of NIO2 low level API
  • 68. (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 { @Override public 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(); } }
  • 69. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 Filesystem controls
  • 70. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 Filesystem controlsFolderViewer
  • 71. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 Filesystem controlsFolderViewer Folder Content Viewer
  • 72. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 Filesystem controlsFolderViewer Folder Content Viewer FileContentViewer
  • 73. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 StyledText APIs ‣ Non Editable Text: StyledLabel & StyledString
  • 74. (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);
  • 75. (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); }
  • 76. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 ‣ StyledText in List/Table/TreeView StyledText APIs
  • 77. (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(); }
  • 78. (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()); }
  • 79. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 StyledText APIs ‣ Editable StyledText
  • 80. (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;nn…"); t.setStyleRanges( new StyleRange("keyword",0,6,null,null), /* */);
  • 81. (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;nn…"); t.setStyleRanges( new StyleRange("keyword",0,6,null,null), /* */); .keyword { -styled-text-color: rgb(127, 0, 85); -fx-font-weight: bold; }
  • 82. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 Compensator
  • 83. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 Compensator
  • 84. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 Compensator ‣ Mission 0: Must look slick!
  • 85. (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
  • 86. (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
  • 87. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 Compensator
  • 88. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 Compensator
  • 89. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 Demo (Basic- Editor + Python install)
  • 90. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 Compensator - HSL+CSS
  • 91. (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
  • 92. (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); } /* */
  • 93. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 Demo
  • 94. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
  • 95. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0
  • 96. (c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0 Compensator
  • 97. (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