Source code of the Treeview example

Browse below the source code for JWt's Treeview example.

  • treeviewdragdrop
    • src
      • eu.webtoolkit.jwt.examples.treeviewdragdrop
        • TreeViewDragDropApplication.java
          • FileModel.java
            • TreeViewDragDropMain.java
              • about.xml
                • FolderView.java
                  • FileEditDialog.java
                  • eu.webtoolkit.jwt.examples.treeviewdragdrop.data
                    • eu.webtoolkit.jwt.examples.treeviewdragdrop.csv
                    • lib
                      • WebRoot
                        • .settings
                          • build.xml
                            • .project
                              • .classpath.in
                                • .classpath
                                /*
                                 * Copyright (C) 2009 Emweb bvba, Leuven, Belgium.
                                 *
                                 * See the LICENSE file for terms of use.
                                 */
                                package eu.webtoolkit.jwt.examples.treeviewdragdrop;
                                
                                import java.io.BufferedReader;
                                import java.io.InputStream;
                                import java.io.InputStreamReader;
                                import java.util.EnumSet;
                                import java.util.HashMap;
                                import java.util.Map;
                                
                                import eu.webtoolkit.jwt.AlignmentFlag;
                                import eu.webtoolkit.jwt.ItemDataRole;
                                import eu.webtoolkit.jwt.ItemFlag;
                                import eu.webtoolkit.jwt.Orientation;
                                import eu.webtoolkit.jwt.SelectionMode;
                                import eu.webtoolkit.jwt.Signal;
                                import eu.webtoolkit.jwt.Signal2;
                                import eu.webtoolkit.jwt.SortOrder;
                                import eu.webtoolkit.jwt.WApplication;
                                import eu.webtoolkit.jwt.WContainerWidget;
                                import eu.webtoolkit.jwt.WDate;
                                import eu.webtoolkit.jwt.WEnvironment;
                                import eu.webtoolkit.jwt.WGridLayout;
                                import eu.webtoolkit.jwt.WItemDelegate;
                                import eu.webtoolkit.jwt.WLength;
                                import eu.webtoolkit.jwt.WModelIndex;
                                import eu.webtoolkit.jwt.WMouseEvent;
                                import eu.webtoolkit.jwt.WSortFilterProxyModel;
                                import eu.webtoolkit.jwt.WStandardItem;
                                import eu.webtoolkit.jwt.WStandardItemModel;
                                import eu.webtoolkit.jwt.WTableView;
                                import eu.webtoolkit.jwt.WText;
                                import eu.webtoolkit.jwt.WTreeView;
                                import eu.webtoolkit.jwt.WVBoxLayout;
                                import eu.webtoolkit.jwt.WWidget;
                                import eu.webtoolkit.jwt.WXmlLocalizedStrings;
                                import eu.webtoolkit.jwt.chart.LabelOption;
                                import eu.webtoolkit.jwt.chart.WPieChart;
                                import eu.webtoolkit.jwt.examples.treeviewdragdrop.csv.CsvUtil;
                                
                                /**
                                 * Main application class.
                                 */
                                public class TreeViewDragDropApplication extends WApplication {
                                    /**
                                     * Constructor.
                                     */
                                    public TreeViewDragDropApplication(WEnvironment env) {
                                        super(env);
                                        
                                        setCssTheme("polished");
                                
                                        WXmlLocalizedStrings resourceBundle = new WXmlLocalizedStrings();
                                        resourceBundle
                                                .use("/eu/webtoolkit/jwt/examples/treeviewdragdrop/about");
                                        setLocalizedStrings(resourceBundle);
                                
                                        /*
                                         * Create the data models.
                                         */
                                        folderModel_ = new WStandardItemModel(0, 1, this);
                                        populateFolders();
                                
                                        fileModel_ = new FileModel(this);
                                        populateFiles();
                                
                                        fileFilterModel_ = new WSortFilterProxyModel(this);
                                        fileFilterModel_.setSourceModel(fileModel_);
                                        fileFilterModel_.setDynamicSortFilter(true);
                                        fileFilterModel_.setFilterKeyColumn(0);
                                        fileFilterModel_.setFilterRole(ItemDataRole.UserRole);
                                
                                        /*
                                         * Setup the user interface.
                                         */
                                        createUI();
                                    }
                                
                                    /**
                                     * The folder model (used by folderView_)
                                     */
                                    private WStandardItemModel folderModel_;
                                
                                    /**
                                     * The file model (used by fileView_)
                                     */
                                    private WStandardItemModel fileModel_;
                                
                                    /**
                                     * The sort filter proxy model that adapts fileModel_
                                     */
                                    private WSortFilterProxyModel fileFilterModel_;
                                
                                    /**
                                     * Maps folder id's to folder descriptions.
                                     */
                                    private Map<String, String> folderNameMap_ = new HashMap<String, String>();
                                
                                    /**
                                     * The folder view.
                                     */
                                    private WTreeView folderView_;
                                
                                    /**
                                     * The file view.
                                     */
                                    private WTableView fileView_;
                                
                                    /**
                                     * Setup the user interface.
                                     */
                                    private void createUI() {
                                        WContainerWidget w = getRoot();
                                        w.setStyleClass("maindiv");
                                
                                        /*
                                         * The main layout is a 3x2 grid layout.
                                         */
                                        WGridLayout layout = new WGridLayout();
                                        layout.addWidget(createTitle("Folders"), 0, 0);
                                        layout.addWidget(createTitle("Files"), 0, 1);
                                        layout.addWidget(folderView(), 1, 0);
                                        layout.setColumnResizable(0);
                                
                                        // select the first folder
                                        folderView_.select(folderModel_.getIndex(0, 0, folderModel_.getIndex(0,
                                                0)));
                                
                                        WVBoxLayout vbox = new WVBoxLayout();
                                        vbox.addWidget(fileView(), 0);
                                        vbox.addWidget(pieChart(), 0);
                                        vbox.setResizable(0);
                                
                                        layout.addLayout(vbox, 1, 1);
                                
                                        layout.addWidget(aboutDisplay(), 2, 0, 1, 2, AlignmentFlag.AlignTop);
                                
                                        /*
                                         * Let row 1 and column 1 take the excess space.
                                         */
                                        layout.setRowStretch(1, 1);
                                        layout.setColumnStretch(1, 1);
                                
                                        w.setLayout(layout);
                                    }
                                
                                    /**
                                     * Creates a title widget.
                                     */
                                    private WText createTitle(String title) {
                                        WText result = new WText(title);
                                        result.setInline(false);
                                        result.setStyleClass("title");
                                
                                        return result;
                                    }
                                
                                    /**
                                     * Creates the folder WTreeView
                                     */
                                    private WTreeView folderView() {
                                        WTreeView treeView = new FolderView();
                                
                                        /*
                                         * To support right-click, we need to disable the built-in browser
                                         * context menu.
                                         * 
                                         * Note that disabling the context menu and catching the right-click
                                         * does not work reliably on all browsers.
                                         */
                                        treeView
                                                .setAttributeValue("oncontextmenu",
                                                        "event.cancelBubble = true; event.returnValue = false; return false;");
                                        treeView.setModel(folderModel_);
                                        treeView.resize(new WLength(200), WLength.Auto);
                                        treeView.setSelectionMode(SelectionMode.SingleSelection);
                                        treeView.expandToDepth(1);
                                        treeView.selectionChanged().addListener(this, new Signal.Listener() {
                                            public void trigger() {
                                                folderChanged();
                                            }
                                        });
                                
                                        folderView_ = treeView;
                                
                                        return treeView;
                                    }
                                
                                    /**
                                     * Creates the file table view (also a WTreeView)
                                     */
                                    private WTableView fileView() {
                                        WTableView tableView = new WTableView();
                                
                                        // Hide the tree-like decoration on the first column, to make it
                                        // resemble a plain table
                                        tableView.setAlternatingRowColors(true);
                                
                                        tableView.setModel(fileFilterModel_);
                                        tableView.setSelectionMode(SelectionMode.ExtendedSelection);
                                        tableView.setDragEnabled(true);
                                
                                        tableView.setColumnWidth(0, new WLength(100));
                                        tableView.setColumnWidth(1, new WLength(150));
                                        tableView.setColumnWidth(2, new WLength(100));
                                        tableView.setColumnWidth(3, new WLength(60));
                                        tableView.setColumnWidth(4, new WLength(100));
                                        tableView.setColumnWidth(5, new WLength(100));
                                
                                        WItemDelegate delegate = new WItemDelegate(this);
                                        delegate.setTextFormat(FileModel.dateDisplayFormat);
                                        tableView.setItemDelegateForColumn(4, delegate);
                                        tableView.setItemDelegateForColumn(5, delegate);
                                
                                        tableView.setColumnAlignment(3, AlignmentFlag.AlignRight);
                                        tableView.setColumnAlignment(4, AlignmentFlag.AlignRight);
                                        tableView.setColumnAlignment(5, AlignmentFlag.AlignRight);
                                
                                        tableView.sortByColumn(1, SortOrder.AscendingOrder);
                                
                                        tableView.doubleClicked().addListener(this,
                                                new Signal2.Listener<WModelIndex, WMouseEvent>() {
                                                    public void trigger(WModelIndex mi, WMouseEvent me) {
                                                        editFile(mi);
                                                    }
                                                });
                                
                                        fileView_ = tableView;
                                
                                        return tableView;
                                    }
                                
                                    /**
                                     * Edit a particular row.
                                     */
                                    private void editFile(WModelIndex item) {
                                        new FileEditDialog(fileView_.getModel(), item);
                                    }
                                
                                    /**
                                     * Creates the chart.
                                     */
                                    private WWidget pieChart() {
                                        WPieChart chart = new WPieChart();
                                        chart.setModel(fileFilterModel_);
                                        chart.setTitle("File sizes");
                                
                                        chart.setLabelsColumn(1); // Name
                                        chart.setDataColumn(3); // Size
                                
                                        chart.setPerspectiveEnabled(true, 0.2);
                                        chart.setDisplayLabels(LabelOption.Outside, LabelOption.TextLabel);
                                
                                        chart.setStyleClass("about");
                                
                                        return chart;
                                    }
                                
                                    /**
                                     * Creates the hints text.
                                     */
                                    private WWidget aboutDisplay() {
                                        WText result = new WText(tr("about-text"));
                                        result.setStyleClass("about");
                                        return result;
                                    }
                                
                                    /**
                                     * Change the filter on the file view when the selected folder changes.
                                     */
                                    void folderChanged() {
                                        if (folderView_.getSelectedIndexes().size() == 0)
                                            return;
                                
                                        WModelIndex selected = folderView_.getSelectedIndexes().first();
                                        Object d = selected.getData(ItemDataRole.UserRole);
                                        if (d != null) {
                                            String folder = (String) d;
                                
                                            // For simplicity, we assume here that the folder-id does not
                                            // contain special regexp characters, otherwise these need to be
                                            // escaped -- or use the \Q \E qutoing escape regular expression
                                            // syntax (and escape \E)
                                            fileFilterModel_.setFilterRegExp(folder);
                                        }
                                    }
                                
                                    /**
                                     * Populate the files model.
                                     * 
                                     * Data (and headers) is read from the CSV file. We add icons to the first
                                     * column, resolve the folder id to the actual folder name, and configure
                                     * item flags, and parse date values.
                                     */
                                    private void populateFiles() {
                                        fileModel_.getInvisibleRootItem().setRowCount(0);
                                
                                        InputStream is = fileModel_.getClass().getResourceAsStream(
                                                "/eu/webtoolkit/jwt/examples/treeviewdragdrop/data/files.csv");
                                        CsvUtil.readFromCsv(new BufferedReader(new InputStreamReader(is)),
                                                fileModel_);
                                
                                        for (int i = 0; i < fileModel_.getRowCount(); ++i) {
                                            WStandardItem item = fileModel_.getItem(i, 0);
                                            EnumSet<ItemFlag> flags = item.getFlags();
                                            flags.add(ItemFlag.ItemIsDragEnabled);
                                            item.setFlags(flags);
                                            item.setIcon("pics/file.gif");
                                
                                            String folderId = item.getText().getValue();
                                
                                            item.setData(folderId, ItemDataRole.UserRole);
                                            item.setText(folderNameMap_.get(folderId));
                                
                                            convertToDate(fileModel_.getItem(i, 4));
                                            convertToDate(fileModel_.getItem(i, 5));
                                        }
                                    }
                                
                                    /**
                                     * Convert a string to a date.
                                     */
                                    private void convertToDate(WStandardItem item) {
                                        WDate d = WDate.fromString(item.getText().getValue(),
                                                FileModel.dateEditFormat);
                                        item.setData(d, ItemDataRole.DisplayRole);
                                    }
                                
                                    /**
                                     * Populate the folders model.
                                     */
                                    private void populateFolders() {
                                        WStandardItem level1;
                                
                                        folderModel_.appendRow(level1 = createFolderItem("San Fransisco"));
                                        level1.appendRow(createFolderItem("Investors", "sf-investors"));
                                        level1.appendRow(createFolderItem("Fellows", "sf-fellows"));
                                
                                        folderModel_.appendRow(level1 = createFolderItem("Sophia Antipolis"));
                                        level1.appendRow(createFolderItem("R&D", "sa-r_d"));
                                        level1.appendRow(createFolderItem("Services", "sa-services"));
                                        level1.appendRow(createFolderItem("Support", "sa-support"));
                                        level1.appendRow(createFolderItem("Billing", "sa-billing"));
                                
                                        folderModel_.appendRow(level1 = createFolderItem("New York"));
                                        level1.appendRow(createFolderItem("Marketing", "ny-marketing"));
                                        level1.appendRow(createFolderItem("Sales", "ny-sales"));
                                        level1.appendRow(createFolderItem("Advisors", "ny-advisors"));
                                
                                        folderModel_.appendRow(level1 = createFolderItem("Frankfürt"));
                                        level1.appendRow(createFolderItem("Sales", "frank-sales"));
                                
                                        folderModel_.setHeaderData(0, Orientation.Horizontal, "SandBox");
                                    }
                                
                                    /**
                                     * Create a folder item.
                                     * 
                                     * Configures flags for drag and drop support.
                                     */
                                    private WStandardItem createFolderItem(String location) {
                                        return createFolderItem(location, null);
                                    }
                                
                                    /**
                                     * Create a folder item.
                                     * 
                                     * Configures flags for drag and drop support.
                                     */
                                    private WStandardItem createFolderItem(String location, String folderId) {
                                        WStandardItem result = new WStandardItem(location);
                                
                                        EnumSet<ItemFlag> flags = result.getFlags();
                                
                                        if (folderId != null) {
                                            result.setData(folderId);
                                            flags.add(ItemFlag.ItemIsDropEnabled);
                                            result.setFlags(flags);
                                            folderNameMap_.put(folderId, location);
                                        } else {
                                            flags.remove(ItemFlag.ItemIsSelectable);
                                            result.setFlags(flags);
                                        }
                                
                                        result.setIcon("pics/folder.gif");
                                
                                        return result;
                                    }
                                }