Ordner.m


max21 Unternehmensgruppe
#import "Aprica.h"
//	Aprica2
//	copyright Pirmin Braun 1997-2007 - pirmin@pirmin.de
//	all Rights reserved;
@implementation Ordner
ACCESSClassm(currentHelement,setCurrentHelement,PBEO);
ACCESSClassm(selectedHelement,setSelectedHelement,PBEO);
ACCESSClassm(pasteElement,setPasteElement,PBEO);
ACCESSm(currentPathS,setCurrentPathS)
ACCESSm(basePath,setBasePath);
ACCESSm(ordnerName,setOrdnerName);
- init;
{
    if(!(self = [super init]))return nil;
    MA(visibleHelements);
    MA(currentPath);
    soaForHelements = [[NSArray soaFrom:@"title"]retain];
    return self;
}
- (void)didSetUpWithBundle;
{
    [self rebuildCurrentHelements]; //lesen der ordner, anzahl ermitteln nur im speicher
}
- (void)expandElement:(PBEO *)he;
{
    int cheIndex;
    LMA;
    NSArray *a;
    NSString *nesting = NSS([[he vfk:@"_nesting"]intValue]+1);
    int i,j;
    [he tvfk(@"N",@"_collapsed")];
    a = getEOsQSoa(@"ordner",([PBSQLQualifier qualifierWithString:[NSSWF @"parentelement = '%@'",[he primaryKey]]]),soaForHelements);
    for(i=0,j=[a count];i<j;i++){
        PBEO *eo = [a oai:i];
        if(![eo iE:pasteElement]){
	// ausgeschnittenes Element nicht mehr zeigen
            [lma addObject:eo];
            [eo tvfk(nesting,@"_nesting")];
            [eo tvfk(@"J",@"_collapsed")];
        }
    }
    cheIndex = [visibleHelements indexOfObject:he];
    if(cheIndex == NSNotFound)cheIndex = [visibleHelements count]-1; //dann hinten anfuegen
    [visibleHelements addObjects:lma afterIndex:cheIndex];
}
- (void)rebuildCurrentHelements;
{
//nach setupwithbundle
//ordner ermitteln, anzahl ermitteln jeweils, anzahl =0 ausfiltern, children feststellen, sortieren
    PBEO *eo;
    [visibleHelements removeAllObjects];
    eo = getEOQf(@"ordner",@"isroot = 'J'");
    if(!eo){
        eo = NEW_EO(@"ordner");
        [eo tvfk(@"alle Ordner",@"title")];
        [eo tvfk(@"J",@"isroot")];
        INSRT(eo);
    }
    [eo tvfk(@"J",@"_collapsed")];
    [eo tvfk(@"0",@"_nesting")];
    [visibleHelements addObject:eo];
    [self setSelectedHelement:eo];
    [self rebuildCurrentPath];
    [self expandElement:eo];
}
- (void)gotoElementWithKey:(NSString *)pid;
{
// Pfadelemente besorgen in Array, dann sukzessive aufklappen
    PBEO *eo = getEOPkValue(@"ordner",pid);
    LMA;
    int i,j;
    if(!eo)return;
    [lma addObject:[eo vfk:@"pid"]];
    eo =  getEOPkValue(@"ordner",[eo vfk:@"parentelement"]);
    while(eo){
        [lma insertObject:[eo vfk:@"pid"] atIndex:0];
        eo =  getEOPkValue(@"ordner",[eo vfk:@"parentelement"]);
    }
    [self rebuildCurrentHelements];
    for(i=0,j=[lma count];i<j;i++){
        NSString *s = [lma oai:i];
	int ii,jj;
        for(ii=0,jj=[visibleHelements count];ii<jj;ii++){
            eo = [visibleHelements oai:ii];
            if([[eo vfk:@"pid"]iE:s]){
                [self expandElement:eo];
                break;
            }
        }
    }
    [self setSelectedHelement:eo];
    [self rebuildCurrentPath];
}
- (WOElement *)currentHelementActed;
{
// beim click auf einen Hierarchie-Link: selektieren, Pfad neu aufbauen, erste Ebene darunter auffalten
    [self setSelectedHelement:currentHelement];
    [self rebuildCurrentPath];
    if([self currentHelementIsCollapsed]){
        [self expandElement:currentHelement];
    }
    return self;
}
- (void)removeChildrenOf:(PBEO *)he;
{
    int i;
    int cheIndex = [visibleHelements indexOfObject:he];
    if(cheIndex == NSNotFound)return;
    i = cheIndex + 1;
    while(i < [visibleHelements count]){
        PBEO *eo = [visibleHelements oai:i];
        if([[eo vfk:@"parentelement"]iE:[he primaryKey]]){
            [self removeChildrenOf:eo];
            if(eo == selectedHelement){
                [self setSelectedHelement:nil];
                [self rebuildCurrentPath];
            }
            [visibleHelements removeObjectAtIndex:i];
        }else{
            return;
        }
    }
}
- (void)deleteChildrenOf:(PBEO *)he;
{
    NSArray *a = getEOsQf(@"ordner",([NSSWF @"parentelement = '%@'",[he primaryKey]]));
    int i,j;
    for(i=0,j=[a count];i<j;i++){
        PBEO *eo = [a oai:i];
        [self deleteChildrenOf:eo];
        DELET(eo);
        singleValueSQL(([NSSWF @"delete from zuordordner where ordner = '%@'",[eo primaryKey]]));
    }
}
- (void)currentHelementClick;
{
//klick auf den collapse/expand button: nur Hierarche auf/zufalten
    if([self currentHelementIsCollapsed]){
        [self expandElement:currentHelement];
    }else{
// alle Children rekursiv rausnehmen aus Array
        [self removeChildrenOf:currentHelement];
        [currentHelement tvfk(@"J",@"_collapsed")];
    }
}
- (BOOL)isSelectedHelement;
{
    return (currentHelement == selectedHelement);
}
- (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 vfk:@"_collapsed"]iE:@"J"];
}
- (void)rebuildCurrentPath;
{
    [self didRebuildCurrentPath];
}
- (void)didRebuildCurrentPath;
{
// hier den Inhalt aufblenden
    if(selectedHelement){
        [self setStaticQ:[PBSQLQualifier qualifierWithString:[NSSWF @"ordner = '%@'",[selectedHelement primaryKey]]]];
    }else{
        [self setStaticQ:[PBSQLQualifier nothingQualifier]];
    }
    [self suchInternalQ:nil];
    [_SESSION clearErrors];
}
- (void)createHelements3InParent:(PBEO *)parentEO directory:(NSString *)dir;
{
// Directory einlesen und Ordner entsprechend der Directory-Struktur anlegen
// fuer spaeter
// Files dann als Dokumente anlegen und zuordnen
    NSArray *a = [[myFM directoryContentsAtPath:dir]sortedArray];
    int i,j;
    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];
        PBEO *eo;
        if([[fa ofk:NSFileType]iE:NSFileTypeDirectory]){
            if([fn iE:@".svn"])continue;
            eo = NEW_EO(@"ordner");
            [eo tvfk([parentEO primaryKey],@"parentelement")];
            [eo tvfk([_APP titleFromFn:fn],@"title")]; //bis zum ersten Space abschneiden; dient der Sortierung
            INSRT(eo);
            [self createHelements3InParent:eo directory:completeFn];
        }else{
            // fuer File ein Dokument erstellen, zuodordner zu parentEO...
        }
    }
}
- (void)umbenennen;
{
    if(!FILLED(ordnerName)){
        LOGI(@"Bitte Name angeben.");
        return;
    }
    if(!selectedHelement){
        LOGI(@"Bitte einen Ordner auswaehlen.");
        return;
    }
    [selectedHelement tvfk(ordnerName,@"title")];
    UPDAT(selectedHelement);
    return;
}
- (void)neuerUnterordner;
{
    PBEO *eo;
    int cheIndex;
    if(!FILLED(ordnerName)){
        LOGI(@"Bitte Name angeben.");
        return;
    }
    if(!selectedHelement){
        LOGI(@"Bitte einen Ordner auswaehlen.");
        return;
    }
    eo = NEW_EO(@"ordner");
    [eo tvfk([selectedHelement primaryKey],@"parentelement")];
    [eo tvfk(ordnerName,@"title")];
    INSRT(eo);
    [eo tvfk(NSS([[selectedHelement vfk:@"_nesting"]intValue]+1),@"_nesting")];
    if([[selectedHelement vfk:@"_collapsed"]iE:@"N"]){
        cheIndex = [visibleHelements indexOfObject:selectedHelement];
        if(cheIndex == NSNotFound){
            [visibleHelements addObject:eo];
            return;
        }
        if(cheIndex >= ([visibleHelements count] -1)){
            [visibleHelements addObject:eo];
            return;
        }
        [visibleHelements insertObject:eo atIndex:cheIndex + 1];
    }
}
- (void)ordnerLoeschen;
{
    int cheIndex;
    if(!selectedHelement){
        LOGI(@"Bitte einen Ordner auswaehlen.");
        return;
    }
    if([[selectedHelement vfk:@"isroot"]iE:@"J"]){
        LOGI(@"das ist das root-Element und kann nicht geloescht werden.");
        return;
    }
    [self removeChildrenOf:selectedHelement];
    [self deleteChildrenOf:selectedHelement];
    cheIndex = [visibleHelements indexOfObject:selectedHelement];
    if(cheIndex == NSNotFound){
        return;
    }
    [visibleHelements removeObjectAtIndex:cheIndex];
    DELET(selectedHelement);
    singleValueSQL(([NSSWF @"delete from zuordordner where ordner = '%@'",[selectedHelement primaryKey]]));
    if(cheIndex > 0){
        [self setSelectedHelement:[visibleHelements oai:cheIndex - 1]];
    }else{
        [self setSelectedHelement:nil];
    }
    [self rebuildCurrentPath];
}
- (void)ordnerAusschneiden;
{
    int cheIndex;
// ins pasteElement; falls schon eines drin ist, nicht zulassen
    if(!selectedHelement){
        LOGI(@"Bitte einen Ordner auswaehlen.");
        return;
    }
    if([[selectedHelement vfk:@"isroot"]iE:@"J"]){
        LOGI(@"das ist das root-Element und kann nicht ausgeschnitten werden.");
        return;
    }
    if(pasteElement){
        LOGI(@"bereits ein Ordner ausgeschnitten");
        return;
    }
    [self setPasteElement:selectedHelement];
    [self removeChildrenOf:selectedHelement];
    cheIndex = [visibleHelements indexOfObject:selectedHelement];
    if(cheIndex == NSNotFound){
        return;
    }
    [visibleHelements removeObjectAtIndex:cheIndex];
    if(cheIndex > 0){
        [self setSelectedHelement:[visibleHelements oai:cheIndex - 1]];
    }else{
        [self setSelectedHelement:nil];
    }
    [self rebuildCurrentPath];
}
- (void)ordnerEinfuegen;
{
    if(!selectedHelement){
        LOGI(@"Bitte einen Ordner auswaehlen.");
        return;
    }
    if(!pasteElement){
        LOGI(@"noch kein Ordner ausgeschnitten");
        return;
    }
    [pasteElement tvfk([selectedHelement primaryKey],@"parentelement")];
    UPDAT(pasteElement);
    [pasteElement tvfk(@"J",@"_collapsed")];
    [self setPasteElement:nil];
    [self removeChildrenOf:selectedHelement];
    [selectedHelement tvfk(@"J",@"_collapsed")];
    [self expandElement:selectedHelement];
}
- (void)dealloc;
{
    [currentHelement release];
    [currentPath release];
    [currentPathS release];
    [selectedHelement release];
    [ordnerName release];
    [basePath release];
    [pasteElement release];
    [soaForHelements release];
    [visibleHelements release];
    [super dealloc];
}
@end
Foto