/****************************************************************************
**
** Copyright (C) 1992-2009 Nokia. All rights reserved.
**
** This file is part of Qt Jambi.
**
** ** No Commercial Usage
** This file contains pre-release code and may not be distributed.
** You may use this file in accordance with the terms and conditions
** contained in the either Technology Preview License Agreement or the
** Beta Release License Agreement.
**
** If you are unsure which license is appropriate for your use, please
** contact the sales department at qt-sales@nokia.com.


**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
****************************************************************************/

package com.trolltech.examples;

import com.trolltech.qt.core.*;
import com.trolltech.qt.gui.*;

import java.util.*;


class ResourceItem extends QTreeWidgetItem
{
    private QFileInfo mainInfo = null;
    private static QFileIconProvider iconProvider = new QFileIconProvider();
    private boolean isPopulated = false;
    private QTreeWidgetItem dummyNode = null;

    public ResourceItem(QTreeWidgetItem parent, QFileInfo info, boolean recurse)
    {
        super(parent);
        setInfo(info, recurse);
    }

    public ResourceItem(QTreeWidget parent, QFileInfo info, boolean recurse)
    {
        super(parent);
        setInfo(info, recurse);
    }

    public QFileInfo getInfo()
    {
        return mainInfo;
    }

    boolean shouldInsertFile(QFileInfo i)
    {
        return ((i.isDir() && !i.fileName().equals(".") && !i.fileName().equals(".."))
                || i.suffix().equals("png")
                || i.suffix().equals("jpg")
                || i.suffix().equals("jpeg"));
    }

    private void populate()
    {
        QDir dir = new QDir(mainInfo.absoluteFilePath());

        List<QFileInfo> entryList = dir.entryInfoList();

        for (QFileInfo i : entryList) {
            if (shouldInsertFile(i))
                new ResourceItem(this, i, false);
        }

        isPopulated = true;
    }

    public void expand()
    {
        if (!isPopulated) {
            if (dummyNode != null) {
                takeChildren();
                dummyNode.dispose();
                dummyNode = null;
            }

            populate();
        }
    }

    private void setInfo(QFileInfo info, boolean recurse)
    {
        mainInfo = info;

        setText(0, mainInfo.fileName());
        setIcon(0, iconProvider.icon(info));

        if (mainInfo.isDir() && recurse) {
            populate();
        } else if (mainInfo.isDir()) {
            dummyNode = new QTreeWidgetItem(this);
        }

    }
}

@QtJambiExample(name = "Resource System",
                canInstantiate = "call-static-method:notWebstart")
public class ResourceSystem extends QWidget
{
    private QLabel currentImage = null;
    private QTreeWidget selection = null;
    private QRadioButton browseClassPathButton;
    private boolean browseClassPath = true;
    private boolean shown = false;
    private String jarName = null;

    public Signal1<String> pathChanged = new Signal1<String>();

    public ResourceSystem()
    {
        setupUI();

        pathChanged.connect(this, "setPreviewFile(String)");
    }

    private void setupUI()
    {
        currentImage = new QLabel();
        selection = new QTreeWidget();
        selection.setColumnCount(1);
        selection.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum);
        selection.currentItemChanged.connect(this, "itemChanged(QTreeWidgetItem, QTreeWidgetItem)");
        selection.itemExpanded.connect(this, "expandItem(QTreeWidgetItem)");

        List<String> labels = new LinkedList<String>();
        labels.add("Name");
        selection.setHeaderLabels(labels);

        browseClassPathButton = new QRadioButton("Browse class path");
        browseClassPathButton.setChecked(true);
        QRadioButton bt2 = new QRadioButton("Pick file to browse");

        QButtonGroup group = new QButtonGroup(this);
        group.addButton(browseClassPathButton);
        group.addButton(bt2);
        group.setId(browseClassPathButton, 0);
        group.setId(bt2, 1);
        group.buttonIdClicked.connect(this, "modeChanged(int)");

        QHBoxLayout layout2 = new QHBoxLayout();
        layout2.addWidget(browseClassPathButton);
        layout2.addWidget(bt2);

        QVBoxLayout layout = new QVBoxLayout();
        layout.addWidget(selection);
        layout.addLayout(layout2);
        layout.addWidget(currentImage);

        setLayout(layout);

        setWindowIcon(new QIcon("classpath:com/trolltech/images/qt-logo.png"));

        setWindowTitle("Resource System");
    }

    protected void expandItem(QTreeWidgetItem item)
    {
        if (item instanceof ResourceItem)
            ((ResourceItem) item).expand();
    }

    protected void modeChanged(int id)
    {
        if (id == 0)
            browseClassPath = true;
        else
            browseClassPath = false;

        setupSelection();
    }

    protected void itemChanged(QTreeWidgetItem cur, QTreeWidgetItem prev)
    {
        if (cur == null || !(cur instanceof ResourceItem))
            return ;

        ResourceItem selected_item = (ResourceItem) cur;
        QFileInfo info = selected_item.getInfo();

        if (info.exists() && !info.isDir()) {
            pathChanged.emit(info.absoluteFilePath());
        }
    }

    public void setPreviewFile(String path) {
        QPixmap pm = new QPixmap(path);
        if (pm.width() > 100 || pm.height() > 100)
            pm = pm.scaled(100, 100, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation);
        currentImage.setPixmap(pm);

    }

    private void setupSelection()
    {
        selection.clear();

        String searchPath = null;
        if (!browseClassPath) {
            String fileName = QFileDialog.getOpenFileName(this, "Select a .jar file",
                    null, new QFileDialog.Filter("Jar Files (*.jar)"));

            if (fileName.length() == 0) {
                browseClassPath = true;
                browseClassPathButton.setChecked(true);
            }

            QFileInfo jarInfo = new QFileInfo(fileName);
            searchPath = "classpath:" + jarInfo.canonicalFilePath() + "#/";
        }

        if (browseClassPath) {
            searchPath = "classpath:/";
        }

        QFileInfo info = new QFileInfo(searchPath);
        if (!info.exists() || !info.isDir()) {
            QMessageBox.warning(this, "Couldn't open root dir", "Problem reading from class path");
            return ;
        }
        new ResourceItem(selection, info, true);

    }

    @Override
    protected void showEvent(QShowEvent e) {
        if (!shown) {
            QTimer.singleShot(0, this, "setupSelection()");
            shown = true;
        }
    }


    public static boolean notWebstart() {
        return System.getProperty("com.trolltech.launcher.webstart") == null;
    }


    public static void main(String[] args)
    {
        QApplication.initialize(args);
        ResourceSystem w = new ResourceSystem();
        w.show();
        QApplication.exec();
    }

}
