SlideShare uma empresa Scribd logo
1 de 51
1
2
Curso TotalCrossCurso TotalCross
Capítulo 1 – Introdução ao TotalCross
Capítulo 2 - Visão Geral da API
Capítulo 3 - Noções de Interface do Usuário
Capítulo 4 - Sincronização
3
Capítulo 1 - Introdução aoCapítulo 1 - Introdução ao
TotalCrossTotalCross
Resumo
1.1 Introdução
1.2 Explorando o SDK
1.3 Configurando o Eclipse
1.4 Criando um Programa Mínimo
1.5 Executando como Aplicação
1.6 Fazendo o deploy
4
1.1 Introdução1.1 Introdução
• Inteiramente desenvolvido no Brasil
– Início em 2001
• Máquina virtual baseada em registradores
– Requer um conversor de bytecodes para os tccodes
– Não suporta o tipo float, apenas double
• “Write Once Run Everywhere” real
• Plataformas suportadas
– Modernas: Android, iOS, Windows Phone 8.x
– Legado: Windows Mobile 5 e 6
– Desktop: Windows XP - 8, JDK, Linux
– Descontinuadas: Blackberry, Palm OS
5
1.2 Explorando o SDK1.2 Explorando o SDK
• TotalCross3
– dist
• samples
• vm
– docs
• TotalCross Companion.pdf
• html
– etc
• Programas usados pelo deployer
– src
• fontes java
6
1.3 Configurando o Eclipse1.3 Configurando o Eclipse
• Criando um projeto TotalCross
– Menu File / New / Java Project
• Project name: AloMundo
• Project layout: Create separate folders for sources
and class files
– Botão Next
• Certificar que Default output folder é AloMundo/bin
– Aba Libraries
• Add external jar
– TotalCross3/dist/tc.jar
• Expandir o tc.jar (clique sinal +)
– Source attachment / Edit / External Folder
» TotalCross3/src
– Finish
7
1.4 Criando um Programa Mínimo1.4 Criando um Programa Mínimo
• A seguir, temos um programa que simplesmente
mostra um botão, exibindo uma mensagem de
saudação ao ser pressionado
• Clicar com botão direito na pasta src
– New / Class
• Name: AloMundo
• Superclass: totalcross.ui.MainWindow
8
Classe
AloMundo
1 import totalcross.ui.*; import totalcross.ui.dialog.*;
2 import totalcross.ui.event.*;
3 public class AloMundo extends MainWindow
4 {
5 private Button btn;
6
7 public AloMundo()
8 {
9 super("Curso TotalCross", TAB_ONLY_BORDER);
10 setUIStyle(totalcross.sys.Settings.Android);
11 }
12
13 public void initUI()
14 {
15 add(btn = new Button("Olá!"), CENTER,CENTER);
16 }
17
18 public void onEvent(Event e)
19 {
10 if (e.type == ControlEvent.PRESSED && e.target == btn)
11 new MessageBox("Olá!",
12 "Bem vindo ao mundo da computação móvel!").popup();
13 }
14 }
1.4 Criando um Programa Mínimo1.4 Criando um Programa Mínimo
9
1.5 Executando como Aplicação1.5 Executando como Aplicação
• Menu Run / Run configurations ( )
• Clicar Java aplication / Botão direito / New
• Aba Main
– Name: AloMundo
– Main class: totalcross.Launcher
• Aba Arguments
– Nome da classe principal (aquela que estende
totalcross.ui.MainWindow)
– Outros parâmetros para launcher.
– Testar:
• AloMundo
• /scr android AloMundo
• /scr 480x640x32 /fontsize 20 AloMundo
10
1.6 Fazendo o deploy1.6 Fazendo o deploy
• Para executar a aplicação nos dispositivos, é
preciso empacotá-las
– Usa-se tc.Deploy, contido no tc.jar
• Passa-se apenas o nome da classe principal
– Informações são obtidas a partir do código fonte
– As classes e mídias referenciadas são
adicionadas automaticamente
– O pacote correto é detectado automaticamente
– Imagens bmp e gif são convertidas para PNG
– Todos os arquivos são comprimidos
• O empacotamento já chama o conversor e gera o
arquivo de saída TCZ
– TCZ = TotalCross Zip
• Diretórios de instalação são gerados
11
1.6 Fazendo o deploy1.6 Fazendo o deploy
• Tudo fica simples com um build.xml de ANT
• Copiar o que está na pasta
– TotalCross3/docs/build.xml
… para a pasta do projeto
– Clicar F5 para atualizar
– Dar um clique-duplo no build.xml
– Editar propriedades:
• app.name = AloMundo
• target.dir = bin
– Salvar
• Clicar botão direito em build.xml
– Run as / Ant build
12
1.6 Fazendo o deploy1.6 Fazendo o deploy
• Pastas criadas:
– install
• android: instalar apk usando adb.exe
• iOS: instalar com iTunes
• wp8: arquivo xap
• win32: clique no .exe
• wince: clicar no bat
• applet: rodar um dos html no browser
• linux: clique no executável
13
Capítulo 2 – Visão geral da APICapítulo 2 – Visão geral da API
Resumo
2.1 Pacote
totalcross.crypto
2.2 Pacote
totalcross.db/sql
2.3 Pacote totalcross.io
2.4 Pacote totalcross.json
2.5 Pacote totalcross.lang
2.6 Pacote totalcross.map
2.7 Pacote totalcross.net
2.8 Pacote totalcross.phone
2.9 Pacote totalcross.sys
2.10 Pacote totalcross.unit
2.11 Pacote totalcross.util
2.12 Pacote totalcross.xml
14
2.1 Pacote totalcross.crypto2.1 Pacote totalcross.crypto
• Classes usadas em criptografia
– Cipher: AES, RSA
– Digest: MD5, SHA1, SHA256
– Signature: PKCS1
15
2.2 Pacote totalcross.db/sql2.2 Pacote totalcross.db/sql
• Pacote DB possui a implementação Java do SQLite
– sqlite-jdbc
• Banco de dados portável mais usado no mundo
• Permite usar comandos SQL para manipular
arquivos de dados
• Poderoso, leve, baixo consumo de memória.
• Pacote totalcross.sql posssui uma implementação
parcial do JDBC para uso com o SQLite
– SQLiteUtil
util = new SQLiteUtil(Settings.appPath,"fb.db");
Statement st = util.con().createStatement();
st.execute("create table if not exists users
(name varchar, photo blob, active int)");
16
2.3 Pacote totalcross.io2.3 Pacote totalcross.io
• Classes usadas em entrada e saída
– ByteArrayStream
– DataStream
– File
• BufferedStream
– LineReader
– device.bluetooth
– device.gps
– device.printer
– device.scanner
• Windows CE
• Android (ZXing)
17
2.4 Pacote totalcross.json2.4 Pacote totalcross.json
• Porte da biblioteca json em Java
18
2.5 Pacote totalcross.lang2.5 Pacote totalcross.lang
• Compatível até Java 7
– Possui suporte a reflection e generics
– Não possui suporte a annotation
• Subconjunto do java.lang
– TotalCross: 49 classes
– Java 7: 103 classes
• Não se importa o totalcross.lang
– É usado apenas no conversor
19
2.6 Pacote totalcross.map2.6 Pacote totalcross.map
• Suporte ao GoogleMaps
– iOS, android e windows phone
• No android permite desenhar
• Suporta também o Waze (iOS e android)
20
2.7 Pacote totalcross.net2.7 Pacote totalcross.net
• Classes de conexão
– Socket
– FTP
– HTTPStream
– ServerSocket
– mail (Pop3)
– ssl
21
2.8 Pacote totalcross.phone2.8 Pacote totalcross.phone
• Classes para manipulação de telefones
– CellInfo
– Dial
– SMS
• Somente WP8
22
2.9 Pacote totalcross.sys2.9 Pacote totalcross.sys
• Classes utilitárias e de uso da VM
– Convert
– Setting
– Time
– Vm
23
2.10 Pacote totalcross.unit2.10 Pacote totalcross.unit
• Classes para fazer teste unitário
– TestCase
– TestSuite
– UIRobot
24
2.11 Pacote totalcross.util2.11 Pacote totalcross.util
• Classes utilitárias
– Date
– Hashtable / Vector
– IntHashtable / IntVector
– Random
– Collections
– concurrent.Lock
– BigDecimal / BigInteger
– PDFWritter
– Regex
– Zip/ZLib/GZip
25
2.12 Pacote totalcross.xml2.12 Pacote totalcross.xml
• Classes para manusear XML
– XMLRPC com Axis
– Soap
– XmlTokenizer
26
Capítulo 3Capítulo 3
Noções de Interface do UsuárioNoções de Interface do Usuário
Resumo
3.1 Introdução
3.2 Estilos de Interface
3.3 totalcross.ui.Control
3.4 totalcross.ui.Container
3.5 totalcross.ui.Window
3.6 totalcross.ui.MainWindow
3.7 Window x Container
3.8 Adicionando Controles
3.9 Tratando Eventos
27
3.1 Introdução3.1 Introdução
• Controles totalmente feitos em Java
– Facilidade de customização
• Biblioteca rica em controles de interface com o
usuário
• Diversas características embutidas – controles
multifuncionais
• Suporte automático para rotação de tela
• Leves
– Funcionam bem em CPUs de baixo poder de
processamento
28
3.1 Introdução3.1 Introdução
Bar
Button
ButtonMenu
Check
ComboBox
Edit
Grid
ImageControl
ImageList
Label
ListBox
Control
Container
AlignedLabelsContainer
FlowContainer
GridContainer
ListContainer
ScrollContainer
TabbedContainer
Window
MainWindow
Outros: RadioGroupController UIColors Insets MenuItem
MultiEdit
MultiListBox
ProgressBar
PushButtonGroup
Radio
Ruler
Slider
Spacer
SpinList
ToolTip
Whiteboard
Pacote totalcross.ui
29
3.1 Introdução3.1 Introdução
.dialog
MessageBox
InputBox
FileChooserBox
TimeBox
.chart
ColumnChart
LineChart
PieChart
Velocimeter
XYChart
Sub-pacotes de totalcross.ui
.event
ControlEvent / PressListener
KeyEvent / KeyListener
PenEvent / PenListener
GridEvent / GridListener
.gfx
Color
Graphics
Coord
Rect
.font
Font
FontMetrics
.image
Image
.tree
Tree
Node
.media
Camera
MediaClip
Sound
30
3.2 Estilos de Interface3.2 Estilos de Interface
• Todos os controles da biblioteca implementam
quatro tipos de interface
– Flat, Vista, Android, Holo
– Depreciados: PalmOS, WinCE
• Vista é o padrão. Para mudar o estilo, faça no
construtor da aplicação
setUIStyle(totalcross.sys.estilo);
31
3.3 totalcross.ui.Control3.3 totalcross.ui.Control
• Implicitamente estende java.lang.Object
• Classe base de todos os controles de IU
32
3.4 totalcross.ui.Container3.4 totalcross.ui.Container
• Estende totalcross.ui.Control
• Serve como um local onde controles são adicionados
• Pode possuir uma borda
33
3.5 totalcross.ui.Window3.5 totalcross.ui.Window
• Estende totalcross.ui.Container
• Funciona como uma janela popup modal
• A janela pode ser arrastada pela tela
• Pode possuir um título e/ou uma borda
• Construtores: Window(), Window(título, tipoBorda)
• Eventos gerados
– ControlEvent.WINDOW_CLOSED
34
3.6 totalcross.ui.MainWindow3.6 totalcross.ui.MainWindow
• Estende totalcross.ui.Window
• Define a janela principal da aplicação
– Só pode existir, por aplicação, uma classe que
estenda MainWindow
35
3.7 Window x Container3.7 Window x Container
• Window: deve ser usado quando apenas uma parte
da tela for ocupada.
• Container: deve ser usado quando toda a tela deve
ser ocupada por controles.
– initUI: inicializa a interface com o usuário
• Nunca faça isso no construtor da classe!
– Uma aplicação típica possui dezenas de classes
que estendem Container.
– Container exibido é ativado usando o método
swapToTopmostWindow.
• Jamais addicione uma Window a um Container
– RuntimeException é disparada
– Use popup para exibi-la
36
3.8 Adicionando Controles3.8 Adicionando Controles
• Posicionamento relativo
– Chave para gerar telas de interface com o
usuário, portável entre plataformas e resoluções
diferentes. Resoluções usuais:
• Windows Phone: 768x1280, 1080x1920
• iOS: 640x1136, 1536x2048
• Android: 480x800, 1600x2560
– Cada controle sabe o seu tamanho ideal
• Calculado com base em características (como
bordas), estilo da interface do usuário, e na
fonte escolhida para o controle
– Permite um ajuste fino em pixels, caso
necessário
• Opcionalmente, ajuste pela altura da fonte
37
3.8 Adicionando Controles3.8 Adicionando Controles
• Posicionamento relativo
– Utiliza-se constantes para especificar a posição em relação
• Ao último controle adicionado
• A um controle qualquer especificado
• Container parente (primeiro controle adicionado)
– Constantes definidas na classe Control
• X: BEFORE, CENTER, AFTER, LEFT, RIGHT, SAME,
CENTER_OF, RIGHT_OF, KEEP, PARENTSIZE
• Y: BEFORE, CENTER, AFTER, TOP, BOTTOM, SAME,
CENTER_OF, BOTTOM_OF, KEEP, PARENTSIZE
• Largura e Altura: PREFERRED, SAME, FILL, FIT, KEEP,
WILL_RESIZE, SCREENSIZE, SCREENSIZEMIN,
SCREENSIZEMAX, PARENTSIZE, PARENTSIZEMIN,
PARENTSIZEMAX
– Para efetuar um ajuste fino, some ou subtraia um valor da
constante acima
38
3.8 Adicionando Controles3.8 Adicionando Controles
Left
Top
Center
Bottom
Right
39
3.8 Adicionando Controles3.8 Adicionando Controles
Before
Before
After
After
x
y
40
3.8 Adicionando Controles3.8 Adicionando Controles
Center_of Right_of
Bottom_of
Center_of
x
y
41
3.8 Adicionando Controles3.8 Adicionando Controles
Fill
Fit
x
y
42
3.8 Adicionando Controles3.8 Adicionando Controles
• Métodos para adicionar e especificar o tamanho
– Classe totalcross.ui.Control
• setRect(x, y, largura, altura)
• setRect(x, y, largura, altura, relativoA)
– Classe totalcross.ui.Container
• add(controle)
• add(controle, x, y) – largura e altura =
PREFERRED
• add(controle, x, y, relativoA) – idem
• add(controle, x, y, largura, altura)
• add(controle, x, y, largura, altura, relativoA)
– Características do controle, se não forem as
padrões, devem ser modificadas antes de
chamar os métodos acima.
43
3.9 Tratando Eventos3.9 Tratando Eventos
• TotalCross possui dois modelos de tratamento:
– JDK 1.02 (todos os eventos são enviados para um
único método)
• O método onEvent de cada controle é acionado,
propagando-se para cima na hierarquia até a
Window
• Pode-se evitar que o evento continue a ser
propagado marcando o flag consumed.
– JDK 1.1+ (dispatch/listener)
• implements XListener
• addXListener
44
Capítulo 4 - SincronizaçãoCapítulo 4 - Sincronização
Resumo
9.1 HttpStream
9.2 Webservices
9.3 JSon
45
4.1 Sincronização online - Preâmbulo
• PessoaDB.getDadosSincronização
public static String[][] getDadosSincronizacao() {
RowIterator it = driver.getRowIterator("pessoa");
String[][] temp = new String[driver.getRowCount("pessoa")][];
String attrs[] = {"S","N","U","D"}; // synced,new,updated,deleted
int j =0;
while (it.nextNotSynced()) {
String[] line = new String[8];
line[0] = attrs[it.attr];
line[1] = it.getString(1);
line[2] = it.getDate(2).toString();
line[3] = Convert.toString(it.getDouble(3));
line[4] = it.getString(4);
line[5] = Convert.toString(it.getShort(5));
line[6] = Convert.toString(it.getShort(6));
line[7] = Convert.toString(it.getInt(7));
temp[j++] = line;
it.setSynced();
}
String[][] ret = new String[j][]; Vm.arrayCopy(temp, 0, ret, 0, j);
return ret;
}
46
4.1 HttpStream
• Exemplo para sincronizar com um ASP usando POST
HttpStream.Options options = new HttpStream.Options();
options.doPost = true;
// prepara os dados
options.postData = dados;
// conecta no servidor
HttpStream hs = new HttpStream(new
URI("http://www.totalcross.com/curso_sync.asp"),
options);
// pega a resposta
for (String s; (s = hs.readLine()) != null; )
log(s,false);
• curso_sync.asp
<% Response.write("okn"); %>
47
4.24.2 Webservices
• Utiliza-se a classe SOAP
– Faz compressão automática dos dados (até 90%)
– Funciona com servidores .Net e Java, dentre outros
– Suporta o envio de tipos primitivos e objetos simples
• Construtor:
– SOAP(method, uri)
• Principais métodos:
– execute, getAnswer
– setParam(param), setParam(param, nome)
• param pode ser um destes tipos: boolean,
boolean[], byte[], double, double[], int, int[],
String, String[]
• Atributos importantes: openTimeout, readTimeout,
writeTimeout, debug
48
4.24.2 Webservices
• Exemplo
// prepara os dados
SOAP s = new SOAP("sincroniza",
"http://www.superwaba.net:8080/curso_sync/services/Web
App");
String[] linhas = ...;
s.setParam(linhas, "linhas");
s.execute();
// pega a resposta
String ans = (String)s.getAnswer();
if (ans != null)
log("Linhas processadas: "+ans);
49
4.24.2 Webservices
• Webservice:
public class WebApp
{
public int sincroniza(String[] linhas)
{
if (linhas == null)
return -1;
return linhas.length;
}
}
50
4.3 JSon
– listFiles(dir)
51
FimFim
Contato: bruno@totalcross.com

Mais conteúdo relacionado

Semelhante a Curso TotalCross: Introdução e Visão Geral da API

TDC2016SP - Por dentro do .Net Core
TDC2016SP - Por dentro do .Net CoreTDC2016SP - Por dentro do .Net Core
TDC2016SP - Por dentro do .Net Coretdc-globalcode
 
Interoperabilidade com .NET em ambiente Mainframe
Interoperabilidade com .NET em ambiente MainframeInteroperabilidade com .NET em ambiente Mainframe
Interoperabilidade com .NET em ambiente MainframeAlessandro Binhara
 
Apresentacao android por Júlio Cesar Bueno Cotta
Apresentacao android por Júlio Cesar Bueno CottaApresentacao android por Júlio Cesar Bueno Cotta
Apresentacao android por Júlio Cesar Bueno CottaGPrimola
 
ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014Giovanni Bassi
 
TDC2018SP | Trilha Kotlin - Uma visao geral sobre Kotlin multiplataforma
TDC2018SP | Trilha Kotlin - Uma visao geral sobre Kotlin multiplataformaTDC2018SP | Trilha Kotlin - Uma visao geral sobre Kotlin multiplataforma
TDC2018SP | Trilha Kotlin - Uma visao geral sobre Kotlin multiplataformatdc-globalcode
 
Minicurso Android Ronildo Oliveira
Minicurso Android  Ronildo OliveiraMinicurso Android  Ronildo Oliveira
Minicurso Android Ronildo OliveiraRonildo Oliveira
 
Compartilhando código com Kotlin multiplataforma - Rafael Toledo
Compartilhando código com Kotlin multiplataforma - Rafael ToledoCompartilhando código com Kotlin multiplataforma - Rafael Toledo
Compartilhando código com Kotlin multiplataforma - Rafael ToledoiMasters
 
Java Fundamentos
Java FundamentosJava Fundamentos
Java FundamentosWilson Lima
 
JSF 2.0: Uma Evolução nas Interfaces Web com Java
JSF 2.0: Uma Evolução nas Interfaces Web com JavaJSF 2.0: Uma Evolução nas Interfaces Web com Java
JSF 2.0: Uma Evolução nas Interfaces Web com JavaDr. Spock
 
Introdução à plataforma Android
Introdução à plataforma AndroidIntrodução à plataforma Android
Introdução à plataforma AndroidNatanael Fonseca
 
instalação do phonegap(cordova) no windows 8.1
instalação do phonegap(cordova) no windows 8.1instalação do phonegap(cordova) no windows 8.1
instalação do phonegap(cordova) no windows 8.1Afonso Fernandes
 
SESTINFO 2011 Apresentacao Android
SESTINFO 2011 Apresentacao AndroidSESTINFO 2011 Apresentacao Android
SESTINFO 2011 Apresentacao AndroidRafael Sakurai
 

Semelhante a Curso TotalCross: Introdução e Visão Geral da API (20)

TDC2016SP - Por dentro do .Net Core
TDC2016SP - Por dentro do .Net CoreTDC2016SP - Por dentro do .Net Core
TDC2016SP - Por dentro do .Net Core
 
Interoperabilidade com .NET em ambiente Mainframe
Interoperabilidade com .NET em ambiente MainframeInteroperabilidade com .NET em ambiente Mainframe
Interoperabilidade com .NET em ambiente Mainframe
 
Phonegap
PhonegapPhonegap
Phonegap
 
Apresentacao android por Júlio Cesar Bueno Cotta
Apresentacao android por Júlio Cesar Bueno CottaApresentacao android por Júlio Cesar Bueno Cotta
Apresentacao android por Júlio Cesar Bueno Cotta
 
ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014
 
TDC2018SP | Trilha Kotlin - Uma visao geral sobre Kotlin multiplataforma
TDC2018SP | Trilha Kotlin - Uma visao geral sobre Kotlin multiplataformaTDC2018SP | Trilha Kotlin - Uma visao geral sobre Kotlin multiplataforma
TDC2018SP | Trilha Kotlin - Uma visao geral sobre Kotlin multiplataforma
 
Minicurso Android Ronildo Oliveira
Minicurso Android  Ronildo OliveiraMinicurso Android  Ronildo Oliveira
Minicurso Android Ronildo Oliveira
 
Compartilhando código com Kotlin multiplataforma - Rafael Toledo
Compartilhando código com Kotlin multiplataforma - Rafael ToledoCompartilhando código com Kotlin multiplataforma - Rafael Toledo
Compartilhando código com Kotlin multiplataforma - Rafael Toledo
 
Minicurso GNU/Linux
Minicurso GNU/LinuxMinicurso GNU/Linux
Minicurso GNU/Linux
 
Java Fundamentos
Java FundamentosJava Fundamentos
Java Fundamentos
 
O projeto Mono
O projeto MonoO projeto Mono
O projeto Mono
 
JSF 2.0: Uma Evolução nas Interfaces Web com Java
JSF 2.0: Uma Evolução nas Interfaces Web com JavaJSF 2.0: Uma Evolução nas Interfaces Web com Java
JSF 2.0: Uma Evolução nas Interfaces Web com Java
 
Introdução à plataforma Android
Introdução à plataforma AndroidIntrodução à plataforma Android
Introdução à plataforma Android
 
instalação do phonegap(cordova) no windows 8.1
instalação do phonegap(cordova) no windows 8.1instalação do phonegap(cordova) no windows 8.1
instalação do phonegap(cordova) no windows 8.1
 
Apresentação Google Android
Apresentação Google AndroidApresentação Google Android
Apresentação Google Android
 
SESTINFO 2011 Apresentacao Android
SESTINFO 2011 Apresentacao AndroidSESTINFO 2011 Apresentacao Android
SESTINFO 2011 Apresentacao Android
 
Int305 projeto mono-final
Int305 projeto mono-finalInt305 projeto mono-final
Int305 projeto mono-final
 
Sistema Operacional Android
Sistema Operacional AndroidSistema Operacional Android
Sistema Operacional Android
 
Setup.docx
Setup.docxSetup.docx
Setup.docx
 
Introdução a Plataforma .NET 4.0
Introdução a Plataforma .NET 4.0Introdução a Plataforma .NET 4.0
Introdução a Plataforma .NET 4.0
 

Curso TotalCross: Introdução e Visão Geral da API

  • 1. 1
  • 2. 2 Curso TotalCrossCurso TotalCross Capítulo 1 – Introdução ao TotalCross Capítulo 2 - Visão Geral da API Capítulo 3 - Noções de Interface do Usuário Capítulo 4 - Sincronização
  • 3. 3 Capítulo 1 - Introdução aoCapítulo 1 - Introdução ao TotalCrossTotalCross Resumo 1.1 Introdução 1.2 Explorando o SDK 1.3 Configurando o Eclipse 1.4 Criando um Programa Mínimo 1.5 Executando como Aplicação 1.6 Fazendo o deploy
  • 4. 4 1.1 Introdução1.1 Introdução • Inteiramente desenvolvido no Brasil – Início em 2001 • Máquina virtual baseada em registradores – Requer um conversor de bytecodes para os tccodes – Não suporta o tipo float, apenas double • “Write Once Run Everywhere” real • Plataformas suportadas – Modernas: Android, iOS, Windows Phone 8.x – Legado: Windows Mobile 5 e 6 – Desktop: Windows XP - 8, JDK, Linux – Descontinuadas: Blackberry, Palm OS
  • 5. 5 1.2 Explorando o SDK1.2 Explorando o SDK • TotalCross3 – dist • samples • vm – docs • TotalCross Companion.pdf • html – etc • Programas usados pelo deployer – src • fontes java
  • 6. 6 1.3 Configurando o Eclipse1.3 Configurando o Eclipse • Criando um projeto TotalCross – Menu File / New / Java Project • Project name: AloMundo • Project layout: Create separate folders for sources and class files – Botão Next • Certificar que Default output folder é AloMundo/bin – Aba Libraries • Add external jar – TotalCross3/dist/tc.jar • Expandir o tc.jar (clique sinal +) – Source attachment / Edit / External Folder » TotalCross3/src – Finish
  • 7. 7 1.4 Criando um Programa Mínimo1.4 Criando um Programa Mínimo • A seguir, temos um programa que simplesmente mostra um botão, exibindo uma mensagem de saudação ao ser pressionado • Clicar com botão direito na pasta src – New / Class • Name: AloMundo • Superclass: totalcross.ui.MainWindow
  • 8. 8 Classe AloMundo 1 import totalcross.ui.*; import totalcross.ui.dialog.*; 2 import totalcross.ui.event.*; 3 public class AloMundo extends MainWindow 4 { 5 private Button btn; 6 7 public AloMundo() 8 { 9 super("Curso TotalCross", TAB_ONLY_BORDER); 10 setUIStyle(totalcross.sys.Settings.Android); 11 } 12 13 public void initUI() 14 { 15 add(btn = new Button("Olá!"), CENTER,CENTER); 16 } 17 18 public void onEvent(Event e) 19 { 10 if (e.type == ControlEvent.PRESSED && e.target == btn) 11 new MessageBox("Olá!", 12 "Bem vindo ao mundo da computação móvel!").popup(); 13 } 14 } 1.4 Criando um Programa Mínimo1.4 Criando um Programa Mínimo
  • 9. 9 1.5 Executando como Aplicação1.5 Executando como Aplicação • Menu Run / Run configurations ( ) • Clicar Java aplication / Botão direito / New • Aba Main – Name: AloMundo – Main class: totalcross.Launcher • Aba Arguments – Nome da classe principal (aquela que estende totalcross.ui.MainWindow) – Outros parâmetros para launcher. – Testar: • AloMundo • /scr android AloMundo • /scr 480x640x32 /fontsize 20 AloMundo
  • 10. 10 1.6 Fazendo o deploy1.6 Fazendo o deploy • Para executar a aplicação nos dispositivos, é preciso empacotá-las – Usa-se tc.Deploy, contido no tc.jar • Passa-se apenas o nome da classe principal – Informações são obtidas a partir do código fonte – As classes e mídias referenciadas são adicionadas automaticamente – O pacote correto é detectado automaticamente – Imagens bmp e gif são convertidas para PNG – Todos os arquivos são comprimidos • O empacotamento já chama o conversor e gera o arquivo de saída TCZ – TCZ = TotalCross Zip • Diretórios de instalação são gerados
  • 11. 11 1.6 Fazendo o deploy1.6 Fazendo o deploy • Tudo fica simples com um build.xml de ANT • Copiar o que está na pasta – TotalCross3/docs/build.xml … para a pasta do projeto – Clicar F5 para atualizar – Dar um clique-duplo no build.xml – Editar propriedades: • app.name = AloMundo • target.dir = bin – Salvar • Clicar botão direito em build.xml – Run as / Ant build
  • 12. 12 1.6 Fazendo o deploy1.6 Fazendo o deploy • Pastas criadas: – install • android: instalar apk usando adb.exe • iOS: instalar com iTunes • wp8: arquivo xap • win32: clique no .exe • wince: clicar no bat • applet: rodar um dos html no browser • linux: clique no executável
  • 13. 13 Capítulo 2 – Visão geral da APICapítulo 2 – Visão geral da API Resumo 2.1 Pacote totalcross.crypto 2.2 Pacote totalcross.db/sql 2.3 Pacote totalcross.io 2.4 Pacote totalcross.json 2.5 Pacote totalcross.lang 2.6 Pacote totalcross.map 2.7 Pacote totalcross.net 2.8 Pacote totalcross.phone 2.9 Pacote totalcross.sys 2.10 Pacote totalcross.unit 2.11 Pacote totalcross.util 2.12 Pacote totalcross.xml
  • 14. 14 2.1 Pacote totalcross.crypto2.1 Pacote totalcross.crypto • Classes usadas em criptografia – Cipher: AES, RSA – Digest: MD5, SHA1, SHA256 – Signature: PKCS1
  • 15. 15 2.2 Pacote totalcross.db/sql2.2 Pacote totalcross.db/sql • Pacote DB possui a implementação Java do SQLite – sqlite-jdbc • Banco de dados portável mais usado no mundo • Permite usar comandos SQL para manipular arquivos de dados • Poderoso, leve, baixo consumo de memória. • Pacote totalcross.sql posssui uma implementação parcial do JDBC para uso com o SQLite – SQLiteUtil util = new SQLiteUtil(Settings.appPath,"fb.db"); Statement st = util.con().createStatement(); st.execute("create table if not exists users (name varchar, photo blob, active int)");
  • 16. 16 2.3 Pacote totalcross.io2.3 Pacote totalcross.io • Classes usadas em entrada e saída – ByteArrayStream – DataStream – File • BufferedStream – LineReader – device.bluetooth – device.gps – device.printer – device.scanner • Windows CE • Android (ZXing)
  • 17. 17 2.4 Pacote totalcross.json2.4 Pacote totalcross.json • Porte da biblioteca json em Java
  • 18. 18 2.5 Pacote totalcross.lang2.5 Pacote totalcross.lang • Compatível até Java 7 – Possui suporte a reflection e generics – Não possui suporte a annotation • Subconjunto do java.lang – TotalCross: 49 classes – Java 7: 103 classes • Não se importa o totalcross.lang – É usado apenas no conversor
  • 19. 19 2.6 Pacote totalcross.map2.6 Pacote totalcross.map • Suporte ao GoogleMaps – iOS, android e windows phone • No android permite desenhar • Suporta também o Waze (iOS e android)
  • 20. 20 2.7 Pacote totalcross.net2.7 Pacote totalcross.net • Classes de conexão – Socket – FTP – HTTPStream – ServerSocket – mail (Pop3) – ssl
  • 21. 21 2.8 Pacote totalcross.phone2.8 Pacote totalcross.phone • Classes para manipulação de telefones – CellInfo – Dial – SMS • Somente WP8
  • 22. 22 2.9 Pacote totalcross.sys2.9 Pacote totalcross.sys • Classes utilitárias e de uso da VM – Convert – Setting – Time – Vm
  • 23. 23 2.10 Pacote totalcross.unit2.10 Pacote totalcross.unit • Classes para fazer teste unitário – TestCase – TestSuite – UIRobot
  • 24. 24 2.11 Pacote totalcross.util2.11 Pacote totalcross.util • Classes utilitárias – Date – Hashtable / Vector – IntHashtable / IntVector – Random – Collections – concurrent.Lock – BigDecimal / BigInteger – PDFWritter – Regex – Zip/ZLib/GZip
  • 25. 25 2.12 Pacote totalcross.xml2.12 Pacote totalcross.xml • Classes para manusear XML – XMLRPC com Axis – Soap – XmlTokenizer
  • 26. 26 Capítulo 3Capítulo 3 Noções de Interface do UsuárioNoções de Interface do Usuário Resumo 3.1 Introdução 3.2 Estilos de Interface 3.3 totalcross.ui.Control 3.4 totalcross.ui.Container 3.5 totalcross.ui.Window 3.6 totalcross.ui.MainWindow 3.7 Window x Container 3.8 Adicionando Controles 3.9 Tratando Eventos
  • 27. 27 3.1 Introdução3.1 Introdução • Controles totalmente feitos em Java – Facilidade de customização • Biblioteca rica em controles de interface com o usuário • Diversas características embutidas – controles multifuncionais • Suporte automático para rotação de tela • Leves – Funcionam bem em CPUs de baixo poder de processamento
  • 28. 28 3.1 Introdução3.1 Introdução Bar Button ButtonMenu Check ComboBox Edit Grid ImageControl ImageList Label ListBox Control Container AlignedLabelsContainer FlowContainer GridContainer ListContainer ScrollContainer TabbedContainer Window MainWindow Outros: RadioGroupController UIColors Insets MenuItem MultiEdit MultiListBox ProgressBar PushButtonGroup Radio Ruler Slider Spacer SpinList ToolTip Whiteboard Pacote totalcross.ui
  • 29. 29 3.1 Introdução3.1 Introdução .dialog MessageBox InputBox FileChooserBox TimeBox .chart ColumnChart LineChart PieChart Velocimeter XYChart Sub-pacotes de totalcross.ui .event ControlEvent / PressListener KeyEvent / KeyListener PenEvent / PenListener GridEvent / GridListener .gfx Color Graphics Coord Rect .font Font FontMetrics .image Image .tree Tree Node .media Camera MediaClip Sound
  • 30. 30 3.2 Estilos de Interface3.2 Estilos de Interface • Todos os controles da biblioteca implementam quatro tipos de interface – Flat, Vista, Android, Holo – Depreciados: PalmOS, WinCE • Vista é o padrão. Para mudar o estilo, faça no construtor da aplicação setUIStyle(totalcross.sys.estilo);
  • 31. 31 3.3 totalcross.ui.Control3.3 totalcross.ui.Control • Implicitamente estende java.lang.Object • Classe base de todos os controles de IU
  • 32. 32 3.4 totalcross.ui.Container3.4 totalcross.ui.Container • Estende totalcross.ui.Control • Serve como um local onde controles são adicionados • Pode possuir uma borda
  • 33. 33 3.5 totalcross.ui.Window3.5 totalcross.ui.Window • Estende totalcross.ui.Container • Funciona como uma janela popup modal • A janela pode ser arrastada pela tela • Pode possuir um título e/ou uma borda • Construtores: Window(), Window(título, tipoBorda) • Eventos gerados – ControlEvent.WINDOW_CLOSED
  • 34. 34 3.6 totalcross.ui.MainWindow3.6 totalcross.ui.MainWindow • Estende totalcross.ui.Window • Define a janela principal da aplicação – Só pode existir, por aplicação, uma classe que estenda MainWindow
  • 35. 35 3.7 Window x Container3.7 Window x Container • Window: deve ser usado quando apenas uma parte da tela for ocupada. • Container: deve ser usado quando toda a tela deve ser ocupada por controles. – initUI: inicializa a interface com o usuário • Nunca faça isso no construtor da classe! – Uma aplicação típica possui dezenas de classes que estendem Container. – Container exibido é ativado usando o método swapToTopmostWindow. • Jamais addicione uma Window a um Container – RuntimeException é disparada – Use popup para exibi-la
  • 36. 36 3.8 Adicionando Controles3.8 Adicionando Controles • Posicionamento relativo – Chave para gerar telas de interface com o usuário, portável entre plataformas e resoluções diferentes. Resoluções usuais: • Windows Phone: 768x1280, 1080x1920 • iOS: 640x1136, 1536x2048 • Android: 480x800, 1600x2560 – Cada controle sabe o seu tamanho ideal • Calculado com base em características (como bordas), estilo da interface do usuário, e na fonte escolhida para o controle – Permite um ajuste fino em pixels, caso necessário • Opcionalmente, ajuste pela altura da fonte
  • 37. 37 3.8 Adicionando Controles3.8 Adicionando Controles • Posicionamento relativo – Utiliza-se constantes para especificar a posição em relação • Ao último controle adicionado • A um controle qualquer especificado • Container parente (primeiro controle adicionado) – Constantes definidas na classe Control • X: BEFORE, CENTER, AFTER, LEFT, RIGHT, SAME, CENTER_OF, RIGHT_OF, KEEP, PARENTSIZE • Y: BEFORE, CENTER, AFTER, TOP, BOTTOM, SAME, CENTER_OF, BOTTOM_OF, KEEP, PARENTSIZE • Largura e Altura: PREFERRED, SAME, FILL, FIT, KEEP, WILL_RESIZE, SCREENSIZE, SCREENSIZEMIN, SCREENSIZEMAX, PARENTSIZE, PARENTSIZEMIN, PARENTSIZEMAX – Para efetuar um ajuste fino, some ou subtraia um valor da constante acima
  • 38. 38 3.8 Adicionando Controles3.8 Adicionando Controles Left Top Center Bottom Right
  • 39. 39 3.8 Adicionando Controles3.8 Adicionando Controles Before Before After After x y
  • 40. 40 3.8 Adicionando Controles3.8 Adicionando Controles Center_of Right_of Bottom_of Center_of x y
  • 41. 41 3.8 Adicionando Controles3.8 Adicionando Controles Fill Fit x y
  • 42. 42 3.8 Adicionando Controles3.8 Adicionando Controles • Métodos para adicionar e especificar o tamanho – Classe totalcross.ui.Control • setRect(x, y, largura, altura) • setRect(x, y, largura, altura, relativoA) – Classe totalcross.ui.Container • add(controle) • add(controle, x, y) – largura e altura = PREFERRED • add(controle, x, y, relativoA) – idem • add(controle, x, y, largura, altura) • add(controle, x, y, largura, altura, relativoA) – Características do controle, se não forem as padrões, devem ser modificadas antes de chamar os métodos acima.
  • 43. 43 3.9 Tratando Eventos3.9 Tratando Eventos • TotalCross possui dois modelos de tratamento: – JDK 1.02 (todos os eventos são enviados para um único método) • O método onEvent de cada controle é acionado, propagando-se para cima na hierarquia até a Window • Pode-se evitar que o evento continue a ser propagado marcando o flag consumed. – JDK 1.1+ (dispatch/listener) • implements XListener • addXListener
  • 44. 44 Capítulo 4 - SincronizaçãoCapítulo 4 - Sincronização Resumo 9.1 HttpStream 9.2 Webservices 9.3 JSon
  • 45. 45 4.1 Sincronização online - Preâmbulo • PessoaDB.getDadosSincronização public static String[][] getDadosSincronizacao() { RowIterator it = driver.getRowIterator("pessoa"); String[][] temp = new String[driver.getRowCount("pessoa")][]; String attrs[] = {"S","N","U","D"}; // synced,new,updated,deleted int j =0; while (it.nextNotSynced()) { String[] line = new String[8]; line[0] = attrs[it.attr]; line[1] = it.getString(1); line[2] = it.getDate(2).toString(); line[3] = Convert.toString(it.getDouble(3)); line[4] = it.getString(4); line[5] = Convert.toString(it.getShort(5)); line[6] = Convert.toString(it.getShort(6)); line[7] = Convert.toString(it.getInt(7)); temp[j++] = line; it.setSynced(); } String[][] ret = new String[j][]; Vm.arrayCopy(temp, 0, ret, 0, j); return ret; }
  • 46. 46 4.1 HttpStream • Exemplo para sincronizar com um ASP usando POST HttpStream.Options options = new HttpStream.Options(); options.doPost = true; // prepara os dados options.postData = dados; // conecta no servidor HttpStream hs = new HttpStream(new URI("http://www.totalcross.com/curso_sync.asp"), options); // pega a resposta for (String s; (s = hs.readLine()) != null; ) log(s,false); • curso_sync.asp <% Response.write("okn"); %>
  • 47. 47 4.24.2 Webservices • Utiliza-se a classe SOAP – Faz compressão automática dos dados (até 90%) – Funciona com servidores .Net e Java, dentre outros – Suporta o envio de tipos primitivos e objetos simples • Construtor: – SOAP(method, uri) • Principais métodos: – execute, getAnswer – setParam(param), setParam(param, nome) • param pode ser um destes tipos: boolean, boolean[], byte[], double, double[], int, int[], String, String[] • Atributos importantes: openTimeout, readTimeout, writeTimeout, debug
  • 48. 48 4.24.2 Webservices • Exemplo // prepara os dados SOAP s = new SOAP("sincroniza", "http://www.superwaba.net:8080/curso_sync/services/Web App"); String[] linhas = ...; s.setParam(linhas, "linhas"); s.execute(); // pega a resposta String ans = (String)s.getAnswer(); if (ans != null) log("Linhas processadas: "+ans);
  • 49. 49 4.24.2 Webservices • Webservice: public class WebApp { public int sincroniza(String[] linhas) { if (linhas == null) return -1; return linhas.length; } }