/*
 * This file is part of the KFTPGrabber project
 *
 * Copyright (C) 2003-2006 by the KFTPGrabber developers
 * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
 * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
 * NON-INFRINGEMENT.  See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
 * MA 02110-1301, USA.
 *
 * In addition, as a special exception, the copyright holders give
 * permission to link the code of portions of this program with the
 * OpenSSL library under certain conditions as described in each
 * individual source file, and distribute linked combinations
 * including the two.
 *
 * You must obey the GNU General Public License in all respects
 * for all of the code used other than OpenSSL.  If you modify
 * file(s) with this exception, you may extend this exception to your
 * version of the file(s), but you are not obligated to do so.  If you
 * do not wish to do so, delete this exception statement from your
 * version.  If you delete this exception statement from all source
 * files in the program, then also delete it here.
 */
#ifndef KFTPWIDGETS_BROWSERLOCATIONNAVIGATOR_H
#define KFTPWIDGETS_BROWSERLOCATIONNAVIGATOR_H

#include <qobject.h>
#include <qvaluelist.h>

#include <kurl.h>

namespace KFTPWidgets {

namespace Browser {

class DetailsView;

/**
 * This class contains the current navigational history and enables
 * moving through it.
 *
 * @author Jernej Kos
 */
class LocationNavigator : public QObject {
Q_OBJECT
public:
    /**
     * An Element instance represents one history element. The class contains
     * information about the URL, the selected item and the contents position.
     */
    class Element {
    public:
        /**
         * Class constructor.
         */
        Element();
        
        /**
         * Class constructor.
         *
         * @param url Element's URL
         */
        Element(const KURL &url);
        
        /**
         * Returns the element's URL.
         */
        const KURL &url() const { return m_url; }
        
        /**
         * Set currently selected filename.
         *
         * @param filename The filename of the currently selected item
         */
        void setCurrentFilename(const QString &filename) { m_currentFilename = filename; }
        
        /**
         * Returns the selected filename.
         */
        const QString &currentFilename() const { return m_currentFilename; }
        
        /**
         * Set current contents X position.
         *
         * @param x Contents X position
         */
        void setContentsX(int x) { m_contentsX = x; }
        
        /**
         * Returns the saved contents X position.
         */
        int contentsX() const { return m_contentsX; }
        
        /**
         * Set current contents Y position.
         *
         * @param y Contents Y position
         */
        void setContentsY(int y) { m_contentsY = y; }
        
        /**
         * Returns the saved contents Y position.
         */
        int contentsY() const { return m_contentsY; }
    private:
        KURL m_url;
        QString m_currentFilename;
        
        int m_contentsX;
        int m_contentsY;
    };
    
    /**
     * Class constructor.
     *
     * @param view Parent view
     */
    LocationNavigator(DetailsView *view);
    
    /**
     * Set a new current URL. Calling this will emit the urlChanged signal.
     *
     * @param url Wanted URL
     */
    void setUrl(const KURL &url);
    
    /**
     * Returns the current URL.
     */
    const KURL &url() const;
    
    /**
     * Returns the current history elements.
     *
     * @param index Variable to save the current history position to
     * @return Current history element list
     */
    const QValueList<Element> history(int &index) const;
    
    /**
     * Go one history hop back.
     */
    void goBack();
    
    /**
     * Go one history hop forward.
     */
    void goForward();
    
    /**
     * Go up in the directory structure.
     */
    void goUp();
    
    /**
     * Go the the predefined home URL.
     */
    void goHome();
    
    /**
     * Set the home URL.
     *
     * @param url URL to use as home URL
     */
    void setHomeUrl(const KURL &url) { m_homeUrl = url; }
    
    /**
     * Clear current history.
     */
    void clear();
signals:
    /**
     * This signal is emitted whenever the current URL changes.
     *
     * @param url The new URL
     */
    void urlChanged(const KURL &url);
    
    /**
     * This signal is emitted whenever the history is updated.
     */
    void historyChanged();
private slots:
    void slotContentsMoved(int x, int y);
private:
    DetailsView *m_view;
    int m_historyIndex;
    QValueList<Element> m_history;
    KURL m_homeUrl;
    
    void updateCurrentElement();
};

}

}

#endif
