This is FindClass.m in view mode; [Download] [Up]
// Copyright H. Giesen, University of Koblenz-Landau 1996 #import "Controller.h" #import "BrowserController.h" #import "FindClass.h" #import "MyBrowserCell.h" #import "TeXClass.h" #import "DragView.h" #import "BibTexView.h" #import "BibliographicFile.h" #import "BibTeXObject.h" @implementation FindClass // returns the list of all found objects - findString:(const char *)pattern inFile:(BibliographicFile *)aFile ignoreCase:(BOOL)ignoreCaseflag tolerance:(int)tol { unsigned int charVector[256]; // characteristic vector unsigned int bit[32], bit_0, endPos, wildCard; unsigned int findSet, findSet1; NXStream *memStream; int i, j, patLen; int len; if( listOfFoundObjects==nil ){ listOfFoundObjects = [[List alloc] init]; } [listOfFoundObjects empty]; for( i=0; i<32; i++ ) bit[i] = 1<<(32-1-i); bit_0 = bit[0]; patLen = strlen( pattern ); if( patLen>32 ) return nil; endPos = bit[ patLen-1 ]; wildCard = 0; for( j=0; j<patLen; j++ ){ // are there wildcards (only '?' allowed) if( pattern[j]=='?' ) wildCard |= bit[j]; } for( i=0; i<256; i++ ){ // define characteristic vector charVector[i] = wildCard; // set is empty } for( j=0; j<patLen; j++ ) charVector[ (unsigned int)pattern[j] ] |= bit[j]; if( ignoreCaseflag==YES ){ for( i='A'; i<='Z'; i++ ){ unsigned int cv; cv = charVector[i] | charVector[i-'A'+'a']; charVector[i] = charVector[i-'A'+'a'] = cv; } } len = [aFile fileSize]; findSet = findSet1 = 0; memStream = [aFile stream]; NXSeek( memStream, 0, NX_FROMSTART ); lastSearchPos=0; for( j=1; j<=len; j++ ){ unsigned int cv, theChar, h, w=findSet; theChar = NXGetc( memStream ); lastSearchPos++; if( theChar==EOF ){ lastSearchPos=0; return listOfFoundObjects; } cv = charVector[ theChar ]; h = (findSet>>1) | bit_0; findSet = h & cv; if( tol ) // one error is allowed !! findSet1 = ((findSet1>>1) & cv) | h | (findSet>>1) | w; else findSet1 = findSet; if( findSet1 & endPos ){ id obj; //[theText setSel:lastSearchPos-patLen :lastSearchPos]; // test //[theText scrollSelToVisible]; // test obj = [aFile objectAtCharpos:lastSearchPos-patLen andSelectInMatrix:nil]; if( obj ){ if( obj!=[listOfFoundObjects lastObject] ) [listOfFoundObjects addObject:obj]; } } } // we will never reach this part lastSearchPos = -1; return listOfFoundObjects; } - init { [super init]; inspector = [BibTexView new]; findPBoard = [Pasteboard newName:NXFindPboard]; [preViewButton setEnabled:NO]; [selectButton setEnabled:NO]; return self; } // aList is a list of matrixcells of class MyBrowserCell - (void)deleteEntries:(List *)aList { int i, j, rows, cols; char buffer[64]; if( [listOfFoundPatterns count]==0 ) return; if( findMatrix==nil ) return; for( j=0; j<[aList count]; j++ ){ id delObj = [[aList objectAt:j] object]; // entry_object to delete [findMatrix getNumRows:&rows numCols:&cols]; for( i=rows-1; i>=0; i-- ){ id anObj = [[findMatrix cellAt:i :0] object]; if( anObj==delObj ){ // both are of class BibTexObject [findMatrix removeRowAt:i andFree:NO]; [listOfFoundPatterns removeObject:delObj]; if( lastFindObject==delObj ) lastFindObject=nil; continue; } } } [findMatrix sizeToCells]; [listOfSelectedPatterns free]; listOfSelectedPatterns = [findMatrix getSelectedCells:nil]; sprintf( buffer, "%d selected", [listOfSelectedPatterns count] ); [selectedIconText setStringValue:buffer]; if( [listOfSelectedPatterns count]>0 ){ [preViewButton setEnabled:YES]; [selectButton setEnabled:YES]; [findIcon setList:listOfSelectedPatterns]; } else{ [preViewButton setEnabled:NO]; [selectButton setEnabled:NO]; [findIcon setList:nil]; } [[findMatrix window] display]; } - find:sender { NXRect frame = {{0.0, 0.0},{100.0, 100.0}}; if( !findMatrix ){ findMatrix = [[Matrix alloc] initFrame:&frame mode:NX_LISTMODE cellClass:[MyBrowserCell class] numRows:0 numCols:1]; [findMatrix setCellBackgroundGray:NX_LTGRAY]; [findMatrix setBackgroundGray:NX_LTGRAY]; [findMatrix setAutoscroll:YES]; [findScroller setBackgroundGray:NX_LTGRAY]; [[findScroller setDocView:findMatrix] free]; [[findMatrix window]setFrameUsingName:"FindPanel"]; [[findMatrix window] setFrameAutosaveName:"FindPanel"]; [selectButton setEnabled:NO]; preViewPushDown = [[[NXApp delegate]texObject] buildPreviewMenuFor:preViewButton]; [preViewButton setEnabled:NO]; } [[findScroller window] makeKeyAndOrderFront:self]; return self; } - (void)showFindList { int i; NXRect frame = {{0.0, 0.0},{100.0, 100.0}}; NXSize theSize; char keyBuffer[128]; char buffer[512]; if( findMatrix ){ [findMatrix renewRows:0 cols:0]; [findMatrix sizeToCells]; } else{ findMatrix = [[Matrix alloc] initFrame:&frame mode:NX_LISTMODE cellClass:[MyBrowserCell class] numRows:0 numCols:1]; [findMatrix setCellBackgroundGray:NX_LTGRAY]; [findMatrix setBackgroundGray:NX_LTGRAY]; [findMatrix setAutoscroll:YES]; [findScroller setBackgroundGray:NX_LTGRAY]; [[findScroller setDocView:findMatrix] free]; } [findScroller getFrame:&frame]; [findScroller getContentSize:&frame.size]; [findMatrix setAction:@selector(singleClickInFindMatrix:)]; [findMatrix getCellSize:&theSize]; [findMatrix setAutosizeCells:YES]; // tut nicht theSize.width = frame.W; [findMatrix setCellSize:&theSize]; for( i=0; i<[listOfFoundPatterns count]; i++ ){ MyBrowserCell *newCell; BibTeXObject *obj = [listOfFoundPatterns objectAt:i]; BibliographicFile *fileObj = [obj fileObject]; if( i<0 ){ // TEST [findMatrix addRow]; newCell = [findMatrix cellAt:i :0]; [newCell setFont:[Font newFont:"Courier" // tut nicht size:14.0 style:0 matrix:NX_IDENTITYMATRIX]]; sprintf( buffer, " file : %s", [fileObj fileName] ); [newCell setStringValue:buffer]; [newCell setObject:obj inFile:fileObj]; } [findMatrix addRow]; newCell = [findMatrix cellAt:i :0]; [newCell setLeaf:YES]; // is NXBrowerCell !! [obj copyRange:[obj key] toBuffer:keyBuffer]; sprintf( buffer, "%s : %s", [fileObj fileName], keyBuffer ); [newCell setStringValue:buffer]; [newCell setObject:obj inFile:fileObj]; } [findMatrix selectCellAt:-1 :-1]; [[[findMatrix sizeToCells] window] display]; sprintf( buffer, "%d found", [listOfFoundPatterns count] ); [findIconText setStringValue:buffer]; [selectedIconText setStringValue:""]; [findIcon setList:nil]; [findIcon display]; [preViewButton setEnabled:NO]; [selectButton setEnabled:NO]; } - (void)setFindText { char *data; int length; const NXAtom *array; array = [findPBoard types]; if( *array && (changeCount!=[findPBoard changeCount]) ){ if( [findPBoard readType:*array data:&data length:&length] ){ [searchTextField setStringValue:data]; } changeCount = [findPBoard changeCount]; } [searchTextField selectText:self]; textDidChange = NO; } - (void)convert:(const char *)txt to:(char *)buffer length:(int)len { int i = 0, j = 0; unsigned char c, tc; while( (c = txt[i++]) && (i<len) ){ if( c>=0x80 ){ const char *texText = [BibTexParser NX2TeX][ c-0x80 ]; while( tc = *texText++ ) buffer[j++] = tc; } else{ buffer[j++] = c; } } buffer[j] = '\0'; } // objects in selList are of class MyBrowserCell - (void)findStringIn:(List *)selList { int index; BibliographicFile *fileObj; List *rtnList; char searchbuffer[1024]; lastFindObject = nil; lastFindFile = nil; if( !listOfFoundPatterns ) listOfFoundPatterns = [[List alloc] init]; if( ![addButton state] )[listOfFoundPatterns empty]; for( index=0; index<[selList count]; index++ ){ fileObj = [[selList objectAt:index] fileObject]; // copy (and convert search-string [self convert: [searchTextField stringValue] to:searchbuffer length:1024]; //rtnList = [fileObj findString:searchbuffer rtnList = [self findString:searchbuffer inFile:fileObj ignoreCase:[ignoreCase state] tolerance:[allowErrors state]]; [listOfFoundPatterns appendList:rtnList]; // check for multiple entries // (not yet implemented) } [self showFindList]; } // called from menu Edit -> Find -> Find Next - findString:sender { BrowserController *browser = [[NXApp delegate] browserController]; Matrix *matrix = [browser matrixInColumn:0]; List *selList = [matrix getSelectedCells:nil]; [self find:self]; if( textDidChange ){ // write to NXFindPboard [findPBoard declareTypes:&NXAsciiPboardType num:1 owner:nil]; [findPBoard writeType:NXAsciiPboardType data:[searchTextField stringValue] length:strlen([searchTextField stringValue])]; textDidChange = NO; } [searchTextField selectText:self]; [self findStringIn:selList]; [selList free]; return self; } - singleClickInFindMatrix:sender { MyBrowserCell *cell = [sender selectedCell]; char buffer[64]; [[NXApp delegate] P:self]; [listOfSelectedPatterns free]; listOfSelectedPatterns = [sender getSelectedCells:nil]; if( [listOfSelectedPatterns count]==1 ){ [inspector setEntry:(lastFindObject = [cell object]) inFile:(lastFindFile = [cell fileObject]) ]; } else { [inspector clear:self]; lastFindObject = nil; lastFindFile = nil; } [findIcon setList:listOfSelectedPatterns]; sprintf( buffer, "%d selected", [listOfSelectedPatterns count] ); [selectedIconText setStringValue:buffer]; if( [listOfSelectedPatterns count] ){ [preViewButton setEnabled:YES]; [selectButton setEnabled:YES]; } else{ [preViewButton setEnabled:NO]; [selectButton setEnabled:NO]; } [findIcon display]; [[NXApp delegate] V:self]; return self; } - (void)deleteFile:(BibliographicFile *)theFile { int i; int row, col; BOOL needsRedraw = NO; if( !findMatrix ) return; [findMatrix getNumRows:&row numCols:&col]; for( i=row-1; i>=0; i-- ){ id cell = [findMatrix cellAt:i :0]; if( [cell fileObject] == theFile ){ if( theFile==lastFindFile ){ lastFindObject = nil; lastFindFile = nil; } [listOfFoundPatterns removeObject:[cell object]]; needsRedraw = YES; } } if( needsRedraw==YES ) [self showFindList]; } - prepareLaTeX:(int)tag { [[NXApp delegate] LaTeXFromList:[findIcon getList] tag:tag]; return self; } - LaTeX:sender { [[NXApp delegate] LaTeXFromList:[findIcon getList] tag:RUNLATEX]; return self; } - selectInFile:sender // sender is Button { BrowserController *browser = [[NXApp delegate] browserController]; List *selList = [findMatrix getSelectedCells:nil]; int i; // the selection list contains objects of class MyBrowserCell for( i=0; i<[selList count]; i++ ){ [selList replaceObjectAt:i with:[[selList objectAt:i] object]]; } // the selection list contains now objects of class BibTeXObject [browser selectEntryObjects:selList]; [selList free]; return self; } // copy selected entries to copyPasteBoard - copyCitationForEdit { [findIcon copyCitation:self]; return self; } - windowDidBecomeKey:sender { BrowserController *browser = [[NXApp delegate] browserController]; Cell *selCell = [[browser matrixInColumn:0] selectedCell]; if( [[NXApp delegate] semaphore:self] <= 0 ) return self; [[NXApp delegate] P:self]; if( lastFindObject==nil ) [inspector clear:self]; else [inspector setEntry:lastFindObject inFile:lastFindFile ]; [[NXApp delegate] V:self]; [findButton setIconPosition:NX_ICONRIGHT]; [findButton setEnabled:(selCell!=nil)]; [self setFindText]; [sender flushWindow]; return self; } - windowDidResignKey:sender { [sender endEditingFor:nil]; //[self setFindText]; [findButton setIconPosition:NX_TITLEONLY]; [findButton display]; return self; } // returns the new state of the menuCell // YES = enabled // NO = disabled - (BOOL)updateMenuFor:menuCell { BOOL newState=NO; // .. and the compiler keeps silent switch( [menuCell tag] ){ case CUT : newState = YES; break; case COPY : newState = YES; break; case PASTE : newState = YES; break; case SELECTALL : newState = YES; break; case ENTERSELECTION : newState = NO; break; case FINDNEXT : newState = [findButton isEnabled]; break; case PRVWINDOW : newState = YES; break; case COPYCITE : case RUNLATEX : case RUNRTF : case RUNHTML : newState = [[findIcon getList] count]>0; break; case PRINT : newState = [menuCell isEnabled]; break; default : newState = [[NXApp delegate]updateMenuFor:menuCell]; break; } return newState; } - textDidGetKeys:sender isEmpty:(BOOL)flag { textDidChange = YES; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.