Annotation of chimera/ProgressDlgController.mm, revision 1.8

1.1       hyatt       1: //
                      2: //  ProgressDlgController.m
                      3: //  Chimera
                      4: //
                      5: //  Created by David Hyatt on Sat Feb 02 2002.
                      6: //  Copyright (c) 2001 __MyCompanyName__. All rights reserved.
                      7: //
                      8: 
                      9: #import "ProgressDlgController.h"
                     10: 
1.6       hyatt      11: #include "nsCOMPtr.h"
                     12: #include "nsString.h"
1.2       hyatt      13: #include "nsIWebBrowserPersist.h"
                     14: #include "nsIInputStream.h"
                     15: #include "nsIURL.h"
1.7       hyatt      16: #include "nsILocalFile.h"
1.2       hyatt      17: #include "nsIDOMDocument.h"
1.6       hyatt      18: #include "nsIWebProgressListener.h"
1.7       hyatt      19: #include "nsIComponentManager.h"
1.6       hyatt      20: 
                     21: class nsDownloadListener : public nsIWebProgressListener
                     22: {
                     23: public:
                     24:     nsDownloadListener(ProgressDlgController* aController,
                     25:                        nsIWebBrowserPersist* aPersist,
                     26:                        nsISupports* aSource,
                     27:                        NSString* aDestination,
                     28:                        const char* aContentType,
                     29:                        nsIInputStream* aPostData,
                     30:                        BOOL aBypassCache)
                     31:     {
                     32:         NS_INIT_REFCNT();
                     33:         mController = aController;
                     34:         mWebPersist = aPersist;
                     35:         // The source is either a simple URL or a complete document.
                     36:         mURL = do_QueryInterface(aSource);
                     37:         if (!mURL)
                     38:             mDocument = do_QueryInterface(aSource);
1.7       hyatt      39:         nsCAutoString dstStr = [aDestination cString];
                     40:         NS_NewLocalFile(dstStr.get(), PR_FALSE, getter_AddRefs(mDestination));
1.6       hyatt      41:         mContentType = aContentType;
                     42:         mPostData = aPostData;
                     43:         mBypassCache = aBypassCache;
                     44:     };
                     45:     
                     46:     virtual ~nsDownloadListener() {};
                     47: 
                     48:     NS_DECL_ISUPPORTS
                     49:     NS_DECL_NSIWEBPROGRESSLISTENER
                     50:   
                     51: public:
                     52:     void BeginDownload();
                     53: 
                     54: private: // Member variables
                     55:     ProgressDlgController* mController; // Controller for our UI.
1.7       hyatt      56:     nsCOMPtr<nsIWebBrowserPersist> mWebPersist; // Our web persist object.
1.6       hyatt      57:     nsCOMPtr<nsIURL> mURL; // The URL of our source file. Null if we're saving a complete document.
1.7       hyatt      58:     nsCOMPtr<nsILocalFile> mDestination; // Our destination URL.
1.6       hyatt      59:     nsCString mContentType; // Our content type string.
                     60:     nsCOMPtr<nsIDOMDocument> mDocument; // A DOM document.  Null if we're only saving a simple URL.
                     61:     nsCOMPtr<nsIInputStream> mPostData;  // For complete documents, this is our post data from session history.
                     62:     PRBool mBypassCache; // Whether we should bypass the cache or not.
                     63: };
                     64: 
                     65: NS_IMPL_ISUPPORTS1(nsDownloadListener, nsIWebProgressListener)
                     66: 
                     67: /* void onProgressChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long aCurSelfProgress, in long aMaxSelfProgress, in long aCurTotalProgress, in long aMaxTotalProgress); */
                     68: NS_IMETHODIMP 
                     69: nsDownloadListener::OnProgressChange(nsIWebProgress *aWebProgress, 
                     70:                                         nsIRequest *aRequest, 
                     71:                                         PRInt32 aCurSelfProgress, 
                     72:                                         PRInt32 aMaxSelfProgress, 
                     73:                                         PRInt32 aCurTotalProgress, 
                     74:                                         PRInt32 aMaxTotalProgress)
                     75: {
                     76:   return NS_OK;
                     77: }
                     78: 
                     79: /* void onLocationChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsIURI location); */
                     80: NS_IMETHODIMP 
                     81: nsDownloadListener::OnLocationChange(nsIWebProgress *aWebProgress, 
                     82:                                         nsIRequest *aRequest, 
                     83:                                         nsIURI *location)
                     84: {
                     85:   return NS_OK;
                     86: }
                     87: 
                     88: /* void onStatusChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsresult aStatus, in wstring aMessage); */
                     89: NS_IMETHODIMP 
                     90: nsDownloadListener::OnStatusChange(nsIWebProgress *aWebProgress, 
                     91:                                       nsIRequest *aRequest, 
                     92:                                       nsresult aStatus, 
                     93:                                       const PRUnichar *aMessage)
                     94: {
                     95:   return NS_OK;
                     96: }
                     97: 
                     98: /* void onSecurityChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long state); */
                     99: NS_IMETHODIMP 
                    100: nsDownloadListener::OnSecurityChange(nsIWebProgress *aWebProgress, 
                    101:                                                      nsIRequest *aRequest, 
                    102:                                   PRInt32 state)
                    103: {
                    104:   return NS_OK;
                    105: }
                    106: 
                    107: // Implementation of nsIWebProgressListener
                    108: /* void onStateChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long aStateFlags, in unsigned long aStatus); */
                    109: NS_IMETHODIMP 
                    110: nsDownloadListener::OnStateChange(nsIWebProgress *aWebProgress, 
                    111:                                      nsIRequest *aRequest, 
                    112:                                      PRInt32 aStateFlags, 
                    113:                                      PRUint32 aStatus)
                    114: {
                    115:     return NS_OK;
                    116: }
                    117: 
                    118: void
                    119: nsDownloadListener::BeginDownload()
                    120: {
1.7       hyatt     121:     if (mWebPersist) {
                    122:         mWebPersist->SetProgressListener(this);
                    123:         PRInt32 flags = nsIWebBrowserPersist::PERSIST_FLAGS_NO_CONVERSION | 
                    124:                         nsIWebBrowserPersist::PERSIST_FLAGS_REPLACE_EXISTING_FILES;
                    125:         if (mBypassCache)
                    126:             flags |= nsIWebBrowserPersist::PERSIST_FLAGS_BYPASS_CACHE;
                    127:         else
                    128:             flags |= nsIWebBrowserPersist::PERSIST_FLAGS_FROM_CACHE;
                    129:             
                    130:         if (mURL)
                    131:             mWebPersist->SaveURI(mURL, mPostData, mDestination);
                    132:         else {
                    133:             
                    134:         }
                    135:     }
1.6       hyatt     136: }
1.1       hyatt     137: 
1.3       macserv   138: static NSString *SaveFileToolbarIdentifier                     = @"Save File Dialog Toolbar";
                    139: static NSString *CancelToolbarItemIdentifier           = @"Cancel Toolbar Item";
                    140: static NSString *PauseResumeToolbarItemIdentifier      = @"Pause and Resume Toggle Toolbar Item";
                    141: static NSString *ShowFileToolbarItemIdentifier         = @"Show File Toolbar Item";
                    142: static NSString *OpenFileToolbarItemIdentifier         = @"Open File Toolbar Item";
                    143: static NSString *LeaveOpenToolbarItemIdentifier                = @"Leave Open Toggle Toolbar Item";
                    144: 
                    145: @interface ProgressDlgController(Private)
                    146: -(void)setupToolbar;
                    147: @end
                    148: 
1.1       hyatt     149: @implementation ProgressDlgController
1.2       hyatt     150: 
1.3       macserv   151: - (id)init
                    152: {
1.4       hyatt     153:     if ((self = [super init])) {
1.3       macserv   154:         mDownloadIsPaused = NO;  //Get this value from preferences instead of hardcoding NO.
                    155:         mSaveFileDialogShouldStayOpen = NO;
                    156:     }
1.7       hyatt     157:     
                    158:     mDownloadListener = nsnull;
                    159:     
1.3       macserv   160:     return self;
                    161: }
                    162: 
                    163: -(void)setWebPersist:(nsIWebBrowserPersist*)aPersist 
                    164:               source:(nsISupports*)aSource
                    165:          destination:(NSString*)aDestination
                    166:          contentType:(const char*)aContentType
                    167:             postData:(nsIInputStream*)aInputStream
                    168:          bypassCache:(BOOL)aBypassCache
                    169: {
1.7       hyatt     170:     mDownloadListener = new nsDownloadListener(self, aPersist, aSource,
                    171:                                                aDestination, aContentType,
                    172:                                                aInputStream, aBypassCache);
1.3       macserv   173: }
                    174: 
                    175: - (void)windowDidLoad
                    176: {
                    177:     [self setupToolbar];
1.7       hyatt     178:     if (mDownloadListener)
                    179:         mDownloadListener->BeginDownload();
1.3       macserv   180: }
                    181: 
                    182: - (void)setupToolbar
                    183: {
                    184:     NSToolbar *toolbar = [[[NSToolbar alloc] initWithIdentifier:SaveFileToolbarIdentifier] autorelease];
                    185: 
                    186:     [toolbar setDisplayMode:NSToolbarDisplayModeDefault];
                    187:     [toolbar setAllowsUserCustomization:YES];
                    188:     [toolbar setAutosavesConfiguration:YES];
                    189:     [toolbar setDelegate:self];
                    190:     [[self window] setToolbar:toolbar];
                    191: }
                    192: 
                    193: - (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar
                    194: {
                    195:     return [NSArray arrayWithObjects: CancelToolbarItemIdentifier,
                    196:         PauseResumeToolbarItemIdentifier,
                    197:         ShowFileToolbarItemIdentifier,
                    198:         OpenFileToolbarItemIdentifier,
                    199:         LeaveOpenToolbarItemIdentifier,
                    200:         NSToolbarCustomizeToolbarItemIdentifier,
                    201:         NSToolbarFlexibleSpaceItemIdentifier,
                    202:         NSToolbarSpaceItemIdentifier,
                    203:         NSToolbarSeparatorItemIdentifier,
                    204:         nil];
                    205: }
                    206: 
                    207: - (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar *)toolbar
                    208: {
                    209:     return [NSArray arrayWithObjects: CancelToolbarItemIdentifier,
                    210:         PauseResumeToolbarItemIdentifier,
                    211:         NSToolbarFlexibleSpaceItemIdentifier,
                    212:         LeaveOpenToolbarItemIdentifier,
                    213:         ShowFileToolbarItemIdentifier,
                    214:         OpenFileToolbarItemIdentifier,
                    215:         nil];
                    216: }
                    217: 
                    218: - (NSToolbarItem *) toolbar:(NSToolbar *)toolbar
                    219:       itemForItemIdentifier:(NSString *)itemIdent
                    220:   willBeInsertedIntoToolbar:(BOOL)willBeInserted
1.2       hyatt     221: {
1.3       macserv   222:     NSToolbarItem *toolbarItem = [[[NSToolbarItem alloc] initWithItemIdentifier:itemIdent] autorelease];
                    223: 
                    224:     if ( [itemIdent isEqual:CancelToolbarItemIdentifier] ) {
                    225:         [toolbarItem setLabel:@"Cancel"];
                    226:         [toolbarItem setPaletteLabel:@"Cancel Download"];
                    227:         [toolbarItem setToolTip:@"Cancel this file download"];
                    228:         [toolbarItem setImage:[NSImage imageNamed:@"saveCancel"]];
                    229:         [toolbarItem setTarget:self];
                    230:         [toolbarItem setAction:@selector(cancel)];
                    231:     } else if ( [itemIdent isEqual:PauseResumeToolbarItemIdentifier] ) {
                    232:         [toolbarItem setLabel:@"Pause"];
                    233:         [toolbarItem setPaletteLabel:@"Pause Download"];
                    234:         [toolbarItem setToolTip:@"Pause this FTP file download"];
                    235:         [toolbarItem setImage:[NSImage imageNamed:@"savePause"]];
                    236:         [toolbarItem setTarget:self];
                    237:         [toolbarItem setAction:@selector(pauseAndResumeDownload)];
                    238:         pauseResumeToggleToolbarItem = toolbarItem; //establish reference
                    239:     } else if ( [itemIdent isEqual:ShowFileToolbarItemIdentifier] ) {
                    240:         [toolbarItem setLabel:@"Show File"];
                    241:         [toolbarItem setPaletteLabel:@"Show File"];
                    242:         [toolbarItem setToolTip:@"Show the saved file in the Finder"];
                    243:         [toolbarItem setImage:[NSImage imageNamed:@"saveShowFile"]];
                    244:         [toolbarItem setTarget:self];
                    245:         [toolbarItem setAction:@selector(showFile)];
                    246:     } else if ( [itemIdent isEqual:OpenFileToolbarItemIdentifier] ) {
                    247:         [toolbarItem setLabel:@"Open File"];
                    248:         [toolbarItem setPaletteLabel:@"Open File"];
                    249:         [toolbarItem setToolTip:@"Open the saved file in its default application."];
                    250:         [toolbarItem setImage:[NSImage imageNamed:@"saveOpenFile"]];
                    251:         [toolbarItem setTarget:self];
                    252:         [toolbarItem setAction:@selector(openFile)];
                    253:     } else if ( [itemIdent isEqual:LeaveOpenToolbarItemIdentifier] ) {
                    254:         if ( mSaveFileDialogShouldStayOpen ) {
                    255:             [toolbarItem setLabel:@"Leave Open"];
                    256:             [toolbarItem setPaletteLabel:@"Toggle Close Behavior"];
                    257:             [toolbarItem setToolTip:@"Window will stay open when download finishes."];
                    258:             [toolbarItem setImage:[NSImage imageNamed:@"saveLeaveOpenYES"]];
                    259:             [toolbarItem setTarget:self];
                    260:             [toolbarItem setAction:@selector(toggleLeaveOpen)];
                    261:         } else {
                    262:             [toolbarItem setLabel:@"Close When Done"];
                    263:             [toolbarItem setPaletteLabel:@"Toggle Close Behavior"];
                    264:             [toolbarItem setToolTip:@"Window will close automatically when download finishes."];
                    265:             [toolbarItem setImage:[NSImage imageNamed:@"saveLeaveOpenNO"]];
                    266:             [toolbarItem setTarget:self];
                    267:             [toolbarItem setAction:@selector(toggleLeaveOpen)];
                    268:         }
                    269:         leaveOpenToggleToolbarItem = toolbarItem; //establish reference
                    270:     } else {
                    271:         toolbarItem = nil;
                    272:     }
1.2       hyatt     273: 
1.3       macserv   274:     return toolbarItem;
                    275: }
1.2       hyatt     276: 
1.3       macserv   277: -(void)cancel
                    278: {
                    279:     NSLog(@"Request to cancel download.");
                    280:     //Put logic here!
                    281: }
                    282: 
                    283: -(void)pauseAndResumeDownload
                    284: {
                    285:     if ( ! mDownloadIsPaused ) {
                    286:         //Do logic to pause download
                    287:         mDownloadIsPaused = YES;
                    288:         [pauseResumeToggleToolbarItem setLabel:@"Resume"];
                    289:         [pauseResumeToggleToolbarItem setPaletteLabel:@"Resume Download"];
                    290:         [pauseResumeToggleToolbarItem setToolTip:@"Resume the paused FTP download"];
                    291:         [pauseResumeToggleToolbarItem setImage:[NSImage imageNamed:@"saveResume"]];
                    292:     } else {
                    293:         //Do logic to resume download
                    294:         mDownloadIsPaused = NO;
                    295:         [pauseResumeToggleToolbarItem setLabel:@"Pause"];
                    296:         [pauseResumeToggleToolbarItem setPaletteLabel:@"Pause Download"];
                    297:         [pauseResumeToggleToolbarItem setToolTip:@"Pause this FTP file download"];
                    298:         [pauseResumeToggleToolbarItem setImage:[NSImage imageNamed:@"savePause"]];
                    299:     }
                    300: }
                    301: 
                    302: -(void)showFile
                    303: {
                    304:     NSLog(@"Request to show file.");
                    305: }
                    306: 
                    307: -(void)openFile
                    308: {
                    309:     NSLog(@"Request to open file.");
                    310: }
                    311: 
                    312: -(void)toggleLeaveOpen
                    313: {
                    314:     if ( ! mSaveFileDialogShouldStayOpen ) {
                    315:         //Do logic to set the preference and make it take effect
                    316:         mSaveFileDialogShouldStayOpen = YES;
                    317:         [leaveOpenToggleToolbarItem setLabel:@"Leave Open"];
                    318:         [leaveOpenToggleToolbarItem setPaletteLabel:@"Toggle Close Behavior"];
                    319:         [leaveOpenToggleToolbarItem setToolTip:@"Window will stay open when download finishes."];
                    320:         [leaveOpenToggleToolbarItem setImage:[NSImage imageNamed:@"saveLeaveOpenYES"]];
                    321:     } else {
                    322:         //Do logic to set the preference and make it take effect
                    323:         mSaveFileDialogShouldStayOpen = NO;
                    324:         [leaveOpenToggleToolbarItem setLabel:@"Close When Done"];
                    325:         [leaveOpenToggleToolbarItem setPaletteLabel:@"Toggle Close Behavior"];
                    326:         [leaveOpenToggleToolbarItem setToolTip:@"Window will close automatically when download finishes."];
                    327:         [leaveOpenToggleToolbarItem setImage:[NSImage imageNamed:@"saveLeaveOpenNO"]];
                    328:     }
1.8     ! macserv   329: }
        !           330: 
        !           331: - (void)windowWillClose:(NSNotification *)notification
        !           332: {
        !           333:     [self release];
        !           334: }
        !           335: 
        !           336: - (void)dealloc
        !           337: {
        !           338:     delete mDownloadListener;
        !           339:     mDownloadListener = nsnull;
        !           340:     [pauseResumeToggleToolbarItem release];
        !           341:     [leaveOpenToggleToolbarItem release];
        !           342:     [super dealloc];
1.2       hyatt     343: }
1.1       hyatt     344: 
                    345: @end

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>