232 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			232 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const { fileURL, loadScript, hideCursor, showCursor } = require('./utils.js')
 | 
						|
let { remote } = require('electron')
 | 
						|
 | 
						|
const webFrame = require('electron').webFrame
 | 
						|
 | 
						|
// UO: Disable unintended zoom of fullscreen page if user wants to zoom
 | 
						|
// only parts like Eyevisit info cards.
 | 
						|
console.log('Disable pinch zoom', webFrame)
 | 
						|
webFrame.setVisualZoomLevelLimits(1, 1)
 | 
						|
 | 
						|
let padContainer = null
 | 
						|
let hideCursorTimeout = null
 | 
						|
let debug = false
 | 
						|
let urlPadMap = new Map()
 | 
						|
 | 
						|
window.urlPadMap = urlPadMap
 | 
						|
window.padLoadedHandler = []
 | 
						|
window.nodeDirname = __dirname
 | 
						|
 | 
						|
function pageSize() {
 | 
						|
    var w = window,
 | 
						|
        d = document,
 | 
						|
        e = d.documentElement,
 | 
						|
        g = d.getElementsByTagName('body')[0],
 | 
						|
        width = w.innerWidth || e.clientWidth || g.clientWidth,
 | 
						|
        height = w.innerHeight || e.clientHeight || g.clientHeight
 | 
						|
 | 
						|
    return [width, height]
 | 
						|
}
 | 
						|
 | 
						|
let size = pageSize()
 | 
						|
let pageWidth = size[0]
 | 
						|
let pageHeight = size[1]
 | 
						|
 | 
						|
/* Open a new at x, y position. */
 | 
						|
function openPad(url, x, y) {
 | 
						|
    console.log('openPad')
 | 
						|
    if (remote.getGlobal('useBrowserView')) {
 | 
						|
        return ipcRenderer.send('loadBrowserView', { url, x, y })
 | 
						|
    }
 | 
						|
    const { Pad } = require('./pad.js')
 | 
						|
    const { minimalPad } = require('./padMinimal.js')
 | 
						|
    pad = null
 | 
						|
    if (urlPadMap.has(url)) {
 | 
						|
        let pad = urlPadMap.get(url)
 | 
						|
        pad.scatter.bringToFront()
 | 
						|
        /*TweenMax.to(pad.frame, 0.5, {
 | 
						|
            boxShadow: "0 0 25px 5px white", onComplete: () => {
 | 
						|
                TweenMax.to(pad.frame, 0.5, { boxShadow: "none" })
 | 
						|
            }
 | 
						|
        })*/
 | 
						|
        TweenMax.to(pad.frame, 0.2, {
 | 
						|
            scale: '1.01',
 | 
						|
            onComplete: () => {
 | 
						|
                TweenMax.to(pad.frame, 0.2, { scale: '1' })
 | 
						|
            }
 | 
						|
        })
 | 
						|
        // pad.scatter.moveTo(x, y)
 | 
						|
        return pad
 | 
						|
    }
 | 
						|
    y + 1600 > pageHeight ? (y = pageHeight - 1600) : (y = y)
 | 
						|
    if (remote.getGlobal('useMinimalPad')) {
 | 
						|
        pad = new minimalPad(padContainer, {
 | 
						|
            x: x,
 | 
						|
            y: y,
 | 
						|
            url: url,
 | 
						|
            tabbedView: true,
 | 
						|
            hasTtitleBar: false,
 | 
						|
            hideOnStart: false,
 | 
						|
            startScale: 1,
 | 
						|
            width: 1000,
 | 
						|
            height: 1500,
 | 
						|
            scalable: true,
 | 
						|
            rotatable: true
 | 
						|
        })
 | 
						|
    }
 | 
						|
    if (!remote.getGlobal('useMinimalPad')) {
 | 
						|
        pad = new Pad(padContainer, {
 | 
						|
            x: x,
 | 
						|
            y: y,
 | 
						|
            url: url,
 | 
						|
            hideOnStart: false,
 | 
						|
            startScale: 1,
 | 
						|
            width: 1000,
 | 
						|
            height: 1500,
 | 
						|
            scalable: true,
 | 
						|
            rotatable: true
 | 
						|
        })
 | 
						|
    }
 | 
						|
    urlPadMap.set(url, pad)
 | 
						|
    for (let callback of window.padLoadedHandler) {
 | 
						|
        callback(pad, url)
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
window.padLoadedHandler.push((pad, url) => {
 | 
						|
    console.log('Add specific behavior')
 | 
						|
})
 | 
						|
 | 
						|
/* According to https://electron.atom.io/docs/faq/
 | 
						|
"I can not use jQuery/RequireJS/Meteor/AngularJS in Electron" we
 | 
						|
have to rename the symbols in the page before including other libraries.
 | 
						|
Remember to use nodeRequire after this point.
 | 
						|
*/
 | 
						|
window.nodeRequire = require
 | 
						|
delete window.require
 | 
						|
delete window.exports
 | 
						|
delete window.module
 | 
						|
 | 
						|
/* Create a DOMPadContainer, i.e. a special DOMScatterContainer, as a wrapper
 | 
						|
of the document body.
 | 
						|
*/
 | 
						|
window.addEventListener('load', e => {
 | 
						|
    console.log('preloading')
 | 
						|
    // ../iwmlib/dist/iwmlib.3rdparty.js
 | 
						|
    // loadScript('../iwmlib/lib/3rdparty/preload.js', () => {
 | 
						|
    loadScript('../../iwmlib/dist/iwmlib.3rdparty.preload.js', () => {
 | 
						|
        //console.log("../iwmlib/dist/iwmlib.3rdparty.js loaded")
 | 
						|
        console.log('greensock loaded')
 | 
						|
        // loadScript('../iwmlib/dist/iwmlib.js', () => {
 | 
						|
        loadScript('../../iwmlib/dist/iwmlib.js', () => {
 | 
						|
            console.log('../iwmlib/dist/iwmlib.js loaded')
 | 
						|
 | 
						|
            /*  const { Pad, DOMPadContainer } = nodeRequire('./pad.js')
 | 
						|
            padContainer = new DOMPadContainer(document.body)
 | 
						|
            
 | 
						|
            window.nodePadContainer = padContainer
 | 
						|
            ipcRenderer.send('padContainerLoaded') */
 | 
						|
 | 
						|
            /*Register a handler for mousemove events. Hide the cursor a few
 | 
						|
             *seconds after the last move event.
 | 
						|
             */
 | 
						|
            document.body.addEventListener('mousemove', e => {
 | 
						|
                showCursor()
 | 
						|
                clearTimeout(hideCursorTimeout)
 | 
						|
                hideCursorTimeout = setTimeout(hideCursor, 3000)
 | 
						|
            })
 | 
						|
        })
 | 
						|
 | 
						|
        if (debug) {
 | 
						|
            loadScript('../iwmlib/dist/iwmlib.pixi.js', () => {
 | 
						|
                console.log('../iwmlib/dist/iwmlib.pixi.js loaded')
 | 
						|
                const DebugApp = require('./debug.js')
 | 
						|
                let debugApp = new DebugApp(document.body)
 | 
						|
                debugApp.setup()
 | 
						|
                debugApp.run()
 | 
						|
            })
 | 
						|
        }
 | 
						|
    })
 | 
						|
})
 | 
						|
 | 
						|
/* Register a handler for all click events and check whether the link target
 | 
						|
opens a new window. If the link target is blank, prevent the default behavior
 | 
						|
and create a Pad scatter object instead.
 | 
						|
*/
 | 
						|
window.addEventListener('click', e => {
 | 
						|
    let node = e.target
 | 
						|
    let url = ''
 | 
						|
    let target = ''
 | 
						|
 | 
						|
    let multiUserMode = false // remote.getGlobal('multiUserMode') // DOMScatter && remote.getGlobal('multiUserMode')
 | 
						|
 | 
						|
    // console.log("click", multiUserMode, remote.getGlobal('multiUserMode'))
 | 
						|
    if (multiUserMode) {
 | 
						|
        while (node !== null) {
 | 
						|
            if (node.tagName === 'A' || node.tagName === 'a') {
 | 
						|
                if (node.target instanceof SVGAnimatedString) {
 | 
						|
                    url = node.href.baseVal
 | 
						|
                    target = node.target.baseVal
 | 
						|
                } else {
 | 
						|
                    url = node.href
 | 
						|
                    target = node.target
 | 
						|
                }
 | 
						|
                if (target === '_blank') {
 | 
						|
                    e.preventDefault()
 | 
						|
                    openPad(url, e.clientX, e.clientY)
 | 
						|
                }
 | 
						|
                return
 | 
						|
            }
 | 
						|
            node = node.parentNode
 | 
						|
        }
 | 
						|
    }
 | 
						|
})
 | 
						|
 | 
						|
/* Register a handler for contextmenu events and check whether the link target
 | 
						|
// opens a new window. If the link target is blank, prevent the default behavior
 | 
						|
and show a popup menu with the option to open a pad instead.
 | 
						|
*/
 | 
						|
window.addEventListener('contextmenu', e => {
 | 
						|
    let node = e.target
 | 
						|
    let url = null
 | 
						|
    if (remote.getGlobal('multiUserMode')) {
 | 
						|
        while (node !== null) {
 | 
						|
            if (node.tagName === 'A' || node.tagName === 'a') {
 | 
						|
                if (node.target instanceof SVGAnimatedString) {
 | 
						|
                    url = node.href.baseVal
 | 
						|
                } else {
 | 
						|
                    url = node.href
 | 
						|
                }
 | 
						|
                e.preventDefault()
 | 
						|
                let point = { x: e.clientX, y: e.clientY }
 | 
						|
                PopupMenu.open(
 | 
						|
                    {
 | 
						|
                        'Open new Pad': () => openPad(url, e.clientX, e.clientY)
 | 
						|
                    },
 | 
						|
                    point,
 | 
						|
                    { fontSize: '0.8em' }
 | 
						|
                )
 | 
						|
                return
 | 
						|
            }
 | 
						|
            node = node.parentNode
 | 
						|
        }
 | 
						|
    }
 | 
						|
})
 | 
						|
 | 
						|
/* Special error handling if the rendere process sends a error notification
 | 
						|
log this error on the main console.
 | 
						|
*/
 | 
						|
let { Console } = require('console')
 | 
						|
let debugConsole = new Console(process.stdout, process.stderr)
 | 
						|
 | 
						|
let { ipcRenderer } = require('electron')
 | 
						|
window.addEventListener('error', event => {
 | 
						|
    debugConsole.error('PAGE ERROR', event.error, event.filename)
 | 
						|
    debugConsole.error('open', window.location.href)
 | 
						|
    ipcRenderer.send('error', 1)
 | 
						|
})
 | 
						|
 | 
						|
ipcRenderer.on('newPad', (e, data) => {
 | 
						|
    openPad(data, 0, 0)
 | 
						|
})
 |