PBWOBundles1.m


max21 Unternehmensgruppe
#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
Foto