Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
Software
Programování na Macu - Aplikace pro kontrolu nové pošty (3)
27. prosince 2007, 09.00 | V tomto díle seriálu se blíže podíváme na práci s objektovou databází a na model
MVC (model-view-controller), jenž je základem aplikací s uživatelským rozhraním
založených na Cocoa.
Práce s objektovou databází
Nejprve si na stránce www.db4objects.com stáhněte databázi (verzi pro Javu). Přejmenujte .jar soubor pro Javu 5 na db4o.jar a přidejte jej do projektu stejně jako dříve obrázek pro ikonku. Poté jej přetáhněte do "Targets > Email Notifer > Copy Bundle Resources", aby byla tato knihovna přístupná pro spuštěný program.Vytvořme nyní třídu pro nastavení, jejíž instance bude uložena v databázi. Do záložky "Classes" přidejte soubor Preferences.java s tímto obsahem:
public class Preferences {
protected String host;
protected int port;
protected String userName;
protected String password;
public Preferences() {
host = "pop3.seznam.cz";
port = 110;
}
public String getHost() {
return host;
}
public int getPort() {
return port;
}
public String getUserName() {
return userName;
}
public void setUserName(String u) {
userName = u;
}
public String getPassword() {
return password;
}
public void setPassword(String p) {
password = p;
}
Dále upravte soubor JavaInterfaces.h:
@interface Test : NSObject
{}
- (void)write:(NSString*)msg;
@end
a AppController.h:
#import <Cocoa/Cocoa.h>
#import "JavaInterfaces.h"
@interface AppController : NSObject
{
NSStatusItem* statusItem;
Test* javaController;
}
- (NSMenu*)createMenu;
@end
Zde jsme nadeklarovali vlastnost javaController, která bude obsahovat instanci javovské třídy Test.
Do souboru AppController.m také přidáme kód:
#import "AppController.h"
@implementation AppController
- (void)awakeFromNib {
statusItem = [[[NSStatusBar systemStatusBar] statusItemWithLength: NSVariableStatusItemLength] retain];
[statusItem setHighlightMode: YES];
[statusItem setImage: [NSImage imageNamed: @"small"]];
[statusItem setMenu: [self createMenu]];
javaController = NSJavaObjectNamedInPath(@"Test", nil);
}
- (NSMenu*)createMenu {
NSMenu* menu = [[NSMenu alloc] initWithTitle: @"Email Notifier"];
NSMenuItem* item = [[NSMenuItem alloc] initWithTitle: @"Info..." action: @selector(about) keyEquivalent: @""];
[item setTarget: self];
[menu addItem: item];
[menu addItem: [NSMenuItem separatorItem]];
item = [[NSMenuItem alloc] initWithTitle: @"Quit" action: @selector(exit) keyEquivalent: @""];
[item setTarget: self];
[menu addItem: item];
return menu;
}
- (void)dealloc {
[statusItem release];
[javaController release];
[super dealloc];
}
- (void)about {
[NSApp activateIgnoringOtherApps: YES];
[NSApp orderFrontStandardAboutPanel: self];
}
- (void)exit {
[NSApp terminate: nil];
}
@end
Při spuštění aplikace vytvoříme novou instanci třídy Test a při rušení instance controlleru ji zase uvolníme.
Ještě upravíme soubor Test.java:
import com.db4o.*;
public class Test {
protected ObjectContainer db;
protected Preferences prefs;
public Test() {
db = Db4o.openFile("email_notifier.yap");
ObjectSet<Preferences> result = db.get(new Preferences());
if (result.size() > 0) {
prefs = result.get(0);
} else {
prefs = new Preferences();
db.set(prefs);
db.commit();
}
}
}
Metodu write už potřebovat nebudeme. Konstruktor třídy Test otevře objektovou databázi ze souboru email_notifier.yap. Pokud databáze neexistuje, je automaticky vytvořena. Dále se pokusíme získat objekt typu Preferences. Pokud existuje, je vše v pořádku a zapamatujeme si odkaz na něj. Pokud neexistuje, vytvoříme novou instanci a uložíme ji do databáze. Nesmíme zapomenout na commit, aby se změny zapsaly do databáze natrvalo.
Aby vám šel projekt zkompilovat, upravte ještě soubor Info.plist:
<key>NSJavaPath</key>
<array>
<string>JavaClasses.jar</string>
<string>db4o.jar</string>
</array>
Jak je vidět, je práce s objektovou databází velice jednoduchá. V dalším díle naimplementujeme ukládání preferencí.
Provázání ovládacích prvků a kódu
Přepněte se do Interface Builderu. V hlavním okně v záložce "Classes" klikněte na AppController a v inspektoru vytvořte dva nové outlety: userName a password (klikněte na tlačítko "Add" a zadejte jméno outletu).Dále klikněte na záložku "Actions" a vytvořte akce save a close.
Ještě musíme propojit controller s prvky uživatelského rozhraní. Klikněte na instanci AppController (modrá krychle), stiskněte Ctrl a táhněte myší na textové pole pro uživatelské jméno. V inspektoru vyberte outlet userName a klikněte na tlačítko "Connect". Stejným způsobem propojte outlet password s příslušným textovým polem a outlet prefsPanel s instancí okna.
Ještě zbývá rozšířit kód controlleru. Vraťte se do Xcode a upravte soubor AppController.h:
#import <Cocoa/Cocoa.h>
#import "JavaInterfaces.h"
@interface AppController : NSObject
{
NSStatusItem* statusItem;
Test* javaController;
IBOutlet NSSecureTextField *password;
IBOutlet NSPanel *prefsPanel;
IBOutlet NSTextField *userName;
}
- (NSMenu*)createMenu;
- (IBAction)save:(id)sender;
- (IBAction)close:(id)sender;
@end
Soubor AppController.m rozšíříme o dvě metody:
- (IBAction)save:(id)sender
{
}
- (IBAction)close:(id)sender
{
[prefsPanel close];
}
Metodu save si nadefinujeme později. Metoda close pošle instanci prefsPanel zprávu close, což způsobí zavření panelu preferencí. To si teď můžete vyzkoušet sami, klikněte na "Build and Go" a po spuštění aplikace na "Close".
Velkou část aplikace máme nyní hotovou a příště se konečně dostaneme ke stahování pošty.
Obsah seriálu (více o seriálu):
- Programování na Macu - Aplikace pro kontrolu nové pošty (1)
- Programování na Macu - Aplikace pro kontrolu nové pošty (2)
- Programování na Macu - Aplikace pro kontrolu nové pošty (3)
- Programování na Macu - Aplikace pro kontrolu nové pošty (4)
- Programování na Macu - Aplikace pro kontrolu nové pošty (5)