/*
 * Copyright (C) %{YEAR} %{AUTHOR} <%{EMAIL}>
 */

import java.util.*;
import org.kde.qt.*;
import org.kde.koala.*;

/**
 * This class serves as the main window for %{APPNAME}.  It handles the
 * menus, toolbars, and status bars.
 *
 * @short Main window class
 * @author $AUTHOR <$EMAIL>
 * @version $APP_VERSION
 */
public class %{APPNAME} extends KMainWindow
{
    private %{APPNAME}View m_view;
    private QPrinter   m_printer;

%{APPNAME}()
{
    super( null, "%{APPNAME}" );
    m_view = new %{APPNAME}View(this);
    m_printer = new QPrinter();
    // accept dnd
    setAcceptDrops(true);

    // tell the KMainWindow that this is indeed the main widget
    setCentralWidget(m_view);

    // then, setup our actions
    setupActions();

    // and a status bar
    statusBar().show();

    // Apply the create the main window and ask the mainwindow to
    // automatically save settings if changed: window size, toolbar
    // position, icon size, etc.  Also to add actions for the statusbar
    // toolbar, and keybindings if necessary.
    setupGUI();
	
    // allow the view to change the statusbar and caption
    connect(m_view, SIGNAL("signalChangeStatusbar(String)"),
            this,   SLOT("changeStatusbar(String)"));
    connect(m_view, SIGNAL("signalChangeCaption(String)"),
            this,   SLOT("changeCaption(String)"));

}

public void load(KURL url)
{
    StringBuffer target = new StringBuffer();
    // the below code is what you should normally do.  in this
    // example case, we want the url to our own.  you probably
    // want to use this code instead for your app

    // download the contents
    if (NetAccess.download(url, target, null))
    {
        // set our caption
        setCaption(url.fileName());

        // load in the file (target is always local)
//        loadFile(target);

        // and remove the temp file
        NetAccess.removeTempFile(target.toString());
    }

    setCaption(url.url());
    m_view.openURL(url);
}

public void setupActions()
{
    KApplication kapp = KApplication.kApplication();
    KStdAction.openNew(this, SLOT("fileNew()"), actionCollection());
    KStdAction.open(this, SLOT("fileOpen()"), actionCollection());
    KStdAction.save(this, SLOT("fileSave()"), actionCollection());
    KStdAction.saveAs(this, SLOT("fileSaveAs()"), actionCollection());
    KStdAction.print(this, SLOT("filePrint()"), actionCollection());
    KStdAction.quit(kapp, SLOT("quit()"), actionCollection());

    KStdAction.preferences(this, SLOT("optionsPreferences()"), actionCollection());

    // this doesn't do anything useful.  it's just here to illustrate
    // how to insert a custom menu and menu item
    KAction custom = new KAction(tr("Cus&tom Menuitem"), new KShortcut(),
                                  this, SLOT("optionsPreferences()"),
                                  actionCollection(), "custom_action");
}

protected void saveProperties(KConfig config)
{
    // the 'config' object points to the session managed
    // config file.  anything you write here will be available
    // later when this app is restored

    if (m_view.currentURL() != null)
        config.writeEntry("lastURL", m_view.currentURL());
}

protected void readProperties(KConfig config)
{
    // the 'config' object points to the session managed
    // config file.  this function is automatically called whenever
    // the app is being restored.  read in here whatever you wrote
    // in 'saveProperties'

    String url = config.readPathEntry("lastURL");

    if (url != null)
        m_view.openURL(new KURL(url));
}

protected void dragEnterEvent(QDragEnterEvent event)
{
    // accept uri drops only
    event.accept(QUriDrag.canDecode(event));
}

protected void dropEvent(QDropEvent event)
{
    // this is a very simplistic implementation of a drop event.  we
    // will only accept a dropped URL.  the Qt dnd code can do *much*
    // much more, so please read the docs there
    ArrayList uri = new ArrayList();

    // see if we can decode a URI.. if not, just ignore it
    if (QUriDrag.decode(event, (String[]) uri.toArray()))
    {
        // okay, we have a URI.. process it
        String url, target;
        url = (String) uri.get(0);

        // load in the file
        load(new KURL(url));
    }
}

private void fileNew()
{
    // this slot is called whenever the File.New menu is selected,
    // the New shortcut is pressed (usually CTRL+N) or the New toolbar
    // button is clicked

    // create a new window
    (new %{APPNAME}()).show();
}

private void fileOpen()
{
    // this slot is called whenever the File.Open menu is selected,
    // the Open shortcut is pressed (usually CTRL+O) or the Open toolbar
    // button is clicked
    KURL url = KURLRequesterDlg.getURL(null, this, tr("Open Location") );
    if (!url.isEmpty())
        m_view.openURL(url);
}

private void fileSave()
{
    // this slot is called whenever the File.Save menu is selected,
    // the Save shortcut is pressed (usually CTRL+S) or the Save toolbar
    // button is clicked

    // save the current file
}

private void fileSaveAs()
{
    // this slot is called whenever the File.Save As menu is selected,
    KURL file_url = KFileDialog.getSaveURL();
    if (!file_url.isEmpty() && file_url.isValid())
    {
        // save your info, here
    }
}

private void filePrint()
{
    // this slot is called whenever the File.Print menu is selected,
    // the Print shortcut is pressed (usually CTRL+P) or the Print toolbar
    // button is clicked
    if (m_printer == null) m_printer = new QPrinter();
    if (QPrintDialog.getPrinterSetup(m_printer))
    {
        // setup the printer.  with Qt, you always "print" to a
        // QPainter.. whether the output medium is a pixmap, a screen,
        // or paper
        QPainter p = new QPainter();
        p.begin(m_printer);

        // we let our view do the actual printing
        QPaintDeviceMetrics metrics = new QPaintDeviceMetrics(m_printer);
        m_view.print(p, metrics.height(), metrics.width());

        // and send the result to the printer
        p.end();
    }
}

private void optionsPreferences()
{
    // popup some sort of preference dialog, here
    %{APPNAME}Preferences dlg = new %{APPNAME}Preferences();
    if (dlg.exec() != 0)
    {
        // redo your settings
    }
}

private void changeStatusbar(String text)
{
    // display the text on the statusbar
    statusBar().message(text);
}

private void changeCaption(String text)
{
    // display the text on the caption
    setCaption(text);
}

static String description =
    "A KDE Application";

static String version = "%{VERSION}";

static String[][] options =
{
    { "+[URL]", "Document to open.", null }
};

static void main(String[] cmdLineArgs)
{
    KAboutData about = new KAboutData("%{APPNAMELC}", "%{APPNAME}", version, description,
                     KAboutData.License_%{LICENSE}, "(C) %{YEAR} %{AUTHOR}", null, null, "%{EMAIL}");
    about.addAuthor( "%{AUTHOR}", null, "%{EMAIL}" );
    KCmdLineArgs.init(cmdLineArgs, about);
    KCmdLineArgs.addCmdLineOptions(options);
    KApplication app = new KApplication();

    // see if we are starting with session management
    if (app.isRestored())
        RESTORE("%{APPNAME}");
    else
    {
        // no session.. just start up normally
        KCmdLineArgs args = KCmdLineArgs.parsedArgs();
        if (args.count() == 0)
        {
            %{APPNAME} widget = new %{APPNAME}();
            widget.show();
        }
        else
        {
            int i = 0;
            for (; i < args.count(); i++)
            {
                %{APPNAME} widget = new %{APPNAME}();
                widget.show();
                widget.load(args.url(i));
            }
        }
        args.clear();
    }

    app.exec();
    return;
}
	
    static {
        qtjava.initialize();
        kdejava.initialize();         
    }
}

