Hi,

I know this is not the preferred way to send a change request but it's only one 
entire file: 

PlugIns > dialog > Commands > Utilities > TextMate.mm


Here the content:
-------------
#import "TextMate.h"

@interface NSObject (OakTextViewPrivate)
- (id)insertSnippetWithOptions:(NSDictionary*)options;
- (void)makeTextViewFirstResponder:(id)sender;
- (void)newDocumentAndActivate:(id)sender;
@end

id frontMostTextViewForSelector(SEL selector)
{

        // unique method for identifying a OakTextView
        SEL checkSelector = @selector(scopeContext);

        // Find the front most document's OakTextView
        for(NSWindow* win in [NSApp orderedWindows])
        {

                if([[win firstResponder] respondsToSelector:checkSelector] 
                                && [[win firstResponder] 
respondsToSelector:selector])
                        return [win firstResponder];

                NSMutableArray* allViews = [[[[win contentView] subviews] 
mutableCopy] autorelease];
                for(NSView* view in allViews)
                        if([view respondsToSelector:checkSelector] && [view 
respondsToSelector:selector])
                                return view;

                NSMutableArray* allSubViews = [NSMutableArray array];
                for(NSUInteger i = 0; i < [allViews count]; ++i)
                        [allSubViews 
addObjectsFromArray:[(id)CFArrayGetValueAtIndex((CFArrayRef)allViews, i) 
subviews]];
                for(NSView* view in allSubViews) {
                        if([view respondsToSelector:checkSelector] && [view 
respondsToSelector:selector])
                                return view;
                }

        }

        // If no textView was found create a new document
        if(id tmApp = [NSApp targetForAction:@selector(newDocument:)])
        {

                [tmApp newDocumentAndActivate:nil];

                if([[NSApp orderedWindows] count]
                        && [[[[NSApp orderedWindows] objectAtIndex:0] 
windowController] tryToPerform:
                                                                
@selector(makeTextViewFirstResponder:) with:nil])
                {
                        id textView = [NSApp targetForAction:checkSelector];
                        if(textView && [textView respondsToSelector:selector]) {
                                // TODO How to know whether TM has finished the 
loading of a new doc?
                                // Otherwise it could happen that a x-insert 
command will inserted something
                                // _before_ TM will refresh an empty new doc 
with the content of @"";
                                usleep(10000);
                                return textView;
                        }
                }
        }

        return nil;

}

void insert_text (NSString* someText)
{
        if(id textView = frontMostTextViewForSelector(@selector(insertText:)))
                [textView insertText:someText];
}

void insert_snippet (NSString* aSnippet)
{
        if(id textView = 
frontMostTextViewForSelector(@selector(insertSnippetWithOptions:)))
                [textView insertSnippetWithOptions:
                        [NSDictionary dictionaryWithObject:aSnippet 
forKey:@"content"]];
}

-------------

The idea is to find the front most OakTextView first and then to process 
insert_text or insert_snippet. 
If no OakTextView was found it creates a new untitled document before 
inserting. Here I have a problem: How to know after invoking 
newDocumentAndActivate: whether TM2 did load the new window entirely? I solved 
it tentatively by using usleep(10000) to give TM2 a bit time but this is _not_ 
elegant. The issue here is that it happened to me in 10% of all trials that 
"insert_text" was faster then the initialization of the new doc, i.e. I saw the 
inserted text for a few msecs before the initialization routine replaced its 
content by @"".



Kind regards,
--Hans



_______________________________________________
textmate-dev mailing list
textmate-dev@lists.macromates.com
http://lists.macromates.com/listinfo/textmate-dev

Reply via email to