view dwt/browser/WebBrowser.d @ 0:380af2bdd8e5

Upload of whole dwt tree
author Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
date Sat, 09 Aug 2008 17:00:02 +0200
parents
children f565d3a95c0a
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:
 *     Jacob Carlborg <jacob.carlborg@gmail.com>
 *******************************************************************************/
module dwt.browser.WebBrowser;

import dwt.DWT;
import dwt.browser.Browser;
import dwt.browser.CloseWindowListener;
import dwt.browser.LocationListener;
import dwt.browser.OpenWindowListener;
import dwt.browser.ProgressListener;
import dwt.browser.StatusTextListener;
import dwt.browser.TitleListener;
import dwt.browser.VisibilityWindowListener;
import dwt.dwthelper.utils;
import dwt.dwthelper.Runnable;
import dwt.dwthelper.System;
import dwt.widgets.Composite;

abstract class WebBrowser {
    Browser browser;
    CloseWindowListener[] closeWindowListeners = new CloseWindowListener[0];
    LocationListener[] locationListeners = new LocationListener[0];
    OpenWindowListener[] openWindowListeners = new OpenWindowListener[0];
    ProgressListener[] progressListeners = new ProgressListener[0];
    StatusTextListener[] statusTextListeners = new StatusTextListener[0];
    TitleListener[] titleListeners = new TitleListener[0];
    VisibilityWindowListener[] visibilityWindowListeners = new VisibilityWindowListener[0];

    static Runnable MozillaClearSessions;
    static Runnable NativeClearSessions;

    /* Key Mappings */
    static const int[][] KeyTable = [
        /* Keyboard and Mouse Masks */
        [18, DWT.ALT],
        [16, DWT.SHIFT],
        [17, DWT.CONTROL],
        [224, DWT.COMMAND],

        /* Literal Keys */
        [65, 'a'],
        [66, 'b'],
        [67, 'c'],
        [68, 'd'],
        [69, 'e'],
        [70, 'f'],
        [71, 'g'],
        [72, 'h'],
        [73, 'i'],
        [74, 'j'],
        [75, 'k'],
        [76, 'l'],
        [77, 'm'],
        [78, 'n'],
        [79, 'o'],
        [80, 'p'],
        [81, 'q'],
        [82, 'r'],
        [83, 's'],
        [84, 't'],
        [85, 'u'],
        [86, 'v'],
        [87, 'w'],
        [88, 'x'],
        [89, 'y'],
        [90, 'z'],
        [48, '0'],
        [49, '1'],
        [50, '2'],
        [51, '3'],
        [52, '4'],
        [53, '5'],
        [54, '6'],
        [55, '7'],
        [56, '8'],
        [57, '9'],
        [32, ' '],
        [59, ';'],
        [61, '='],
        [188, ','],
        [190, '.'],
        [191, '/'],
        [219, '['],
        [221, ']'],
        [222, '\''],
        [192, '`'],
        [220, '\\'],
        [108, '|'],

        /* Non-Numeric Keypad Keys */
        [37, DWT.ARROW_LEFT],
        [39, DWT.ARROW_RIGHT],
        [38, DWT.ARROW_UP],
        [40, DWT.ARROW_DOWN],
        [45, DWT.INSERT],
        [36, DWT.HOME],
        [35, DWT.END],
        [46, DWT.DEL],
        [33, DWT.PAGE_UP],
        [34, DWT.PAGE_DOWN],

        /* Virtual and Ascii Keys */
        [8, DWT.BS],
        [13, DWT.CR],
        [9, DWT.TAB],
        [27, DWT.ESC],
        [12, DWT.DEL],

        /* Functions Keys */
        [112, DWT.F1],
        [113, DWT.F2],
        [114, DWT.F3],
        [115, DWT.F4],
        [116, DWT.F5],
        [117, DWT.F6],
        [118, DWT.F7],
        [119, DWT.F8],
        [120, DWT.F9],
        [121, DWT.F10],
        [122, DWT.F11],
        [123, DWT.F12],
        [124, DWT.F13],
        [125, DWT.F14],
        [126, DWT.F15],
        [127, 0],
        [128, 0],
        [129, 0],
        [130, 0],
        [131, 0],
        [132, 0],
        [133, 0],
        [134, 0],
        [135, 0],

        /* Numeric Keypad Keys */
        [96, DWT.KEYPAD_0],
        [97, DWT.KEYPAD_1],
        [98, DWT.KEYPAD_2],
        [99, DWT.KEYPAD_3],
        [100, DWT.KEYPAD_4],
        [101, DWT.KEYPAD_5],
        [102, DWT.KEYPAD_6],
        [103, DWT.KEYPAD_7],
        [104, DWT.KEYPAD_8],
        [105, DWT.KEYPAD_9],
        [14, DWT.KEYPAD_CR],
        [107, DWT.KEYPAD_ADD],
        [109, DWT.KEYPAD_SUBTRACT],
        [106, DWT.KEYPAD_MULTIPLY],
        [111, DWT.KEYPAD_DIVIDE],
        [110, DWT.KEYPAD_DECIMAL],

        /* Other keys */
        [20, DWT.CAPS_LOCK],
        [144, DWT.NUM_LOCK],
        [145, DWT.SCROLL_LOCK],
        [44, DWT.PRINT_SCREEN],
        [6, DWT.HELP],
        [19, DWT.PAUSE],
        [3, DWT.BREAK],

        /* Safari-specific */
        [186, ';'],
        [187, '='],
        [189, '-']
    , ];

    public void addCloseWindowListener (CloseWindowListener listener) {
        CloseWindowListener[] newCloseWindowListeners = new CloseWindowListener[closeWindowListeners.length + 1];
        System.arraycopy(closeWindowListeners, 0, newCloseWindowListeners, 0, closeWindowListeners.length);
        closeWindowListeners = newCloseWindowListeners;
        closeWindowListeners[closeWindowListeners.length - 1] = listener;
    }

    public void addLocationListener (LocationListener listener) {
        LocationListener[] newLocationListeners = new LocationListener[locationListeners.length + 1];
        System.arraycopy(locationListeners, 0, newLocationListeners, 0, locationListeners.length);
        locationListeners = newLocationListeners;
        locationListeners[locationListeners.length - 1] = listener;
    }

    public void addOpenWindowListener (OpenWindowListener listener) {
        OpenWindowListener[] newOpenWindowListeners = new OpenWindowListener[openWindowListeners.length + 1];
        System.arraycopy(openWindowListeners, 0, newOpenWindowListeners, 0, openWindowListeners.length);
        openWindowListeners = newOpenWindowListeners;
        openWindowListeners[openWindowListeners.length - 1] = listener;
    }

    public void addProgressListener (ProgressListener listener) {
        ProgressListener[] newProgressListeners = new ProgressListener[progressListeners.length + 1];
        System.arraycopy(progressListeners, 0, newProgressListeners, 0, progressListeners.length);
        progressListeners = newProgressListeners;
        progressListeners[progressListeners.length - 1] = listener;
    }

    public void addStatusTextListener (StatusTextListener listener) {
        StatusTextListener[] newStatusTextListeners = new StatusTextListener[statusTextListeners.length + 1];
        System.arraycopy(statusTextListeners, 0, newStatusTextListeners, 0, statusTextListeners.length);
        statusTextListeners = newStatusTextListeners;
        statusTextListeners[statusTextListeners.length - 1] = listener;
    }

    public void addTitleListener (TitleListener listener) {
        TitleListener[] newTitleListeners = new TitleListener[titleListeners.length + 1];
        System.arraycopy(titleListeners, 0, newTitleListeners, 0, titleListeners.length);
        titleListeners = newTitleListeners;
        titleListeners[titleListeners.length - 1] = listener;
    }

    public void addVisibilityWindowListener (VisibilityWindowListener listener) {
        VisibilityWindowListener[] newVisibilityWindowListeners = new VisibilityWindowListener[visibilityWindowListeners.length + 1];
        System.arraycopy(visibilityWindowListeners, 0, newVisibilityWindowListeners, 0, visibilityWindowListeners.length);
        visibilityWindowListeners = newVisibilityWindowListeners;
        visibilityWindowListeners[visibilityWindowListeners.length - 1] = listener;
    }

    public abstract bool back ();

    public static void clearSessions () {
        if (NativeClearSessions !is null)
            NativeClearSessions.run();
        if (MozillaClearSessions !is null)
            MozillaClearSessions.run();
    }

    public abstract void create (Composite parent, int style);

    public abstract bool execute (String script);

    public abstract bool forward ();

    public abstract String getText ();

    public abstract String getUrl ();

    public Object getWebBrowser () {
        return null;
    }

    public abstract bool isBackEnabled ();

    public bool isFocusControl () {
        return false;
    }

    public abstract bool isForwardEnabled ();

    public abstract void refresh ();

    public void removeCloseWindowListener (CloseWindowListener listener) {
        if (closeWindowListeners.length is 0)
            return;
        int index = -1;
        for (int i = 0; i < closeWindowListeners.length; i++) {
            if (listener is closeWindowListeners[i]) {
                index = i;
                break;
            }
        }
        if (index is -1)
            return;
        if (closeWindowListeners.length is 1) {
            closeWindowListeners = new CloseWindowListener[0];
            return;
        }
        CloseWindowListener[] newCloseWindowListeners = new CloseWindowListener[closeWindowListeners.length - 1];
        System.arraycopy(closeWindowListeners, 0, newCloseWindowListeners, 0, index);
        System.arraycopy(closeWindowListeners, index + 1, newCloseWindowListeners, index, closeWindowListeners.length - index - 1);
        closeWindowListeners = newCloseWindowListeners;
    }

    public void removeLocationListener (LocationListener listener) {
        if (locationListeners.length is 0)
            return;
        int index = -1;
        for (int i = 0; i < locationListeners.length; i++) {
            if (listener is locationListeners[i]) {
                index = i;
                break;
            }
        }
        if (index is -1)
            return;
        if (locationListeners.length is 1) {
            locationListeners = new LocationListener[0];
            return;
        }
        LocationListener[] newLocationListeners = new LocationListener[locationListeners.length - 1];
        System.arraycopy(locationListeners, 0, newLocationListeners, 0, index);
        System.arraycopy(locationListeners, index + 1, newLocationListeners, index, locationListeners.length - index - 1);
        locationListeners = newLocationListeners;
    }

    public void removeOpenWindowListener (OpenWindowListener listener) {
        if (openWindowListeners.length is 0)
            return;
        int index = -1;
        for (int i = 0; i < openWindowListeners.length; i++) {
            if (listener is openWindowListeners[i]) {
                index = i;
                break;
            }
        }
        if (index is -1)
            return;
        if (openWindowListeners.length is 1) {
            openWindowListeners = new OpenWindowListener[0];
            return;
        }
        OpenWindowListener[] newOpenWindowListeners = new OpenWindowListener[openWindowListeners.length - 1];
        System.arraycopy(openWindowListeners, 0, newOpenWindowListeners, 0, index);
        System.arraycopy(openWindowListeners, index + 1, newOpenWindowListeners, index, openWindowListeners.length - index - 1);
        openWindowListeners = newOpenWindowListeners;
    }

    public void removeProgressListener (ProgressListener listener) {
        if (progressListeners.length is 0)
            return;
        int index = -1;
        for (int i = 0; i < progressListeners.length; i++) {
            if (listener is progressListeners[i]) {
                index = i;
                break;
            }
        }
        if (index is -1)
            return;
        if (progressListeners.length is 1) {
            progressListeners = new ProgressListener[0];
            return;
        }
        ProgressListener[] newProgressListeners = new ProgressListener[progressListeners.length - 1];
        System.arraycopy(progressListeners, 0, newProgressListeners, 0, index);
        System.arraycopy(progressListeners, index + 1, newProgressListeners, index, progressListeners.length - index - 1);
        progressListeners = newProgressListeners;
    }

    public void removeStatusTextListener (StatusTextListener listener) {
        if (statusTextListeners.length is 0)
            return;
        int index = -1;
        for (int i = 0; i < statusTextListeners.length; i++) {
            if (listener is statusTextListeners[i]) {
                index = i;
                break;
            }
        }
        if (index is -1)
            return;
        if (statusTextListeners.length is 1) {
            statusTextListeners = new StatusTextListener[0];
            return;
        }
        StatusTextListener[] newStatusTextListeners = new StatusTextListener[statusTextListeners.length - 1];
        System.arraycopy(statusTextListeners, 0, newStatusTextListeners, 0, index);
        System.arraycopy(statusTextListeners, index + 1, newStatusTextListeners, index, statusTextListeners.length - index - 1);
        statusTextListeners = newStatusTextListeners;
    }

    public void removeTitleListener (TitleListener listener) {
        if (titleListeners.length is 0)
            return;
        int index = -1;
        for (int i = 0; i < titleListeners.length; i++) {
            if (listener is titleListeners[i]) {
                index = i;
                break;
            }
        }
        if (index is -1)
            return;
        if (titleListeners.length is 1) {
            titleListeners = new TitleListener[0];
            return;
        }
        TitleListener[] newTitleListeners = new TitleListener[titleListeners.length - 1];
        System.arraycopy(titleListeners, 0, newTitleListeners, 0, index);
        System.arraycopy(titleListeners, index + 1, newTitleListeners, index, titleListeners.length - index - 1);
        titleListeners = newTitleListeners;
    }

    public void removeVisibilityWindowListener (VisibilityWindowListener listener) {
        if (visibilityWindowListeners.length is 0)
            return;
        int index = -1;
        for (int i = 0; i < visibilityWindowListeners.length; i++) {
            if (listener is visibilityWindowListeners[i]) {
                index = i;
                break;
            }
        }
        if (index is -1)
            return;
        if (visibilityWindowListeners.length is 1) {
            visibilityWindowListeners = new VisibilityWindowListener[0];
            return;
        }
        VisibilityWindowListener[] newVisibilityWindowListeners = new VisibilityWindowListener[visibilityWindowListeners.length - 1];
        System.arraycopy(visibilityWindowListeners, 0, newVisibilityWindowListeners, 0, index);
        System.arraycopy(visibilityWindowListeners, index + 1, newVisibilityWindowListeners, index, visibilityWindowListeners.length - index - 1);
        visibilityWindowListeners = newVisibilityWindowListeners;
    }

    public void setBrowser (Browser browser) {
        this.browser = browser;
    }

    public abstract bool setText (String html);

    public abstract bool setUrl (String url);

    public abstract void stop ();

    int translateKey (int key) {
        for (int i = 0; i < KeyTable.length; i++) {
            if (KeyTable[i][0] is key)
                return KeyTable[i][1];
        }
        return 0;
    }
}