#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