|  | Home · Examples

# Code for Icons Example

    /****************************************************************************
    **
    ** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
    **
    ** This file is part of Qt Jambi.
    **
    ** ** This file may be used under the terms of the GNU General Public
    ** License version 2.0 as published by the Free Software Foundation
    ** and appearing in the file LICENSE.GPL included in the packaging of
    ** this file.  Please review the following information to ensure GNU
    ** General Public Licensing requirements will be met:
    ** http://www.trolltech.com/products/qt/opensource.html
    **
    ** If you are unsure which license is appropriate for your use, please
    ** review the following information:
    ** http://www.trolltech.com/products/qt/licensing.html or contact the
    ** sales department at sales@trolltech.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.*;
    import com.trolltech.qt.core.*;
    import com.trolltech.qt.gui.*;

    import java.util.*;

    @QtJambiExample (name = "Icons")
    public class Icons extends QMainWindow
    {
        QWidget centralWidget;

        QGroupBox previewGroupBox;
        IconPreviewArea previewArea;

        QGroupBox imagesGroupBox;
        QTableWidget imagesTable;

        QGroupBox iconSizeGroupBox;
        QRadioButton smallRadioButton;
        QRadioButton largeRadioButton;
        QRadioButton toolBarRadioButton;
        QRadioButton listViewRadioButton;
        QRadioButton iconViewRadioButton;
        QRadioButton tabBarRadioButton;
        QRadioButton otherRadioButton;
        IconSizeSpinBox otherSpinBox;

        QMenu fileMenu;
        QMenu viewMenu;
        QMenu helpMenu;
        QAction addImagesAct;
        QAction removeAllImagesAct;
        QAction exitAct;
        QAction guessModeStateAct;
        QActionGroup styleActionGroup;
        QAction aboutAct;
        QAction aboutQtAct;

        public Icons()
        {
            centralWidget = new QWidget();
            setCentralWidget(centralWidget);

            createPreviewGroupBox();
            createImagesGroupBox();
            createIconSizeGroupBox();

            createActions();
            createMenus();
            createContextMenu();

            QGridLayout mainLayout = new QGridLayout();
            mainLayout.addWidget(previewGroupBox, 0, 0, 1, 2);
            mainLayout.addWidget(imagesGroupBox, 1, 0);
            mainLayout.addWidget(iconSizeGroupBox, 1, 1);
            centralWidget.setLayout(mainLayout);

            setWindowTitle(tr("Icons"));
            otherRadioButton.click();

            setTextOnRadioButtons();

            resize(minimumSizeHint());
        }

        private void about()
        {
            QMessageBox.about(this, tr("About Icons"),
                tr("The <b>Icons</b> example illustrates how Qt renders an icon in "+
                   "different modes (active, normal, disabled, and selected) and "+
                   "states (on and off) based on a set of images."));
        }

        private void changeStyle(boolean checked)
        {
            if (!checked)
                return;

            QAction action = (QAction) QSignalEmitter.signalSender();
            QStyle style = QStyleFactory.create((String) action.data());

            if (style != null) {
                QApplication.setStyle(style);
                QApplication.setPalette(style.standardPalette());
            }

            setTextOnRadioButtons();

            changeSize(true);
        }

        private void setTextOnRadioButtons() {
            QStyle style = QApplication.style();

            int smallIconSize = style.pixelMetric(QStyle.PixelMetric.PM_SmallIconSize);
            smallRadioButton.setText("Small (" + smallIconSize + " x " + smallIconSize + ")");

            int largeIconSize = style.pixelMetric(QStyle.PixelMetric.PM_LargeIconSize);
            largeRadioButton.setText("Large (" + largeIconSize + " x " + largeIconSize + ")");

            int toolBarIconSize = style.pixelMetric(QStyle.PixelMetric.PM_ToolBarIconSize);
            toolBarRadioButton.setText("Toolbars (" + toolBarIconSize + " x " + toolBarIconSize + ")");

            int listViewIconSize = style.pixelMetric(QStyle.PixelMetric.PM_ListViewIconSize);
            listViewRadioButton.setText("List views (" + listViewIconSize + " x " + listViewIconSize + ")");

            int iconViewIconSize = style.pixelMetric(QStyle.PixelMetric.PM_IconViewIconSize);
            iconViewRadioButton.setText("Icon views (" + iconViewIconSize + " x " + iconViewIconSize + ")");

            int tabBarIconSize = style.pixelMetric(QStyle.PixelMetric.PM_TabBarIconSize);
            tabBarRadioButton.setText("Tab bars (" + tabBarIconSize + " x " + tabBarIconSize + ")");
        }

        private void changeSize(int value)
        {
            changeSize(true);
        }

        private void changeSize(boolean checked)
        {
            if (!checked)
                return;

            int extent;

            if (otherRadioButton.isChecked()) {
                extent = otherSpinBox.value();
            } else {
                QStyle.PixelMetric metric;

                if (smallRadioButton.isChecked()) {
                    metric = QStyle.PixelMetric.PM_SmallIconSize;
                } else if (largeRadioButton.isChecked()) {
                    metric = QStyle.PixelMetric.PM_LargeIconSize;
                } else if (toolBarRadioButton.isChecked()) {
                    metric = QStyle.PixelMetric.PM_ToolBarIconSize;
                } else if (listViewRadioButton.isChecked()) {
                    metric = QStyle.PixelMetric.PM_ListViewIconSize;
                } else if (iconViewRadioButton.isChecked()) {
                    metric = QStyle.PixelMetric.PM_IconViewIconSize;
                } else {
                    metric = QStyle.PixelMetric.PM_TabBarIconSize;
                }
                extent = QApplication.style().pixelMetric(metric);
            }
            previewArea.setSize(new QSize(extent, extent));
            otherSpinBox.setEnabled(otherRadioButton.isChecked());
        }

        private void changeIcon()
        {
            QIcon icon = new QIcon();

            for (int row = 0; row < imagesTable.rowCount(); ++row) {
                QTableWidgetItem item0 = imagesTable.item(row, 0);
                QTableWidgetItem item1 = imagesTable.item(row, 1);
                QTableWidgetItem item2 = imagesTable.item(row, 2);

                if (item0.checkState() == Qt.CheckState.Checked) {
                    QIcon.Mode mode;
                    if (item1.text().equals(tr("Normal"))) {
                        mode = QIcon.Mode.Normal;
                    } else if (item1.text().equals(tr("Active"))) {
                        mode = QIcon.Mode.Active;
                    } else if (item1.text().equals(tr("Disabled"))) {
                        mode = QIcon.Mode.Disabled;
                    } else {
                        mode = QIcon.Mode.Selected;
                    }

                    QIcon.State state;
                    if (item2.text().equals(tr("On"))) {
                        state = QIcon.State.On;
                    } else {
                        state = QIcon.State.Off;
                    }

                    String fileName = (String) item0.data(Qt.ItemDataRole.UserRole);
                    QImage image = new QImage(fileName);
                    if (!image.isNull())
                        icon.addPixmap(QPixmap.fromImage(image), mode, state);
                }
            }

            previewArea.setIcon(icon);
        }

        private void addImages()
        {
            List<String> fileNames = QFileDialog.getOpenFileNames(this,
                                        tr("Open Images"), "",
                                        new QFileDialog.Filter(tr("Images (*.png *.xpm *.jpg);;"+
                                           "All Files (*)")));
            if (!fileNames.isEmpty()) {
                for (String fileName : fileNames) {
                    int row = imagesTable.rowCount();
                    imagesTable.setRowCount(row + 1);

                    String imageName = new QFileInfo(fileName).baseName();
                    QTableWidgetItem item0 = new QTableWidgetItem(imageName);
                    item0.setData(Qt.ItemDataRole.UserRole, fileName);
                    Qt.ItemFlags flags = item0.flags();
                    flags.clear(Qt.ItemFlag.ItemIsEditable);
                    item0.setFlags(flags);

                    QTableWidgetItem item1 = new QTableWidgetItem(tr("Normal"));
                    QTableWidgetItem item2 = new QTableWidgetItem(tr("Off"));

                    if (guessModeStateAct.isChecked()) {
                        if (fileName.contains("_act")) {
                            item1.setText(tr("Active"));
                        } else if (fileName.contains("_dis")) {
                            item1.setText(tr("Disabled"));
                        } else if (fileName.contains("_sel")) {
                            item1.setText(tr("Selected"));
                        }

                        if (fileName.contains("_on"))
                            item2.setText(tr("On"));
                    }

                    imagesTable.setItem(row, 0, item0);
                    imagesTable.setItem(row, 1, item1);
                    imagesTable.setItem(row, 2, item2);
                    imagesTable.openPersistentEditor(item1);
                    imagesTable.openPersistentEditor(item2);

                    item0.setCheckState(Qt.CheckState.Checked);
                }
            }
        }

        private void removeAllImages()
        {
            imagesTable.setRowCount(0);
            changeIcon();
        }

        private void createPreviewGroupBox()
        {
            previewGroupBox = new QGroupBox(tr("Preview"));

            previewArea = new IconPreviewArea();

            QVBoxLayout layout = new QVBoxLayout();
            layout.addWidget(previewArea);
            previewGroupBox.setLayout(layout);
        }

        private void createImagesGroupBox()
        {
            imagesGroupBox = new QGroupBox(tr("Images"));

            imagesTable = new QTableWidget();
            imagesTable.setSelectionMode(QAbstractItemView.SelectionMode.NoSelection);
            imagesTable.setItemDelegate(new ImageDelegate(this));

            List<String> labels = new LinkedList<String>();
            labels.add(tr("Image"));
            labels.add(tr("Mode"));
            labels.add(tr("State"));

            imagesTable.horizontalHeader().setDefaultSectionSize(90);
            imagesTable.setColumnCount(3);
            imagesTable.setHorizontalHeaderLabels(labels);
            imagesTable.horizontalHeader().setResizeMode(0, QHeaderView.ResizeMode.Stretch);
            imagesTable.horizontalHeader().setResizeMode(1, QHeaderView.ResizeMode.Fixed);
            imagesTable.horizontalHeader().setResizeMode(2, QHeaderView.ResizeMode.Fixed);
            imagesTable.verticalHeader().hide();

            imagesTable.itemChanged.connect(this, "changeIcon()");

            QVBoxLayout layout = new QVBoxLayout();
            layout.addWidget(imagesTable);
            imagesGroupBox.setLayout(layout);
        }

        private void createIconSizeGroupBox()
        {
            iconSizeGroupBox = new QGroupBox(tr("Icon Size"));

            smallRadioButton = new QRadioButton();
            largeRadioButton = new QRadioButton();
            toolBarRadioButton = new QRadioButton();
            listViewRadioButton = new QRadioButton();
            iconViewRadioButton = new QRadioButton();
            tabBarRadioButton = new QRadioButton();
            otherRadioButton = new QRadioButton(tr("Other:"));

            otherSpinBox = new IconSizeSpinBox();
            otherSpinBox.setRange(8, 128);
            otherSpinBox.setValue(64);

            smallRadioButton.toggled.connect(this, "changeSize(boolean)");
            largeRadioButton.toggled.connect(this, "changeSize(boolean)");
            toolBarRadioButton.toggled.connect(this, "changeSize(boolean)");
            listViewRadioButton.toggled.connect(this, "changeSize(boolean)");
            iconViewRadioButton.toggled.connect(this, "changeSize(boolean)");
            tabBarRadioButton.toggled.connect(this, "changeSize(boolean)");
            otherRadioButton.toggled.connect(this, "changeSize(boolean)");
            otherSpinBox.valueChanged.connect(this, "changeSize(int)");

            QHBoxLayout otherSizeLayout = new QHBoxLayout();
            otherSizeLayout.addWidget(otherRadioButton);
            otherSizeLayout.addWidget(otherSpinBox);
            otherSizeLayout.addStretch();

            QGridLayout layout = new QGridLayout();
            layout.addWidget(smallRadioButton, 0, 0);
            layout.addWidget(largeRadioButton, 1, 0);
            layout.addWidget(toolBarRadioButton, 2, 0);
            layout.addWidget(listViewRadioButton, 0, 1);
            layout.addWidget(iconViewRadioButton, 1, 1);
            layout.addWidget(tabBarRadioButton, 2, 1);
            layout.addLayout(otherSizeLayout, 3, 0, 1, 2);
            layout.setRowStretch(4, 1);
            iconSizeGroupBox.setLayout(layout);
        }

        private void createActions()
        {
            addImagesAct = new QAction(tr("&Add Images..."), this);
            addImagesAct.setShortcut(tr("Ctrl+A"));
            addImagesAct.triggered.connect(this, "addImages()");

            removeAllImagesAct = new QAction(tr("&Remove All Images"), this);
            removeAllImagesAct.setShortcut(tr("Ctrl+R"));
            removeAllImagesAct.triggered.connect(this, "removeAllImages()");

            exitAct = new QAction(tr("&Quit"), this);
            exitAct.setShortcut(tr("Ctrl+Q"));
            exitAct.triggered.connect(this, "close()");

            styleActionGroup = new QActionGroup(this);
            for (String styleName : QStyleFactory.keys()) {
                QAction action = new QAction(styleActionGroup);
                action.setText(styleName + " Style");
                action.setData(styleName);
                action.setCheckable(true);
                action.triggered.connect(this, "changeStyle(boolean)");
            }

            guessModeStateAct = new QAction(tr("&Guess Image Mode/State"), this);
            guessModeStateAct.setCheckable(true);
            guessModeStateAct.setChecked(true);

            aboutAct = new QAction(tr("&About"), this);
            aboutAct.triggered.connect(this, "about()");

            aboutQtAct = new QAction(tr("About &Qt"), this);
            aboutQtAct.triggered.connect(QApplication.instance(), "aboutQt()");
        }

        private void createMenus()
        {
            fileMenu = menuBar().addMenu(tr("&File"));
            fileMenu.addAction(addImagesAct);
            fileMenu.addAction(removeAllImagesAct);
            fileMenu.addSeparator();
            fileMenu.addAction(exitAct);

            viewMenu = menuBar().addMenu(tr("&View"));
            for (QAction action : styleActionGroup.actions())
                viewMenu.addAction(action);
            viewMenu.addSeparator();
            viewMenu.addAction(guessModeStateAct);

            menuBar().addSeparator();

            helpMenu = menuBar().addMenu(tr("&Help"));
            helpMenu.addAction(aboutAct);
            helpMenu.addAction(aboutQtAct);
        }

        private void createContextMenu()
        {
            imagesTable.setContextMenuPolicy(Qt.ContextMenuPolicy.ActionsContextMenu);
            imagesTable.addAction(addImagesAct);
            imagesTable.addAction(removeAllImagesAct);
        }

        private void checkCurrentStyle()
        {
            for (QAction action : styleActionGroup.actions()) {
                String styleName = action.data().toString();
                QStyle candidate = QStyleFactory.create(styleName);

                if (candidate.objectName().equals(
                        QApplication.style().objectName())) {
                    action.trigger();
                    return;
                }
            }
        }

        class IconSizeSpinBox extends QSpinBox
        {
            @Override
            public int valueFromText(String text)
            {
                QRegExp regExp = new QRegExp(tr("(\\d+)(\\s*[xx]\\s*\\d+)?"));

                if (regExp.exactMatch(text)) {
                    return Integer.parseInt(regExp.cap(1));
                } else {
                    return 0;
                }
            }

            @Override
            public String textFromValue(int value)
            {
                return "" + value +" x " + value;
            }
        }

        class ImageDelegate extends QItemDelegate
        {
            public ImageDelegate(QWidget widget)
            {
                super(widget);
            }

            @Override
            public QWidget createEditor(QWidget parent, QStyleOptionViewItem option,
                                        QModelIndex index)
            {
                QComboBox comboBox = new QComboBox(parent);
                if (index.column() == 1) {
                    comboBox.addItem(tr("Normal"));
                    comboBox.addItem(tr("Active"));
                    comboBox.addItem(tr("Disabled"));
                    comboBox.addItem(tr("Selected"));
                } else if (index.column() == 2) {
                    comboBox.addItem(tr("Off"));
                    comboBox.addItem(tr("On"));
                }

                comboBox.activated.connect(this, "emitCommitData()");

                return comboBox;
            }

            @Override
            public void setEditorData(QWidget editor, QModelIndex index)
            {
                QComboBox comboBox = (QComboBox) editor;
                if (comboBox == null)
                    return;

                int pos = comboBox.findText((String) index.model().data(index),
                                             Qt.MatchFlag.MatchExactly);
                comboBox.setCurrentIndex(pos);
            }

            @Override
            public void setModelData(QWidget editor, QAbstractItemModel model,
                                     QModelIndex index)
            {
                QComboBox comboBox = (QComboBox) editor;
                if (comboBox == null)
                    return;

                model.setData(index, comboBox.currentText());
            }

            private void emitCommitData()
            {
                commitData.emit((QWidget) QSignalEmitter.signalSender());
            }
        }

        class IconPreviewArea extends QWidget
        {
            private QIcon icon;
            private QSize size;
            private QLabel stateLabels[] = new QLabel[NumStates];
            private QLabel modeLabels[] = new QLabel[NumModes];
            private QLabel pixmapLabels[][] = new QLabel[NumModes][NumStates];

            public static final int NumModes = 4, NumStates = 2;

            public IconPreviewArea()
            {
                QGridLayout mainLayout = new QGridLayout();
                setLayout(mainLayout);

                icon = new QIcon();

                stateLabels[0] = createHeaderLabel(tr("Off"));
                stateLabels[1] = createHeaderLabel(tr("On"));

                modeLabels[0] = createHeaderLabel(tr("Normal"));
                modeLabels[1] = createHeaderLabel(tr("Active"));
                modeLabels[2] = createHeaderLabel(tr("Disabled"));
                modeLabels[3] = createHeaderLabel(tr("Selected"));

                for (int j = 0; j < NumStates; ++j)
                    mainLayout.addWidget(stateLabels[j], j + 1, 0);

                for (int i = 0; i < NumModes; ++i) {
                    mainLayout.addWidget(modeLabels[i], 0, i + 1);

                    for (int j = 0; j < NumStates; ++j) {
                        pixmapLabels[i][j] = createPixmapLabel();
                        mainLayout.addWidget(pixmapLabels[i][j], j + 1, i + 1);
                    }
                }
            }

            public void setIcon(QIcon icon)
            {
                this.icon = icon;
                updatePixmapLabels();
            }

            public void setSize(QSize size)
            {
                if (size != this.size) {
                    this.size = size;
                    updatePixmapLabels();
                }
            }

            private QLabel createHeaderLabel(String text)
            {
                QLabel label = new QLabel(tr("<b>"+text+"</b>"));
                label.setAlignment(Qt.AlignmentFlag.AlignCenter);
                return label;
            }

            private QLabel createPixmapLabel()
            {
                QLabel label = new QLabel();
                label.setEnabled(false);
                label.setAlignment(Qt.AlignmentFlag.AlignCenter);
                label.setFrameShape(QFrame.Shape.Box);
                label.setSizePolicy(QSizePolicy.Policy.Expanding,
                                    QSizePolicy.Policy.Expanding);
                label.setBackgroundRole(QPalette.ColorRole.Base);
                label.setAutoFillBackground(true);
                label.setMinimumSize(132, 132);
                return label;
            }

            private void updatePixmapLabels()
            {
                for (int i = 0; i < NumModes; ++i) {
                    QIcon.Mode mode;
                    if (i == 0) {
                        mode = QIcon.Mode.Normal;
                    } else if (i == 1) {
                        mode = QIcon.Mode.Active;
                    } else if (i == 2) {
                        mode = QIcon.Mode.Disabled;
                    } else {
                        mode = QIcon.Mode.Selected;
                    }

                    for (int j = 0; j < NumStates; ++j) {
                        QIcon.State state = (j == 0) ? QIcon.State.Off : QIcon.State.On;
                        QPixmap pixmap = icon.pixmap(size, mode, state);
                        pixmapLabels[i][j].setPixmap(pixmap);
                        pixmapLabels[i][j].setEnabled(!pixmap.isNull());
                    }
                }
            }
        }

        public static void main(String args[])
        {
            QApplication.initialize(args);

            new Icons().show();

            QApplication.exec();
        }
    }