categoryeditui.java

来自「Rapla是一个灵活的多用户资源管理系统。它提供的一些功能有:日历GUI」· Java 代码 · 共 560 行 · 第 1/2 页

JAVA
560
字号
/*--------------------------------------------------------------------------*
 | Copyright (C) 2006 Christopher Kohlhaas                                  |
 |                                                                          |
 | 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. A copy of the license has been included with   |
 | these distribution in the COPYING file, if not go to www.fsf.org         |
 |                                                                          |
 | As a special exception, you are granted the permissions to link this     |
 | program with every library, which license fulfills the Open Source       |
 | Definition as published by the Open Source Initiative (OSI).             |
 *--------------------------------------------------------------------------*/
package org.rapla.gui.internal.edit;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JColorChooser;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;

import org.rapla.components.calendar.RaplaArrowButton;
import org.rapla.components.layout.TableLayout;
import org.rapla.components.util.Tools;
import org.rapla.entities.Category;
import org.rapla.entities.CategoryAnnotations;
import org.rapla.framework.RaplaContext;
import org.rapla.framework.RaplaException;
import org.rapla.gui.EditComponent;
import org.rapla.gui.RaplaGUIComponent;
import org.rapla.gui.TreeFactory;
import org.rapla.gui.toolkit.RaplaButton;
import org.rapla.gui.toolkit.RaplaColorList;
import org.rapla.gui.toolkit.RaplaTree;
import org.rapla.gui.toolkit.RaplaWidget;
import org.rapla.gui.toolkit.RecursiveNode;

/**
 *  @author Christopher Kohlhaas
 */
public class CategoryEditUI extends RaplaGUIComponent
    implements
    EditComponent
    ,RaplaWidget
{
    JPanel panel = new JPanel();

    JPanel toolbar = new JPanel();
    RaplaButton newButton = new RaplaButton();
    RaplaButton newSubButton = new RaplaButton();
    RaplaButton removeButton = new RaplaButton();
    RaplaArrowButton moveUpButton = new RaplaArrowButton('^', 25);
    RaplaArrowButton moveDownButton = new RaplaArrowButton('v', 25);

    JCheckBox editAdvanced = new JCheckBox();

    CategoryNode rootNode;
    Category rootCategory;
    CategoryDetail detailPanel;
    RaplaTreeEdit treeEdit;
    DefaultTreeModel model;
    boolean editKeys;
    Listener listener = new Listener();
    TreeCellRenderer iconRenderer;

    public CategoryEditUI(RaplaContext sm) throws RaplaException {
        super( sm);
        detailPanel = new CategoryDetail(sm);
        panel.setPreferredSize( new Dimension( 690,350 ) );
        treeEdit = new RaplaTreeEdit( getI18n(),detailPanel.getComponent(), listener );
        treeEdit.setListDimension( new Dimension( 250,100 ) );
        toolbar.setLayout( new BoxLayout(toolbar, BoxLayout.X_AXIS));
        toolbar.add(newButton);
        toolbar.add(newSubButton);
        toolbar.add( Box.createHorizontalStrut( 5 ));
        toolbar.add(removeButton);
        toolbar.add( Box.createHorizontalStrut( 5 ));
        toolbar.add(moveUpButton);
        toolbar.add(moveDownButton);
        toolbar.add(editAdvanced);
        panel.setLayout( new BorderLayout() );
        toolbar.add( editAdvanced );
        panel.add( toolbar, BorderLayout.NORTH );
        panel.add( treeEdit.getComponent(), BorderLayout.CENTER );

        editAdvanced.setOpaque( false );
        newButton.addActionListener(listener);
        newSubButton.addActionListener(listener);
        removeButton.addActionListener(listener);
        editAdvanced.addActionListener(listener);
        moveUpButton.addActionListener( listener );
        moveDownButton.addActionListener( listener );
        iconRenderer = getTreeFactory().createRenderer();
        treeEdit.getTree().setCellRenderer(  new TreeCellRenderer() {
            public Component getTreeCellRendererComponent(JTree tree
                    ,Object value
                    ,boolean sel
                    ,boolean expanded
                    ,boolean leaf
                    ,int row
                    ,boolean hasFocus
            ) {
                if ( value instanceof CategoryNode) {
                    Category c = (Category) ((CategoryNode)value).getCategory();
                    value = c.getName(getRaplaLocale().getLocale());
                    if (editKeys) {
                        value = "{" + c.getKey() + "} " + value;
                    }
                }
                return iconRenderer.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus );
            }
        });
        newButton.setText( getString("new_category") );
        newButton.setIcon( getIcon("icon.new"));
        newSubButton.setText( getString("new_sub-category") );
        newSubButton.setIcon( getIcon("icon.new") );
        removeButton.setText( getString("delete") );
        editAdvanced.setText( getString("edit_advanced") );
        removeButton.setIcon( getIcon("icon.delete") );

        detailPanel.addChangeListener( listener );
        detailPanel.setEditKeys( false );

        editAdvanced.setText(getString("edit_advanced"));

    }

    final private TreeFactory getTreeFactory() {
        return (TreeFactory) getService(TreeFactory.ROLE);
    }


    class Listener implements ActionListener,ChangeListener {
        public void actionPerformed(ActionEvent evt) {
            try {
                if ( evt.getSource() == newButton ) {
                    createCategory( false );
                } else if ( evt.getSource() == newSubButton ) {
                    createCategory( true );
                } else if ( evt.getSource() == removeButton ) {
                    removeCategory();
                } else if ( evt.getSource() == moveUpButton ) {
                    moveCategory( -1);
                } else if ( evt.getSource() == moveDownButton ) {
                    moveCategory( 1);
                } else if ( evt.getSource() == editAdvanced ) {
                    editKeys = editAdvanced.isSelected();
                    detailPanel.setEditKeys( editKeys );
                    updateModel();
                } else if (evt.getActionCommand().equals("edit")) {
                    detailPanel.mapFrom( treeEdit.getSelectedValue() );
                }
            } catch (RaplaException ex) {
                showException(ex, getComponent());
            }
        }
        public void stateChanged(ChangeEvent e) {
            try {
                confirmEdits();
            } catch (RaplaException ex) {
                showException(ex, getComponent());
            }
        }
    }

    public JComponent getComponent() {
        return panel;
    }

    public int getSelectedIndex() {
        return treeEdit.getSelectedIndex();
    }


    public void setObject(Object o) throws RaplaException {
        if (!(o instanceof Category))
            throw new RaplaException("Only category objects are accepted: " + o.getClass());
        this.rootCategory = (Category)o;
        updateModel();
    }

    private void createCategory(boolean bCreateSubCategory) throws RaplaException {
        confirmEdits();
        Category newCategory;
        RecursiveNode parentNode;
        TreePath path = treeEdit.getTree().getSelectionPath();
        if (path == null) {
            parentNode = rootNode;
        } else {
            RecursiveNode selectedNode = (RecursiveNode) path.getLastPathComponent();
            if (selectedNode.getParent() == null || bCreateSubCategory)
                parentNode = selectedNode;
            else
                parentNode = (RecursiveNode)selectedNode.getParent();
        }
        newCategory = createNewNodeAt( parentNode );
        updateModel();
        RecursiveNode newNode = rootNode.findNodeFor( newCategory );
        TreePath selectionPath = new TreePath( newNode.getPath() );
        treeEdit.getTree().setSelectionPath( selectionPath );
        detailPanel.requestFocus();
    }


    private String createNewKey(Category[] subCategories) {
        int max = 1;
        for (int i=0;i<subCategories.length;i++) {
            String key = subCategories[i].getKey();
            if (key.length()>1
                && key.charAt(0) =='c'
                && Character.isDigit(key.charAt(1))
                )
                {
                    try {
                        int value = Integer.valueOf(key.substring(1)).intValue();
                        if (value >= max)
                            max = value + 1;
                    } catch (NumberFormatException ex) {
                    }
                }
        }
        return "c" + (max);
    }

    // creates a new Category
    private Category createNewNodeAt(RecursiveNode parentNode) throws RaplaException {
        Category newCategory = getModification().newCategory();

        Category parent = ((CategoryNode) parentNode).getCategory();
        newCategory.setKey(createNewKey(parent.getCategories()));

         newCategory.getName().setName(getI18n().getLang(), getString("new_category") );

        parent.addCategory(newCategory);
        getLogger().debug(" new category " + newCategory + " added to " + parent);
        int index = parentNode.getIndexOfUserObject(newCategory);
        if (index <0 )
            throw new RaplaException("Can't insert new Category");
        return newCategory;
    }

    private void removeCategory() throws RaplaException {
        TreePath[] paths = treeEdit.getTree().getSelectionPaths();
        if ( paths == null )
            return;
        CategoryNode[] categoryNodes = new CategoryNode[paths.length];
        for (int i=0;i<paths.length;i++) {
            categoryNodes[i] = (CategoryNode) paths[i].getLastPathComponent();
        }
        removeNodes(categoryNodes);
        updateModel();
    }

    private void moveCategory( int direction ) throws RaplaException
    {
        TreePath[] paths = treeEdit.getTree().getSelectionPaths();
        if ( paths == null || paths.length == 0)
            return;
        CategoryNode categoryNode = (CategoryNode)paths[0].getLastPathComponent();
        if ( categoryNode == null)
        {
            return;
        }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?