/*******************************************************************************
 * Copyright (c) 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:
 *    Hisashi MIYASHITA - initial API and implementation
 *******************************************************************************/

package org.eclipse.actf.ai.navigator.impl;

import java.io.File;

import org.eclipse.actf.ai.navigator.IBrowserControl;
import org.eclipse.actf.ai.navigator.IManipulator;
import org.eclipse.actf.ai.navigator.extension.ManipulatorExtension;
import org.eclipse.actf.ai.navigator.ui.URLOpenDialog;
import org.eclipse.actf.ai.navigator.voice.VoiceManager;
import org.eclipse.actf.ai.xmlstore.XMLStorePlugin;
import org.eclipse.actf.model.ModelServiceUtils;
import org.eclipse.actf.model.IWebBrowserACTF;
import org.eclipse.actf.model.ui.editor.events.IWebBrowserNavigationEventListener;
import org.eclipse.actf.model.ui.editor.events.WebBrowserNavigationEvent;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;




public class BrowserControlImpl implements IBrowserControl, IWebBrowserNavigationEventListener {
    private final TripJournal tripJournal;

    private final WebEventListener webEventListener;

    private final VoiceManager voiceManager = new VoiceManager(null);

    public void backward() {
        tripJournal.backward(webEventListener.getFocused());
    }

    public void forward() {
        tripJournal.forward(webEventListener.getFocused());
    }

    BrowserControlImpl(WebEventListener webEventListener, TripJournal tripJournal) {
        this.tripJournal = tripJournal;
        this.webEventListener = webEventListener;
    }

    public void goBack(WebBrowserNavigationEvent e) {
        tripJournal.backward(webEventListener.getFocused());
    }

    public void goForward(WebBrowserNavigationEvent e) {
        tripJournal.forward(webEventListener.getFocused());
    }

    public void refresh(WebBrowserNavigationEvent e) {
        IWebBrowserACTF wb = e.getBrowser();
        WebEventListener.BrowserState bs = webEventListener.getBrowserState(wb);
        if (bs == null)
            return;
        bs.getNavigator().navigateRefresh();
    }

    public void stop(WebBrowserNavigationEvent e) {
        IWebBrowserACTF wb = e.getBrowser();
        wb.navigateStop();
    }

    public void exportAllMetadata() {
        String[] ext = { "*.fnz" };

        voiceManager.speakWithFormat("Navigator.EXPORT_ALL_ANNOTATIONS", true, true);
        Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
        FileDialog fileDialog = new FileDialog(shell, SWT.OPEN);
        fileDialog.setFilterExtensions(ext);
        String path = fileDialog.open();

        if (path != null) {
            if (!path.endsWith(".fnz")) {
                path = path + ".fnz";
            }
            File dest = new File(path);
            if (dest.exists()) {
                String title = voiceManager.getMessageFormatter().mes("Navigator.OVERWRITE_CONFIRM");
                String message = voiceManager.getMessageFormatter().mes("Navigator.OVERWRITE_MESSAGE", dest.getName());
                boolean ret = MessageDialog.openQuestion(shell, title, message);
                if (!ret)
                    return;
            }
            if (XMLStorePlugin.getDefault().getXMLStoreService().exportAllAnnotations(dest)) {
                voiceManager.speakWithFormat("Navigator.EXPORT_IS_SUCCEEDED", true, true);
            } else {
                voiceManager.speakWithFormat("Navigator.EXPORT_IS_FAILED", true, true);
            }
        }
    }

    public void importMetadata() {
        String[] ext = { "*.fnc;*.fnz;*.xml" };

        voiceManager.speakWithFormat("Navigator.IMPORT_FENNEC_FILE", true, true);
        Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
        FileDialog fileDialog = new FileDialog(shell, SWT.OPEN);
        fileDialog.setFilterExtensions(ext);
        String path = fileDialog.open();

        if (path != null) {
            File src = new File(path);

            boolean r = XMLStorePlugin.getDefault().getXMLStoreService().importMetadata(src);
            XMLStorePlugin.getDefault().getXMLStoreService().getRootStore().refleshAll();
            NavigatorImpl navigator = webEventListener.getFocused();
            if (navigator != null)
                navigator.forceRestart();
            if (r) {
                voiceManager.speakWithFormat("Navigator.IMPORT_IS_SUCCEEDED", true, true);
            } else {
                voiceManager.speakWithFormat("Navigator.IMPORT_IS_FAILED", true, true);
            }
        }
    }


    public void openTab() {
        voiceManager.stop();
        
        URLOpenDialog openURLDialog = new URLOpenDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
        if (1 == openURLDialog.open()) {
            ManipulatorExtension.setMode(IManipulator.FORM_INPUT_MODE);
            String sUrl = openURLDialog.getUrl();
            ModelServiceUtils.openInExistingEditor(sUrl);
            ManipulatorExtension.setMode(IManipulator.TREE_NAVIGATION_MODE);
        }
    }
}
