view dwt/browser.old/FilePicker.d @ 288:4ee8c4237614

old branches... commit by mistake
author John Reimer<terminal.node@gmail.com>
date Tue, 05 Aug 2008 18:00:50 -0700
parents
children
line wrap: on
line source

/*******************************************************************************
 * Copyright (c) 2003, 2007 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 * Port to the D programming language:
 *     John Reimer <terminal.node@gmail.com>
 *******************************************************************************/

module dwt.browser.FilePicker;

import tango.io.model.IFile;
import Utf = tango.text.convert.Utf;

import dwt.dwthelper.utils;

import dwt.DWT;

import XPCOM = dwt.internal.mozilla.nsXPCOM;

import dwt.browser.Mozilla;
import dwt.browser.MozillaDelegate;

import dwt.internal.mozilla.nsEmbedString;
import dwt.internal.mozilla.nsIDOMWindow;
import dwt.internal.mozilla.nsID;
import dwt.internal.mozilla.nsIFilePicker;
import dwt.internal.mozilla.nsILocalFile;
import dwt.internal.mozilla.nsISupports;
import dwt.internal.mozilla.nsSimpleEnumerator;
import dwt.internal.mozilla.nsStringAPI;
import dwt.internal.mozilla.nsError;

import dwt.widgets.DirectoryDialog;
import dwt.widgets.Display;
import dwt.widgets.FileDialog;
import dwt.widgets.Shell;


class FilePicker : nsISupports, nsIFilePicker 
{
    /**************************************************************************

    **************************************************************************/
    
    private 
    {
        int      _refCount = 0;
        short    _mode;

        nsIDOMWindow _parent;

        String[] _files;
        String   _masks;
        String   _defaultFilename, 
                 _directory, 
                 _title;
    }
    /**************************************************************************

    **************************************************************************/

    static final String SEPARATOR = FileConst.FileSeparatorChar;

    /**************************************************************************

    **************************************************************************/

    this () 
    {
    }

    /**************************************************************************

    **************************************************************************/

    nsrefcnt AddRef () 
    {
        _refCount++;
        return _refCount;
    }

    /**************************************************************************

    **************************************************************************/

    nsresult QueryInterface ( inout nsID riid, void** ppvObject) 
    {   
        if (riid is null || ppvObject is null) 
            return NS_ERROR_NO_INTERFACE;
    
        if (riid == nsISupports.IID) 
        {
            *ppvObject = cast(void*)cast(nsISupports) this;
            AddRef ();
            return NS_OK;
        }
    
        if (riid == nsIFilePicker.IID)) 
        {
            *ppvObject = cast(void*)cast(nsIFilePicker) this;
            AddRef ();
            return NS_OK;
        }
    
        if (riid == nsIFilePicker_1_8.IID) 
        {
            *ppvObject = cast(void*)cast(nsIFilePicker_1_8) this;
            AddRef ();
            return NS_OK;
        }

        *ppvObject = null; 
        return NS_ERROR_NO_INTERFACE;
    }

    /**************************************************************************

    **************************************************************************/

    nsrefcnt Release () 
    {
        _refCount--;
        
        if (_refCount is 0) 
            // No big deal here; just allow the GC to reap this object
            // once all references are expired. -JJR
            // delete this;
            return 0;
        
        return _refCount;
    }

    /**************************************************************************

    **************************************************************************/

    /* SWT Comment:
     *
     * As of Mozilla 1.8 some of nsIFilePicker's string arguments changed type.  This method
     * answers a java string based on the type of string that is appropriate for the Mozilla
     * version being used.
     */

    override String parseAString (nsEmbedString str) 
    {
        return null;
    }

    /**************************************************************************

    **************************************************************************/

    /* nsIFilePicker */

    nsresult Init (nsIDOMWindow parent, nsAString* title, PRInt16 mode) 
    {
        _parent = parent;
        _mode = mode;
        _title = parseAString (title);
        return XPCOM;
    }

    /**************************************************************************

    **************************************************************************/

    nsresult Show (PRUint32* retval) 
    {
        if (_mode is nsIFilePicker.modeGetFolder) 
        {
            /* picking a directory */
            int result = this.showDirectoryPicker ();
            *retval = result;
            return NS_OK;
        }

        /* picking a file */
        int style = _mode is nsIFilePicker.modeSave ? DWT.SAVE : DWT.OPEN;

        if (_mode is nsIFilePicker.modeOpenMultiple) 
            style |= DWT.MULTI;

        Display display = Display.getCurrent ();
        Shell parent = null; // TODO compute parent

        if (parent is null) 
        {
            parent = new Shell (display);
        }

        FileDialog dialog = new FileDialog (parent, style);
        
        if (_title !is null) 
            dialog.setText (_title);
        
        if (_directory !is null) 
            dialog.setFilterPath (_directory);
        
        if (_masks !is null) {
            String[] str ~= _masks;
            dialog.setFilterExtensions ( str );
        }
        
        if (_defaultFilename !is null) 
            dialog.setFileName (_defaultFilename);
        
        String filename = dialog.open ();
        files = dialog.getFileNames ();
        _directory = dialog.getFilterPath ();
        _title = _defaultFilename = null;
        _masks = null;
        int result = filename is null ? nsIFilePicker.returnCancel : nsIFilePicker.returnOK; 
        *retval = result;
        return NS_OK;
    }

    /**************************************************************************

    **************************************************************************/

    int showDirectoryPicker () 
    {
        Display display = Display.getCurrent ();
        Shell parent = null; // TODO compute parent
        
        if (parent is null) 
        {
            parent = new Shell (display);
        }
        
        DirectoryDialog dialog = new DirectoryDialog (parent, DWT.NONE);
        
        if (_title !is null) 
            dialog.setText (_title);
        if (_directory !is null) 
            dialog.setFilterPath (_directory);
        _directory = dialog.open ();
        _title = _defaultFilename = null;
        _files = _masks = null;
        return _directory is null ? nsIFilePicker.returnCancel : nsIFilePicker.returnOK;
    }

    /**************************************************************************

    **************************************************************************/

    nsresult GetFiles ( nsISimpleEnumerator* aFiles) 
    {
        return NS_ERROR_NOT_IMPLEMENTED;
    }

    /**************************************************************************

    **************************************************************************/

    nsresult GetFileURL (nsIFileURL aFileURL) 
    {
        return NS_ERROR_NOT_IMPLEMENTED;
    }

    /**************************************************************************

    **************************************************************************/

    nsresult GetFile (nsILocalFile* aFile) 
    {
        String filename = "";   //$NON-NLS-1$
        
        if (_directory !is null) 
            filename ~= _directory ~ SEPARATOR;
        if (_files !is null && _files.length > 0) 
            filename ~= _files[0];
        
        // Create a nsEmbedString which will be automatically disposed 
        // at the end of scope.
        scope auto path = new nsEmbedString( filename );
        
        nsresult rc = XPCOM.NS_NewLocalFile ( cast(nsAString*)path, 1, aFile);

        if (rc !is NS_OK) 
            Mozilla.error (rc);
        if (aFile is null) 
            Mozilla.error (NS_ERROR_NULL_POINTER);

        return NS_OK;
    }

    /**************************************************************************

    **************************************************************************/

    nsresult SetDisplayDirectory (nsILocalFile aDisplayDirectory) 
    {
        if (aDisplayDirectory is null) 
            return NS_OK;
        
        scope auto pathname = new nsEmbedCString;
        aDisplayDirectory.GetNativePath ( cast(nsACString*)pathname );
        // TODO: CHECK IF THIS DOES CORRECT STRING CONVERSION -JJR
        char[] buffer = pathname.toString();
        char[] chars = MozillaDelegate.mbcsToWcs (null, buffer);
        // "buffer" contains a dup'ed string so we can safely reuse
        // it's memory for the _directory member. -JJR
        _directory = buffer;
        return NS_OK;
    }

    /**************************************************************************

    **************************************************************************/

    nsresult GetDisplayDirectory (nsILocalFile* aDisplayDirectory) 
    {
        String directoryName = _directory !is null ? _directory : ""; //$NON-NLS-1$
        scope auto path = new nsEmbedString (directoryName);
        nsresult rc = XPCOM.NS_NewLocalFile ( cast(nsAString*)path, 1, aDisplayDirectory);
        
        if (rc !is NS_OK) 
            Mozilla.error (rc);
        if (aDisplayDirectory is null) 
            Mozilla.error (NS_ERROR_NULL_POINTER);
        return NS_OK;
    }

    /**************************************************************************

    **************************************************************************/

    nsresult SetFilterIndex (PRInt32 aFilterIndex) 
    {
        return NS_ERROR_NOT_IMPLEMENTED;
    }

    /**************************************************************************

    **************************************************************************/

    nresult GetFilterIndex (PRInt32* aFilterIndex) 
    {
        return NS_ERROR_NOT_IMPLEMENTED;
    }

    /**************************************************************************

    **************************************************************************/

    int SetDefaultExtension (nsAString* aDefaultExtension) 
    {
        /* note that the type of argument 1 changed as of Mozilla 1.8 */
        return NS_ERROR_NOT_IMPLEMENTED;
    }

    /**************************************************************************

    **************************************************************************/

    int GetDefaultExtension (nsAString* aDefaultExtension) 
    {
        /* note that the type of argument 1 changed as of Mozilla 1.8 */
        return NS_ERROR_NOT_IMPLEMENTED;
    }

    /**************************************************************************

    **************************************************************************/

    nresult SetDefaultString (nsAString* aDefaultString) 
    {
        defaultFilename = parseAString (aDefaultString);
        return NS_OK;
    }

    /**************************************************************************

    **************************************************************************/

    nresult GetDefaultString (nsAString* aDefaultString) 
    {
        /* note that the type of argument 1 changed as of Mozilla 1.8 */
        return NS_ERROR_NOT_IMPLEMENTED;
    }

    /**************************************************************************

    **************************************************************************/

    nresult AppendFilter (nsAString* title, nsAString* filter)
    {
        /* note that the type of arguments 1 and 2 changed as of Mozilla 1.8 */
        return NS_ERROR_NOT_IMPLEMENTED;
    }

    /**************************************************************************

    **************************************************************************/

    nresult AppendFilters (PRInt32 filterMask) 
    {
        String addFilters;
        
        switch (filterMask) 
        {
            case nsIFilePicker.filterAll:
            case nsIFilePicker.filterApps:
                _masks = null;           /* this is equivalent to no filter */
                break;
            case nsIFilePicker.filterHTML:
                addFilters = "*.htm;*.html" ;
                break;
            case nsIFilePicker.filterImages:
                addFilters = "*.gif;*.jpeg;*.jpg;*.png";
                break;
            case nsIFilePicker.filterText:
                addFilters = "*.txt";
                break;
            case nsIFilePicker.filterXML:
                addFilters = "*.xml";
                break;
            case nsIFilePicker.filterXUL:
                addFilters = "*.xul";
                break;
        }
    
        if (_masks is null) 
        {
            _masks = addFilters;
        } else {
            if (addFilters !is null)
                _masks ~= addFilters;
        }
        return NS_OK;
    }

/******************************************************************************

    FilePicker for Mozilla Version 1.8

******************************************************************************/

class FilePicker_1_8 : FilePicker
{
    String parseAString (nsEmbedString str) 
    {
        if (str is null) 
            return null;
        return Utf.toString( str.toString16() );
    }
}