860 likes | 967 Views
Nyílt Fejlesztőrendszerek JFace. SWT vs. JFace. SWT natív Alacsony szintű elemkészlet Jól kézben tartható működés Sok kódolás JFace Magas szintű komponensek (SWT-re épít) Jobban automatizált Strukturáltabb szerkezet Könnyebb újrafelhasználás Kevésbé kézben tartható. SWT Hello World.
E N D
SWT vs. JFace • SWT • natív • Alacsony szintű elemkészlet • Jól kézben tartható működés • Sok kódolás • JFace • Magas szintű komponensek (SWT-re épít) • Jobban automatizált • Strukturáltabb szerkezet • Könnyebb újrafelhasználás • Kevésbé kézben tartható
SWT Hello World 1 import org.eclipse.swt.*; 2 import org.eclipse.swt.graphics.*; 3 import org.eclipse.swt.widgets.*; 4 public class HelloWorld{ 5 public static void main(String[] args) { 6 Display display = new Display(); 7 Shell shell = new Shell(display); 8 shell.setText("Hello, World!"); 9 shell.setSize(200, 100); 10 shell.open (); 11 while (!shell.isDisposed()) { 12 if (!display.readAndDispatch()) 13 display.sleep (); 14 } 15 display.dispose (); 16 } 17}
JFace Hello World public class MyApp extends ApplicationWindow { public MyApp() { super(null); } protected Control createContents(Composite parent) { Text helloText = new Text(parent, SWT.CENTER); helloText.setText("Hello JFace world!"); parent.pack(); return parent; } public static void main(String[] args){ MyApp p = new MyApp(); p.setBlockOnOpen(true); p.open(); Display.getCurrent().dispose(); } }
JFace Hello World public class MyApp extends ApplicationWindow { public MyApp() { super(null); } protected Control createContents(Composite parent) { Text helloText = new Text(parent, SWT.CENTER); helloText.setText("Hello JFace world!"); parent.pack(); return parent; } public static void main(String[] args){ MyApp p = new MyApp(); p.setBlockOnOpen(true); p.open(); Display.getCurrent().dispose(); } } ApplicationWindow Alkalmazás-ablak objektum Menu, tooolbar, … kezelése
JFace Hello World public class MyApp extends ApplicationWindow { public MyApp() { super(null); } protected Control createContents(Composite parent) { Text helloText = new Text(parent, SWT.CENTER); helloText.setText("Hello JFace world!"); parent.pack(); return parent; } public static void main(String[] args){ MyApp p = new MyApp(); p.setBlockOnOpen(true); p.open(); Display.getCurrent().dispose(); } } Elemek létrehozása (override)
JFace Hello World public class MyApp extends ApplicationWindow { public MyApp() { super(null); } protected Control createContents(Composite parent) { Text helloText = new Text(parent, SWT.CENTER); helloText.setText("Hello JFace world!"); parent.pack(); return parent; } public static void main(String[] args){ MyApp p = new MyApp(); p.setBlockOnOpen(true); p.open(); Display.getCurrent().dispose(); } } Blokkoló open()
JFace Hello World public class MyApp extends ApplicationWindow { public MyApp() { super(null); } protected Control createContents(Composite parent) { Text helloText = new Text(parent, SWT.CENTER); helloText.setText("Hello JFace world!"); parent.pack(); return parent; } public static void main(String[] args){ MyApp p = new MyApp(); p.setBlockOnOpen(true); p.open(); Display.getCurrent().dispose(); } } Mindenki a Display gyereke, elég ezt törölni
Eseménykezelés • Event-Listener modell helyett • Action-contribution modell • Absztraktabb modell • Több eseményforrás egységes, központi feldolgozása (pl. ablak bezárása több helyről) • 3 alapvetés • A felhasználói akciók gombokat, menüket, toolbarokat érintenek • Minden komponenshez egy eseményt rendelünk • Minden eseményhez egy kezelő lesz
Eseménykezelés • Event-Listener modell helyett • Action-contribution modell • Absztraktabb modell • Több eseményforrás egységes, központi feldolgozása (pl. ablak bezárása több helyről) • 3 alapvetés • A felhasználói akciók gombokat, menüket, toolbarokat érintenek • Minden komponenshez egy eseményt rendelünk • Minden eseményhez egy kezelő lesz
Akciók • Hasonló az event-ekhez • A Display elkapja az OS eseményt, a window Action-né alakítja • A Contribution-hoz kerül, mely meghívja az akció run() metódusát
Contribution • ContributionItem • Akciót eredményező GUI elem • ActionContributionItem • Nincs konkrét megjelenés, a fill() kitöltésétől függ • Ezt használjuk a leggyakrabban
Contribution • ContributionManager • Item-eket fogadó konténer elem • Menu menedzser • Toolbar menedzser
Példa: Action public class MyAction extends Action { StatusLineManager smanager; int trigger = 0; public MyAction(StatusLineManager sm){ super("&Click",AS_PUSH_BUTTON); smanager= sm; setToolTipText("Klikk ide!"); } public void run() { trigger++; smanager.setMessage(trigger+" alkalommal kattintottál."); } }
Példa: Action public class MyAction extends Action { StatusLineManager smanager; int trigger = 0; public MyAction(StatusLineManager sm){ super("&Click",AS_PUSH_BUTTON); smanager= sm; setToolTipText("Klikk ide!"); } public void run() { trigger++; smanager.setMessage(trigger+" alkalommal kattintottál."); } } Az Action osztályból örököltetjük
Példa: Action public class MyAction extends Action { StatusLineManager smanager; int trigger = 0; public MyAction(StatusLineManager sm){ super("&Click",AS_PUSH_BUTTON); smanager= sm; setToolTipText("Klikk ide!"); } public void run() { trigger++; smanager.setMessage(trigger+" alkalommal kattintottál."); } } Megadjuk a szöveget és a kontroll stílusát
Példa: Action public class MyAction extends Action { StatusLineManager smanager; int trigger = 0; public MyAction(StatusLineManager sm){ super("&Click",AS_PUSH_BUTTON); smanager= sm; setToolTipText("Klikk ide!"); } public void run() { trigger++; smanager.setMessage(trigger+" alkalommal kattintottál."); } } Tooltip is megadható (mindenhol érv.)
Példa: Action public class MyAction extends Action { StatusLineManager smanager; int trigger = 0; public MyAction(StatusLineManager sm){ super("&Click",AS_PUSH_BUTTON); smanager= sm; setToolTipText("Klikk ide!"); } public void run() { trigger++; smanager.setMessage(trigger+" alkalommal kattintottál."); } } Az akció végrehajtása
Példa: Action felhasználása public class MyApp extends ApplicationWindow { public MyApp(){ super(null); addStatusLine(); addMenuBar(); addToolBar(SWT.FLAT | SWT.WRAP); } StatusLineManager sline = new StatusLineManager(); MyAction act = new MyAction(sline); ActionContributionItem aci = new ActionContributionItem(act); protected Control createContents(Composite parent) { getShell().setText("Action example"); aci.fill(parent); parent.pack(); return parent;}
Példa: Action felhasználása public class MyApp extends ApplicationWindow { public MyApp(){ super(null); addStatusLine(); addMenuBar(); addToolBar(SWT.FLAT | SWT.WRAP); } StatusLineManager sline = new StatusLineManager(); MyAction act = new MyAction(sline); ActionContributionItem aci = new ActionContributionItem(act); protected Control createContents(Composite parent) { getShell().setText("Action example"); aci.fill(parent); parent.pack(); return parent;} Létrehozunk egy Action példányt
Példa: Action felhasználása public class MyApp extends ApplicationWindow { public MyApp(){ super(null); addStatusLine(); addMenuBar(); addToolBar(SWT.FLAT | SWT.WRAP); } StatusLineManager sline = new StatusLineManager(); MyAction act = new MyAction(sline); ActionContributionItem aci = new ActionContributionItem(act); protected Control createContents(Composite parent) { getShell().setText("Action example"); aci.fill(parent); parent.pack(); return parent;} Az ablakra dobjuk az akciót
Példa: Action felhasználása folyt. protected MenuManager createMenuManager() { MenuManager main_menu = new MenuManager(null); MenuManager action_menu = new MenuManager("Menu"); main_menu.add(action_menu); action_menu.add(act); return main_menu; } protected ToolBarManager createToolBarManager(int style) { ToolBarManager tool_bar_manager = new ToolBarManager(style); tool_bar_manager.add(act); return tool_bar_manager; } protected StatusLineManager createStatusLineManager() { return sline; }
Példa: Action felhasználása folyt. protected MenuManager createMenuManager() { MenuManager main_menu = new MenuManager(null); MenuManager action_menu = new MenuManager("Menu"); main_menu.add(action_menu); action_menu.add(act); return main_menu; } protected ToolBarManager createToolBarManager(int style) { ToolBarManager tool_bar_manager = new ToolBarManager(style); tool_bar_manager.add(act); return tool_bar_manager; } protected StatusLineManager createStatusLineManager() { return sline; } Egy menüt hozunk létre, amibe szintén beledobjuk az Action-t
Példa: Action felhasználása folyt. protected MenuManager createMenuManager() { MenuManager main_menu = new MenuManager(null); MenuManager action_menu = new MenuManager("Menu"); main_menu.add(action_menu); action_menu.add(act); return main_menu; } protected ToolBarManager createToolBarManager(int style) { ToolBarManager tool_bar_manager = new ToolBarManager(style); tool_bar_manager.add(act); return tool_bar_manager; } protected StatusLineManager createStatusLineManager() { return sline; } Hozzáadjuk egy toolbar-hoz is
Action-Contribution • Az akciók és contribution-ök összekötése • A contrib. Manager add() függvénye • add(ActionContributionItem) – explicit item-ként való hozzáadás - csak egyszer! • add(Action) – akció implicit hozzáadása – többször is lehet! • Az Action fill() függvénye segíségével • fill(Composite) – dialógus elem lesz • fill(MenuManager, int) – menü elem lesz (adott pozícióban • fill(ToolBarManager, int) – toolbar elem lesz (Adott pozícióban)
Action – további jellemzők • Alapvető függvények • setText(), setImage(), setTooltipText(), setDescription(), setEnabled()… • Checkbox, radio esetén • setChecked(), isChecked() • Gyorsbilentyűk • setAccelerator(), getAccelerator(), …
Szövegkezelés JFace-szel • IDocument • A szerkesztés alatt álló dokumentum tartalma • A tartalom változásról értesítés kérhető • Position – egy hely megjelölése • Kezdőérték + hossz • Ha a szöveget szerkesztik, automatikusan „követi” a jelölt részt • Partition content-type • A szöveg egyes részei más-más típusúak lehetnek
Szövegkezelés JFace-szel • IDocument • Keresés • Irány • Kezdőpont • case sensitivity, …
Szövegkezelés JFace-szel • ITextViewer • Dokumentum-alapú szöveg komponens • Események • Tartalom változás • Viewport (látható régió) változás • Plugin lehetőségek • IUndoManager – undo/redo kezelés • IDoubleClickStrategy – duplakatt kezelés • IAutoIdentStrategy – automatikus behúzás • ITextHover – ha az egér megáll a szövegen
Szövegkezelés JFace-szel • ITextViewer kiegészítések • org.eclipse.jface.text.contentassist • Automatikus szöveg-kiegészítés • org.eclipse.jface.text.formatter • Automatikus formázás (syntax highlight) • org.eclipse.jface.text.presentation • Változás esetén • org.eclipse.jface.text.source • Vizuális markerek elhelyezése • …
ToolBarManager • JFace elem • Action-öket fogadhat • ToolBar és ToolItem segíségével működik • ControlContribution – új! • Bármilyen kontrollt feltehetünk • Ebben az esetben Action helyett event/listener modell van!
MenuManager • JFace elem • Action-öket fogadhat • Belül Menu és MenuItem példányok vannak • SWT MenuBar-ba is berakható (fill) • new MenuManager(„File) • MenuManager.add(Action) • MenuManager.fill(Control) • Ha hozzáadtuk egy kontrollhoz, többet ne adjuk hozzá máshoz!
Viewer framework • Többféle widget egységes kezelése • MVC pattern • Model: ContentProvider, LabelProvider • View : Viewer • Controller: Listeners • Magasabb szintre emeli az SWT Table, Tree, List elemeit
Viewer framework • Label provider • getText() • getImage() • isLabelProperty() • Érinti-e a label-t az adott tulajdonság megváltozása? • Alap megvalósítás • A benne lévő elemek toString() metódusával működik
Viewer framework • Content provider • A megjelenítendő elemeket adja meg • getElements() • Nem kötelező használni • Az elemeket hozzáadhatjuk az add metódussal a viewerhez • inputChanged(Viewe, Object, Object) a root objektum megváltozott
Viewer framework • Listener-ek • Függ a viewer típusától • TreeView • ItemSelection • Fa események • StructuredViewer • doubleClick
Viewer framework • Sorter-ek • Elemek rendezése megjelenítés előtt • category() • Elemek kategóriákba sorolása • compare() • Két elem összehasonlítása • Filter • Elemek leválogatása, szelektálása • select() • Meg kell-e jeleníteni egy adott elemet
Viewer framework • TreeViewer • ITreeContentProvider-alapú • A megjelenítendő elemeket adja meg • getChildren() – adott elem gyerekeinek megjelenítése • hasChildren() – vannak-e gyerekei? • Ha lassú kiszámolni, mindig legyen true • getParent() – szülő visszaadása
Viewer framework • ListViewer • Elemek listájának megjelenítésére • IStructuredContentProvider • A megjelenítendő elemeket adja meg • getElements() – a lista elemeit adja vissza • Minden egyéb elem használható • Sorter • Filter • Label provider
Viewer framework • Kiválasztott elemek • IStructuredSelection • Az elemeknek kötött sorrendje van • Biztosít egy iterator-t, hogy végig lépkedhessünk rajtuk
Viewer framework • TableViewer • Táblázat magasabb szinten • TableLayout – a tábla oszlopainak elrendezése • addColumnData() • A mögötte lévő Table elérhető • getTable() • ITableLabelProvider • Adott sor és oszlop tartalmát adja meg
Viewer framework • Táblázatok szerkesztése • CellEditor • ICellModifier • Érték elővétele az objektumból – getValue() • A szerkeszthetőség eldöntése – canModify() • Új érték beírása – modify() • CellEditor • Beépített: Checkbox, Combo box, pop-up dialog, text
JFace dialógusok • MessageDialog • Üzenetek megjelenítése • ErrorDialog • Hibaüzenetek megjelenítése • IStatus – a hiba súlyosságának megadása, üzenet, exception megadása • InputDialog • Egyszerű szöveg bevitelére • IInputValidator – a bevitt szöveg érvényesítése
JFace dialógusok • ProgressDialog • Háttérben futó munka állapotának megjelenítése
Varázslók • 3 szintű hierarchia • WizardContainer – varázslókat tartalmaz • Wizard – oldalakat tartalmaz • canFinish() • performCancel(), performFinish() • createPageControls() • WizardPage – elemeket tartalmaz • getName() • getNextPage(), getPreviousPage() • isPageComplete() • canFlipToNextpage()
DialogSettings • Dialógus beállításainak megőrzése • DialogSettings(String) • put(String, Object) • save(String) • load(String) • get(String) • get*(String)
JFace összefoglalás • Komplex komponensek • Sok automatizmus • Összetett grafikus felületek tervezésére • Akciók • View framework • Dialógusok • Varázslók • GUI állapot mentése
Plug-in fejlesztés • Contribution rule • „everything is a contribution” • Az Eclipse keretrendszer minden eleme egy plug-in • Nincsenek „bevasalt” elemek • Sok plug-in (kb. 60 nagyobb az alap SDK-ban) • Még több lehetséges bővítés (pl. WSAD kb. 500 plug-in)