#import "Aprica.h"
// Aprica2
// copyright Pirmin Braun 1997-2007 - pirmin@pirmin.de
// all Rights reserved;
@implementation Home
ACCESSClassm(currentModul, setCurrentModul, PBWOBundle)
ACCESSm(currentBereich,setCurrentBereich)
ACCESSm(selectedBereich,setSelectedBereich)
ACCESSClassm(modulBereiche,setModulBereiche,NSArray);
- (Home *)init;
{ if(!(self = [super init]))return nil;
MD(moduleInBereich);
return self;
}
- (void)dealloc;
{ [moduleInBereich release];
[modulBereiche release];
[selectedBereich release];
[currentBereich release];
[currentModul release];
[super dealloc];
}
- (void)buildMenu;
{// Sortierung nur noch nach guiName innerhalb unterbereich; Bereich entfaellt;
// statt pos einfach Nr. vor guiName schreiben;
// Ralf will es jetzt wieder drinhaben
NSArray *a = [[_SESSION availableBundles] sortedArrayUsingKeyOrderArray:[NSArray soaADFrom:@"unterBereich,pos:an,guiNameTrans"]];
int i,j;
[moduleInBereich removeAllObjects];
for(i=0,j=[a count];i<j;i++){ NSMutableArray *mib;
PBWOBundle *b;
b=[a oai:i];
if([b hiddenModul])continue;
mib = [moduleInBereich ofk:[b unterBereich]];
if(!mib){ mib = [NSMutableArray arrayWithCapacity:20];
[moduleInBereich setObject:mib forKey:[b unterBereich]];
}
[mib addObject:b];
if([b kuerzel] && [[[_APP configDict]ofk:@"show_kuerzel"]iE:@"J"] && ![[b guiName]hasSecurePrefix:[NSSWF @"%@-",[b kuerzel]]]){ [b setGuiName:[NSSWF @"%@-%@",[b kuerzel],[b guiName]]];
[b setGuiName1:[NSSWF @"%@-%@",[b kuerzel],[b guiName1]]];
}
}
[self setModulBereiche:[[moduleInBereich allKeys]sortedArray]];
}
- (void)didSetUpWithBundle;
{ [self buildMenu];
[_APP executeScriptNamed:[NSSWF @"%@/didSetUpWithBundle",nameForScript] datasource:self parmDict:parmDict];
}
- (WOElement *)gotoModul;
{// bei Click auf ein Modul im hauptmenu
PBWOEditor *e=[_SESSION instanceForBundle:currentModul];
if(!e){ LOGI(TRANSLATION(@"keine Berechtigung"));
return self;
}
[self bringToFrontWithInitialSearch:e];
return self;
}
- (WOElement *)gotoBereich;
{// bei click auf einen Bereich im hauptmenue
[self setSelectedBereich:currentBereich];
return self;
}
- (NSMutableDictionary *)moduleInBereich;
{ return moduleInBereich;
}
- (NSArray *)moduleInSelectedBereich;
{ return [moduleInBereich ofk:selectedBereich];
}
- (BOOL)isSelectectedBereich;
{ return [currentBereich iE:selectedBereich];
}
@end
@implementation PasteboardEWO
- (BOOL)bookmark_ButtonIsDisabled;
{ return YES;
}
- (void)geheZu;
{ PBEO *eo;
PBWOEditor *e;
NSString *modul=nil,*eo_entityname=nil;
int i,j;
LMA;
PBSQLQualifier *q;
for(i=0,j=[selectedObjects count];i<j;i++){ eo = [selectedObjects oai:i];
if(!i){ modul = [eo vfk:@"modul"];
eo_entityname = [eo vfk:@"eo_entityname"];
}else{//schauen, dass sortenrein;
if(!([modul iE:[eo vfk:@"modul"]]))continue;
}
[lma addObject:[eo vfk:@"eo_pk"]];
}
if(![lma count])return;
q = [PBSQLQualifier orQualiFromArray:lma forDbName:[[MYDD tableNamed:eo_entityname]primaryKeyName]];
e=MODUL(modul);
if(!e){ LOGI(TRANSLATION(@"keine Berechtigung"));
return;
}
SUCH_EXTERNAL(e,q);
}
@end
/////////////////////////////////////////////////////////////////////////////////////////////
@implementation HelpdeskV3
ACCESSClassm(currentHelement,setCurrentHelement,PBEO);
ACCESSClassm(selectedHelement,setSelectedHelement,PBEO);
ACCESSClassm(suchenQ,setSuchenQ,PBSQLQualifier);
ACCESSm(currentPathS,setCurrentPathS)
ACCESSm(suchString,setSuchString);
ACCESSm(basePath,setBasePath);
- init;
{ if(!(self = [super init]))return nil;
MA(visibleHelements);
MA(currentHelements);
MA(currentPath);
MS(allLATeX);
soaForHelements = [[NSArray arrayWithObjects:[PBSortOrdering sortOrderingWithKey:@"pid" selector:@selector(compareHierarchie:)],[PBSortOrdering sortOrderingWithKey:@"sortierfolge" selector:@selector(compareNumeric:)],nil]retain];
return self;
}
- (PBSQLQualifier *)suchFelderQ;
{ LMA;
NSString *s;
NSArray *a = [@"(title,content)" propertyList];
int i,j;
PBSQLQualifier *q=nil;
if(FILLED(suchString) && ![suchString iE:@"*"]){ s = [suchString mysqlEscapedString];
for(i=0,j=[a count];i<j;i++){ q = [PBSQLQualifier qualifierWithString:[NSSWF @"%@ like '%%%@%%'",[a oai:i],s]];
[lma addObject:q];
}
if(![lma count])return nil;
[lma addObject:[PBSQLQualifier qualifierWithString:@"isfinal = 'N'"]]; //nicht final oder gemaess suchstring
return [PBSQLQualifier orQualifierWithArray:lma];
}else{ return nil;
}
}
- (WOElement *)reloadHelement;
{//auch als action verfuegbar "alles anzeigen"
[self setSuchenQ:nil];
[self setSuchString:EON];
[self setSelectedHelement:nil];
[self rebuildCurrentHelementsMitAnzahlErmitteln:YES update:NO]; //verwendet suchenQ
return self;
}
- (void)didSetUpWithBundle;
{ [self reloadHelement]; //lesen der helements, anzahl ermitteln nur im speicher
}
- (void)rebuildCurrentHelementsMitAnzahlErmitteln:(BOOL)anz update:(BOOL)update;
{//nach setupwithbundle und reloadhelement
//helements ermitteln, anzahl ermitteln jeweils, anzahl =0 ausfiltern, children feststellen, sortieren
int i;
PBEO *he;
[visibleHelements removeAllObjects];
[currentHelements removeAllObjects];
[currentHelements addObjectsFromArray:getEOsQ(@"helpdeskv3",suchenQ)]; //alle suchen, die matchen oder nicht final sind; damit kommen alle Hierarchie-Ebenen auf jeden Fall mit; solche mit 0 eintraegen werden dann ausgefiltert;
[currentHelements sortUsingKeyOrderArray:soaForHelements];
for(i=[currentHelements count]-1;i>=0;i--){ NSString *pe,*re;
he = [currentHelements oai:i];
if(![[he vfk:@"isfinal"]iE:@"J"]){ //final auf jeden fall rein [[he values] setObject:@"J" forKey:@"_hasChildren"]; //wenn kein final, dann children
if(anz){ // bei den anderen die Anzahl ermitteln und ob children vorhanden
//fuer das helement h die anzahl aller final-Elemente ermitteln, nachdem alle geladen wurden
int ii;
int anzahl = 0;
NSString *hek;
hek = [[he primaryKey]stringByAppendingString:@"."];
for(ii=(i+1);ii < [currentHelements count];ii++){ //muessen dahinter liegen PBEO *he1 = [currentHelements oai:ii];
if([[he1 vfk:@"isfinal"]iE:@"J"]){ NSString *he1k = [he1 primaryKey];
NSRange r = [he1k rangeOfString:hek];
if((r.length > 0) && (r.location == 0)){ //weil nach hierarchie aufsteigend sortiert, liegen children en bloc anzahl++;
}else{ break;
}
}
}
[he tvfk(NSS(anzahl),@"anzahl")];
if(update)UPDAT(he);
if(!anzahl){ [currentHelements removeObjectAtIndex:i];
continue;
}
}
}else{ [[he values] setObject:@"N" forKey:@"_hasChildren"];
}
[[he values] setObject:NSS([[[he primaryKey]componentsSeparatedByString:@"."]count]-1) forKey:@"_nesting"]; //einruecktiefe
[[he values] setObject:@"J" forKey:@"_collapsed"];
pe = [he vfk:@"parentelement"];
re = [he vfk:@"rootelement"];
if(FILLED(pe) && [pe iE:re]){ [visibleHelements addObject:he]; //die auf oberster Hierarchie sind sichtbar fuer den Anfang
}
[visibleHelements sortUsingKeyOrderArray:soaForHelements]; //sind sonst in umgekehrter Reihenfolge, da currentHelements von hinten nach vorne abgearbeitet wurden;
}
}
- (WOElement *)currentHelementActed;
{// beim click auf einen Hierarchie-Link
int cheIndex;
NSArray *a;
PBEO *candidate;
// first final suchen
candidate = currentHelement;
while([[candidate vfk:@"isfinal"]iE:@"N"]){ NSArray *a1 = [[self directChildrenOf:candidate]sortedArrayUsingKeyOrderArray:soaForHelements];
if([a1 count]==0)break;
candidate = [a1 firstObject];
}
[self setSelectedHelement:candidate];
[self rebuildCurrentPath];
//alles zufalten ausser denen im path
[self collapseAllExceptPath];
if(![self currentHelementIsCollapsed]){ //alles drunter weg int i,j;
a = [self allVisibleChildrenOf:currentHelement];
for(i=0,j=[a count];i<j;i++){ PBEO *eo = [a oai:i];
[[eo values] setObject:@"J" forKey:@"_collapsed"];
[visibleHelements removeObject:eo];
}
}
[[currentHelement values] setObject:@"N" forKey:@"_collapsed"]; //auf jeden fall auffalten
a = [[self directChildrenOf:currentHelement]sortedArrayUsingKeyOrderArray:soaForHelements]; //direct children drunter
cheIndex = [visibleHelements indexOfObject:currentHelement];
if(cheIndex == NSNotFound)cheIndex = [visibleHelements count]-1; //dann hinten anfuegen
[visibleHelements addObjects:a afterIndex:cheIndex];
return self;
}
- (WOElement *)currentHelementClick;
{//klick auf den collapse/expand button
NSArray *a;
int i,j;
PBEO *eo;
if([self currentHelementIsCollapsed]){ int cheIndex = [visibleHelements indexOfObject:currentHelement];
a = [self directChildrenOf:currentHelement];
[[currentHelement values] setObject:@"N" forKey:@"_collapsed"];
if(cheIndex == NSNotFound)cheIndex = [visibleHelements count]-1; //dann hinten anfuegen
[visibleHelements addObjects:a afterIndex:cheIndex];
}else{ a = [self allVisibleChildrenOf:currentHelement];
[[currentHelement values] setObject:@"J" forKey:@"_collapsed"];
for(i=0,j=[a count];i<j;i++){ eo = [a oai:i];
if(eo == selectedHelement){ [self setSelectedHelement:currentHelement];
[self rebuildCurrentPath];
}
[[eo values] setObject:@"J" forKey:@"_collapsed"];
[visibleHelements removeObject:eo];
}
}
return self;
}
- (NSArray *)directChildrenOf:(PBEO *)he;
{ int i,j;
PBEO *eo;
LMA;
NSString *s = [he primaryKey];
for(i=0,j=[currentHelements count];i<j;i++){ eo = [currentHelements oai:i];
if([s iE:[eo vfk:@"parentelement"]]){ [lma addObject:eo];
}
}
return lma;
}
- (BOOL)isSelectedHelement;
{ return (currentHelement == selectedHelement);
}
- (void)collapseAllExceptPath;
{ int i;
LMA;
NSString *selectedKey = [selectedHelement primaryKey];
[lma addObjectsFromArray:visibleHelements];
for(i=[visibleHelements count]-1;i>=0;i--){ PBEO *he = [visibleHelements oai:i];
NSString *key = [[he primaryKey]stringByAppendingString:@"."];
if(![selectedKey hasSecurePrefix:key]){ if([[he vfk:@"_collapsed"]iE:@"N"]){ NSArray *a = [self allVisibleChildrenOf:he];
int ii,jj;
for(ii=0,jj=[a count];ii<jj;ii++){ [lma removeObject:[a oai:ii]];
}
[[he values] setObject:@"J" forKey:@"_collapsed"];
}
}
}
[visibleHelements removeAllObjects];
[visibleHelements addObjectsFromArray:lma];
}
- (BOOL)currentHelementIsFinal;
{ return [[currentHelement vfk:@"isfinal"]iE:@"J"];
}
- (NSArray *)allVisibleChildrenOf:(PBEO *)he;
{ int i,j;
PBEO *eo;
LMA;
NSString *s = [[he primaryKey]stringByAppendingString:@"."];
for(i=0,j=[visibleHelements count];i<j;i++){ eo = [visibleHelements oai:i];
if(eo == he)continue;
if([[eo primaryKey]hasSecurePrefix:s]){ [lma addObject:eo];
}
}
return lma;
}
- (void)editSourceFile;
{// den fullpath oeffnen
NSString *fullpath = [[selectedHelement values]ofk:@"fullpath"];
if(FILLED(fullpath)){ NSString *sys = [NSSWF @"open \"%@\"",fullpath];
SYSTEM(sys);
}
}
- (NSString *)currentHelementClickSrc;
{ if([self currentHelementIsCollapsed]){ return [NSSWF @"/Aprica2_%@/Images/BuchZu.gif",[_APP mandant]];
}else{ return [NSSWF @"/Aprica2_%@/Images/BuchOffen.gif",[_APP mandant]];
}
}
- (NSString *)currentHelementClickAlt;
{ if([self currentHelementIsCollapsed]){ return TRANSLATION(@"aufklappen");
}else{ return TRANSLATION(@"zuklappen");
}
}
- (BOOL)currentHelementIsCollapsed;
{ return [[[currentHelement values]ofk:@"_collapsed"]iE:@"J"];
}
- (BOOL)currentHelementHasChildren;
{ return [[[currentHelement values]ofk:@"_hasChildren"]iE:@"J"];
}
- (void)rebuildCurrentPath;
{ PBEO *eo;
[currentPath removeAllObjects];
if(!selectedHelement)return;
[currentPath addObject:selectedHelement];
eo = selectedHelement;
while((eo=[eo dot:@"parentelement"])){ [currentPath insertObject:eo atIndex:0];
}
[self setCurrentPathS:[[currentPath valuesForKey:@"title"]componentsJoinedByString:@" -> "]];
[self didRebuildCurrentPath];
}
- (void)didRebuildCurrentPath;
{}
- (NSString *)section:(int)i;
{ switch(i){ case 0: return @"chapter";
case 1: return @"section";
case 2: return @"subsection";
case 3: return @"subsubsection";
}
return @"subsubsection";
}
- (void)createHelements3InParent:(PBEO *)parentEO directory:(NSString *)dir;
{ NSArray *a = [[myFM directoryContentsAtPath:dir]sortedArray];
int i,j;
LMA;
LMAN(latexma);
NSArray *a1;
int i1,j1;
NSString *gliederung,*peoGliederung;
int untergliederung = 0;
NSString *product = [[_APP configDict] ofk:@"product"];
NSString *targetPath = [NSSWF @"Aprica2_%@/Hilfe",[_APP mandant]];
if(!FILLED(product))product = @"Intars";
for(i=0,j=[a count];i<j;i++){ NSString *fn = [a oai:i];
NSString *completeFn = [dir stringByAppendingFormat:@"/%@",fn];
NSDictionary *fa = [myFM fileAttributesAtPath:completeFn traverseLink:NO];
if([[fa ofk:NSFileType]iE:NSFileTypeRegular] && [fn hasSecureSuffix:@".txt"] && ![fn hasSecurePrefix:@"_idee"]){ // BOOL addBR = NO;
BOOL inTT = NO;
BOOL inText = NO;
BOOL inOL = NO;
BOOL inUL = NO;
PBEO *eo = NEW_EO(@"helpdeskv3");
[eo tvfk(@"0",@"rootelement")];
[eo tvfk([parentEO primaryKey],@"parentelement")];
[eo tvfk([_APP titleFromFn:fn],@"title")]; //bis zum ersten Space abschneiden; dient der Sortierung
[eo tvfk(NSS(10 * i),@"sortierfolge")];
untergliederung+=1;
peoGliederung = [parentEO vfk:@"gliederung"];
if(FILLED(peoGliederung)){ gliederung = [NSSWF @"%@.%i",peoGliederung,untergliederung];
}else{ gliederung = [NSSWF @"%i",untergliederung];
}
[eo tvfk(gliederung,@"gliederung")];
#include "renderHTML.h"
[eo tvfk([lma componentsJoinedByString:@""],@"content")];
[eo tvfk(@"J",@"isfinal")];
[[eo values]setObject:completeFn forKey:@"fullpath"];
[_APP helementv3_genPrimKey:eo inParentEO:parentEO]; //f. Insert schon mal vorbreiten
INSRT(eo);
[allLATeX appendString:[NSSWF @"\n\\%@{%@}\n%@",[self section:gliederungsTiefe],[[eo vfk:@"title"]latexEscapedString],[latexma componentsJoinedByString:@"\n"]]]; continue;
}
if([[fa ofk:NSFileType]iE:NSFileTypeDirectory] && ![fn iE:@"Images"] && ![fn iE:@".svn"]){ PBEO *eo = NEW_EO(@"helpdeskv3");
[eo tvfk(@"0",@"rootelement")];
[eo tvfk([parentEO primaryKey],@"parentelement")];
[eo tvfk([_APP titleFromFn:fn],@"title")];
[eo tvfk(EON,@"content")];
[_APP helementv3_genPrimKey:eo inParentEO:parentEO]; //f. Insert schon mal vorbereiten
untergliederung+=1;
peoGliederung = [parentEO vfk:@"gliederung"];
if(FILLED(peoGliederung)){ gliederung = [NSSWF @"%@.%i",peoGliederung,untergliederung];
}else{ gliederung = [NSSWF @"%i",untergliederung];
}
[eo tvfk(gliederung,@"gliederung")];
INSRT(eo);
[allLATeX appendString:[NSSWF @"\n\\%@{%@}",[self section:gliederungsTiefe],[[eo vfk:@"title"]latexEscapedString]]]; gliederungsTiefe++;
[self createHelements3InParent:eo directory:completeFn];
gliederungsTiefe--;
}
}
}
- (WOElement *)importHelpdesk;
{ PBEO *he3;
mit_bild_fn = ([[[_APP configDict]ofk:@"mit_bild_fn"]iE:@"J"]);
[self setBasePath:[NSSWF @"%@/Hilfe",RESOURCEPATH]];
[allLATeX setString:[NSSWF [NSSWCOF [NSSWF @"%@/handbuch_template.tex",basePath]],basePath]];
SQL(@"delete from helpdeskv3");
he3 = NEW_EO(@"helpdeskv3");
[he3 tvfk(@"Aprica Online-Hilfe",@"title")];
[he3 tvfk(@"0",@"pid")];
[he3 tvfk(@"0",@"rootelement")];
INSRT(he3);
gliederungsTiefe = 0;
[self createHelements3InParent:he3 directory:basePath];
[allLATeX appendString:@"\\end{document}"]; [allLATeX writeToFileLatin1:[NSSWF @"%@/Handbuch.tex",basePath]];
return [self reloadHelement];
}
- (void)freiSuchen;
{ [self setSuchenQ:[self suchFelderQ]];
[self setSelectedHelement:nil];
[self rebuildCurrentHelementsMitAnzahlErmitteln:YES update:NO]; //lesen der helements, anzahl ermitteln nur im speicher
}
- (void)dealloc;
{ [currentHelement release];
[currentPath release];
[currentPathS release];
[currentHelements release];
[selectedHelement release];
[basePath release];
[suchString release];
[suchenQ release];
[soaForHelements release];
[visibleHelements release];
[super dealloc];
}
@end
@implementation LoginUser
ACCESSm(pw, setPw)
ACCESSm(loginName, setLoginName)
ACCESSm(info, setInfo)
ACCESSm(zielmodul, setZielmodul)
- (void)dealloc
{ [pw release];
[loginName release];
[zielmodul release];
[info release];
[super dealloc];
}
- init;
{ NSArray *a;
if(!(self = [super init]))return nil;
[self setInfo:EON];
[self setLoginName:nil];
[self setPw:nil];
[self setZielmodul:nil];
a=[[[[self context] request] headerForKey: @"accept-language"] componentsSeparatedByString:@","];
[_SESSION setLang:[_SESSION preferredLangForISOLanguages: a]];
return self;
}
- (void)prestarting;
{ NSArray *a = [[[_SESSION ueo] vfk:@"prestartingmod"]componentsSeparatedByString:@","];
int i,j;
LMA;
MODUL(@"Home"); // soll immer als erstes da sein
[lma addObjectsFromArray:[_SESSION errors]];
for(i=0,j=[a count];i<j;i++){ [MODUL([a oai:i]) performInitialSearch];
}
[_SESSION clearErrors];
[[_SESSION errors]addObjectsFromArray:lma];
}
- (PBWOEditor *)login;
{ PBEO *ueo;
NSString *s;
PBWOEditor *e;
[self setInfo:EON];
if(!FILLED(loginName)){ [self setInfo:TRANSLATION(@"Bitte Kennung eingeben.")];
return self;
}
//wird benoetigt f. datenbankzugriff
if ([_APP utf8db]) [[_APP freshChannel] evaluateSQL:@"set names utf8;"]; // Sicherheitshack
ueo = getEOPkValue(@"vid_benutzer",loginName);
if(!ueo){ NSString *qf = [NSSWF @"name = '%@'",loginName];
NSArray *a = getEOsQf(@"vid_benutzer",qf);
if([a count]>1){ [self setInfo:TRANSLATION(@"Name nicht eindeutig")];
return self;
}
if([a count]==0){ [self setInfo:TRANSLATION(@"Kennung falsch")];
return self;
}
ueo = [a firstObject];
}
s = [ueo vfk:@"loginallowed"];
if(![s iE:SC_BOOL_TRUE] && ![[ueo primaryKey]iE:@"Administrator"]){ [self setInfo:TRANSLATION(@"nicht fuer Anmeldung vorgesehen.")];
return self;
}
if(isInActive(ueo)){ [self setInfo:TRANSLATION(@"Sie sind gesperrt.")];
return self;
}
s = [ueo vfk:@"cryptedpw"];
if(!FILLED(pw)){ [self setInfo:TRANSLATION(@"Bitte Passwort eingeben.")];
return self;
}
// hier evt. andere Authentifizierungsmethode verwenden mit LDAP
if(![singleValueSQL(([NSSWF @"select md5('%@')",pw])) iE:s]){ [self setInfo:[NSSWF TRANSLATION(@"Passwort ungueltig.")]];
return self;
}
[_SESSION setLastLogin:[ueo vfk:@"lastlogin"]];
[ueo tvfk([_APP now],@"lastlogin")];
[ueo tvfk(NSS(0),@"pwfailcount")]; //erfolgreich angemeldet: failcount ruecksetzen
[ueo tvfk(NSS(([[ueo vfk:@"logins"]intValue]+1)),@"logins")];
UPDAT(ueo);
[_SESSION initWithUserEO:ueo];
[self prestarting];
//freie zielmodul-Wahl
if(FILLED(zielmodul)){ e = MODUL(zielmodul);
if(e){ [self bringToFront:e];
return e;
}else{ [self setInfo:TRANSLATION(@"Keine Berechtigung fuer angefordertes Modul.")];
return self;
}
}
//nichts bekannt, dann Start-Modul
return [self gotoStart];
}
@end
@implementation PBWOBundleDoku
- init;
{ if(!(self = [super init]))return nil;
MA(felder);
MA(buttons);
return self;
}
- (NSString *)bundleGuiName;
{ return [callingModul guiName];
}
- (void)loadCustomDoku;
{// wird vom rufenden Modul aufgerufen
int i,j;
NSArray *attributes = [[[callingModul myTable] plainAttributes]sortedArrayUsingSelector:@selector(compareGui:)];
[felder removeAllObjects];
[buttons removeAllObjects];
for(i=0,j=[attributes count];i<j;i++){ PBDDAttribute *pba = [attributes oai:i];
if([pba targetTyp] == ATBU){ [buttons addObject:pba];
}else{ [felder addObject:pba];
}
}
}
- (PBDDAttribute *)currentAttribute;
{ return currentAttribute;
}
- (NSString *)currentAttributeDoku;
{ return [currentAttribute dokuForLang:[_SESSION lang]];
}
- (BOOL)currentAttributeDokuFilled;
{ return FILLED([self currentAttributeDoku]);
}
- (NSString *)currentAttributeGuiName;
{ return [currentAttribute guiNameForLang:[_SESSION lang]];
}
- (void)dealloc;
{ [felder release];
[buttons release];
[super dealloc];
}
- (void)zurueck;
{ [self bringToFront:callingModul];
[self setCallingModul:nil];
}
@end