+ All Categories
Transcript
Page 1: Ingo Muschenetz: Titanium Studio Deep Dive

Titanium Studio Deep Dive

Ingo Muschenetz

Page 2: Ingo Muschenetz: Titanium Studio Deep Dive

Pimp My RIDE Customizing your Titanium Studio

Photo: babawheels.com

Page 3: Ingo Muschenetz: Titanium Studio Deep Dive

Director, Tools Engineering, Appcelerator

Leads both the Titanium Studio and Aptana Studio products and communities

10+ years designing developer tools and experiences

Page 4: Ingo Muschenetz: Titanium Studio Deep Dive

Titanium Studio

Aptana Studio

Eclipse Platform

Page 5: Ingo Muschenetz: Titanium Studio Deep Dive

Titanium Studio Mobile/Desktop platform support specific to Titanium Development. Titanium-specific content assist, Android/iOS debugging.

Aptana Studio Web language support(HTML, JS, CSS, Ruby, PHP, Python). FTP/SFTP, JavaScript debugging infrastructure. Git, Rubles.

Eclipse Platform IDE Shell, project management, basic editor architecture. Default preference layout. Toolbars. Update mechanisms.

Page 6: Ingo Muschenetz: Titanium Studio Deep Dive
Page 7: Ingo Muschenetz: Titanium Studio Deep Dive

What is a Ruble?

Scripting interface to Studio

Coded in Ruby

Contributes:

Themes Commands Snippets Templates Content Assist

Page 8: Ingo Muschenetz: Titanium Studio Deep Dive

Creating a New Ruble

1. File > New > Ruby Project 2. Name your Ruble. Click Next 3. Select the Ruble Template 4. Click Finish

Ruble template is itself a template contributed by a Ruble

Page 9: Ingo Muschenetz: Titanium Studio Deep Dive
Page 10: Ingo Muschenetz: Titanium Studio Deep Dive

Modifying an Existing Ruble

1. Commands > Ruble Name > Edit this bundle… 2. Ruble cloned into your workspace 3. Update to latest version with Git pulls

http://wiki.appcelerator.org/display/tis/Rubles

Page 11: Ingo Muschenetz: Titanium Studio Deep Dive
Page 12: Ingo Muschenetz: Titanium Studio Deep Dive

CSS Document:

body!{!! background:#000000;!! text-align:left;!

}!

1.  Colorize “background”? 2.  Specify a valid region for property proposals?

Scopes

Page 13: Ingo Muschenetz: Titanium Studio Deep Dive

Scopes

"   Scopes describe a subset of the document tree "   Often closely map to language tokens "   Scopes provide colorization and context

"   Themes collect scope colorization rules "   Content assist/commands use scope context

http://wiki.appcelerator.org/display/tis/Themes

Page 14: Ingo Muschenetz: Titanium Studio Deep Dive

body!{!! background : #000000 ;!! text-align : left ;!

}!

Document Scope

source.css

Page 15: Ingo Muschenetz: Titanium Studio Deep Dive

body!{!! background : #000000 ;!! text-align : left ;!

}!

Token Scopes support.type.property-name.css

entity.name.tag.css

punctuation.separator.key-value.css

constant.other.color.rgb-value.css

support.constant.property-value.css

punctuation.rule.terminator.css

Page 16: Ingo Muschenetz: Titanium Studio Deep Dive

body!{!! background : #000000 ;!! text-align : left ;!

}!

Meta Scopes meta.property-name.css

meta.selector.css

meta.property-value.css

meta.property-list.css

Page 17: Ingo Muschenetz: Titanium Studio Deep Dive

Scope Example

Colorization and Context "   source.css "   support.type.property-name.css

Context "   meta.property-list.css "   meta.property-name.css

Page 18: Ingo Muschenetz: Titanium Studio Deep Dive

Matching Rules

Most specific scope matches first

text.html vs. text

Descendant selectors

text.html source.php

Page 19: Ingo Muschenetz: Titanium Studio Deep Dive

<html>!!<body>!! !<?php!! !!! !?>! !!!</body>!

</html>!

Embedded Scopes

text.html

source.php

Page 20: Ingo Muschenetz: Titanium Studio Deep Dive

Scopes are Hierarchial

Generally follow a convention of category.sub-category.language-extension

comment All comments

comment.line All line comments

comment.line.js All line comments in JavaScript files

Page 21: Ingo Muschenetz: Titanium Studio Deep Dive

The Properties View helps discern relevant scopes

Page 22: Ingo Muschenetz: Titanium Studio Deep Dive
Page 23: Ingo Muschenetz: Titanium Studio Deep Dive

Commands

A script triggered manually or automatically

Execute on: "   Menu selection "   Content assist "   Tab activation "   File listener "   Eclipse “Command” execution

Page 24: Ingo Muschenetz: Titanium Studio Deep Dive

Sample Commands

"   Compile CoffeeScript "   Post editor selection as gist "   Execute editor selection as bash command "   Strip HTML tags from a document "   Run JSHint/HTMLTidy "   Deploy app to cloud service "   Execute any Java, Ruby, or Eclipse code

http://wiki.appcelerator.org/display/tis/Ruble+Cookbook

Page 25: Ingo Muschenetz: Titanium Studio Deep Dive

Command Example

command 'Swap Case' do |cmd|! cmd.key_binding = 'SHIFT+CTRL+A'! cmd.scope = 'source'! cmd.input = :selection! cmd.output = :replace_selection! cmd.invoke do |context|! word = $stdin.gets! context.exit_discard if word.nil?! print word.swapcase! end!end!

Page 26: Ingo Muschenetz: Titanium Studio Deep Dive

Command Demo

Page 27: Ingo Muschenetz: Titanium Studio Deep Dive

Inputs & Outputs Input Specifiers selection left_character right_character word line document clipboard none

Output Specifiers insert_as_text insert_as_snippet replace_selection replace_document copy_to_clipboard show_as_html show_as_tooltip create_new_document discard replace_line replace_word

Page 28: Ingo Muschenetz: Titanium Studio Deep Dive

Listener Example

command "Show Save Information" do |cmd|! cmd.input = :none! cmd.output = :discard! cmd.trigger = :execution_listener, ! "org.eclipse.ui.file.save"! cmd.invoke do |context|! # code here! end!end !

Page 29: Ingo Muschenetz: Titanium Studio Deep Dive
Page 30: Ingo Muschenetz: Titanium Studio Deep Dive

Snippets

Snippets focus on inserting small pieces of content.

Commonly use activation triggers (tab)

Support: "   Tab stops "   Mirrored variables "   Very similar to TextMate snippets

http://wiki.appcelerator.org/display/tis/Snippets

Page 31: Ingo Muschenetz: Titanium Studio Deep Dive

Snippet Example

snippet "background: color" do |s|! s.scope = "meta.property-list.css" ! s.trigger = "bgr"! s.expansion = "background:${1:red};$0"!end!

Page 32: Ingo Muschenetz: Titanium Studio Deep Dive

Snippet Example (Mirrored)

snippet "background-foreground" do |s|! s.scope = "meta.property-list.css" ! s.trigger = "bgfr"! s.expansion = "background: ${1:red};!! ! ! ! ! foreground: ${1}$0"!

end!

Page 33: Ingo Muschenetz: Titanium Studio Deep Dive

Snippet Demo

Page 34: Ingo Muschenetz: Titanium Studio Deep Dive
Page 35: Ingo Muschenetz: Titanium Studio Deep Dive

Project Templates

Provide default content for a new project

"   Packaged as .zip file "   Variable substitutions "   Contributed via Ruble or Extension point

http://wiki.appcelerator.org/display/tis/Templates

Page 36: Ingo Muschenetz: Titanium Studio Deep Dive

Project Template Example

project_template "Ruble Template" do |t|! t.type = :ruby! t.location = "templates/ruble_template.zip"! t.description = "A simple Ruble sample"! t.replace_parameters = true!end!

Page 37: Ingo Muschenetz: Titanium Studio Deep Dive

File Templates

Provide default content for a particular file type

"   Variable substitutions "   Contributed via Ruble

http://wiki.appcelerator.org/display/tis/Templates

Page 38: Ingo Muschenetz: Titanium Studio Deep Dive

File Template Example

template("HTML 5 Template") do |t|! t.filetype = "*.html"! t.location = "templates/html5.html"!end!

Page 39: Ingo Muschenetz: Titanium Studio Deep Dive
Page 40: Ingo Muschenetz: Titanium Studio Deep Dive

JSCA Files

"   3rd-party library content assist "  XML- and JSON-based "   Forthcoming tools to generate from TiDoc

http://wiki.appcelerator.org/display/tis/JSCA+1.0+Specification

Page 41: Ingo Muschenetz: Titanium Studio Deep Dive

JSCA Example

{! "types": [! {! "name": "Titanium.Android.NotificationManager", ! "examples": [], ! "functions": [! {! "name": "addEventListener", ! "parameters": [! {! "name": "name", ! "usage": "", ! "type": "String", ! "description": "name of the event"! },!

Page 42: Ingo Muschenetz: Titanium Studio Deep Dive

Documentation Example

In bundle.rb:

require 'ruble'!

bundle 'Titanium' do |bundle|! bundle.project_build_path["Titanium 1.8"] = ! "#{File.dirname($0)}/titanium.1.8.jsca"!end!

Page 43: Ingo Muschenetz: Titanium Studio Deep Dive
Page 44: Ingo Muschenetz: Titanium Studio Deep Dive

Plugins

"  Eclipse-based so most Eclipse plugins work "   Database Explorer "   Mobile Tooling

"   Java extensibility via extension points "  Eclipse Marketplace

Page 45: Ingo Muschenetz: Titanium Studio Deep Dive

Resources

Titanium-specific Rubles "  https://github.com/mschmulen/appfab.ruble "  https://github.com/aptana/titanium.ruble

Additional Rubles: "  https://github.com/aptana/

Page 46: Ingo Muschenetz: Titanium Studio Deep Dive

AppFab Demo

Page 47: Ingo Muschenetz: Titanium Studio Deep Dive

Top Related