Package research

Source Code of research.DrawingEditorTabbedPane$CurrentViewChangeListener

package research;


import research.tool.Tool;
import de.reuse.DrawingViewPanel;

import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import javax.swing.*;
import java.util.ArrayList;
import java.awt.*;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;


/**
* Author: zhangwei
* Date: 2003-5-10
* Time: 19:13:29
*/

public class DrawingEditorTabbedPane extends JTabbedPane implements DrawingEditor {

    /** listenerList for FigureSelectionListeners */
    private final java.util.List figureSelectionListeners = new ArrayList();

    /** list which stores all views in this pane*/
    private final java.util.List viewList = new ArrayList();

    /** listener for selectedIndexChangeEvent*/
    private final ChangeListener myChangeListener = new InerChangeListener();

    /** listener for property DrawingEditor.CURRENT_VIEW_CHANGED **/
    private final PropertyChangeListener currentViewChangeListener = new CurrentViewChangeListener();

    private transient DrawingView currentView = null;

    private transient DrawingView lastView = null;

    private Tool currentTool = null;

    /** list which stores current closed views */
    private final java.util.List closedPaneList = new ArrayList();


    public DrawingEditorTabbedPane() {
        super();
        setTabLayoutPolicy(JTabbedPane.WRAP_TAB_LAYOUT);
        addChangeListener(myChangeListener);
        addPropertyChangeListener(DrawingEditor.CURRENT_VIEW_CHANGED, currentViewChangeListener);
        this.setBorder(BorderFactory.createEmptyBorder());
    }

    public int numOfView() {
        return viewList.size();
    }

    public boolean isEmpty() {
        return viewList.isEmpty();
    }

    public DrawingView createView(String viewName) {
        SaturnDrawingView view = new SaturnDrawingView(1600, 1200);
        SaturnDrawing drawing = new SaturnDrawing();
        drawing.setTitle(viewName);
        view.setDrawing(drawing);

        return view;
    }

    public boolean add(DrawingView view) {

        JComponent viewPanel = createViewPanel(view);
        viewList.add(view);
        this.firePropertyChange(DrawingEditor.VIEW_ADDED, null, view);

        this.add(viewPanel, view.getDrawing().getTitle());
        this.firePropertyChange(DrawingEditor.VIEW_OPENED, null, view);
        setSelectedComponent(viewPanel);

        return true;
    }

    public boolean remove(DrawingView view) {
        int count = getTabCount();
        for (int i = 0; i < count; i++) {
            JComponent comp = (JComponent) getComponentAt(i);
            if (comp instanceof JScrollPane) {
                JScrollPane scrollPane = (JScrollPane) comp;
                DrawingView view_tmp = (DrawingView) scrollPane.getViewport().getView();
                if (view_tmp == view) {
                    //remove from TabPane
                    removeTabAt(i);
                    //remove from ViewList
                    viewList.remove(view);
                    //file view destory event
                    this.firePropertyChange(DrawingEditor.VIEW_REMOVED, view, null);
                    //update current view
                    /**
                     * Theoretically speaking, we needn't to update currentView, because
                     * the model's stateChangeListener should update it.
                     * Unfortunately, the model of JTabblePane is only sensible to the change
                     * of current view's index, and it is not sensible to the change of the view.
                     * when a view is delete, his next view become the current view ,but the model's
                     * selected index still unchanges unless the deleted view is the last view.
                     * So we have to update current view, when the selected index not changes but the
                     * current view does change.
                     */
                    if (i == getSelectedIndex()) {
                        JScrollPane sp = (JScrollPane) getComponentAt(i);
                        lastView = currentView;
                        currentView = (DrawingView) sp.getViewport().getView();
                        this.firePropertyChange(DrawingEditor.CURRENT_VIEW_CHANGED, lastView, currentView);
                    }
                    /**
                     else
                     {
                     //the InerChangeListener will consider such a situation.
                     }
                     **/

                    return true;
                }
            }
        }

        return false;
    }

    /**
     * The code of this function is almost same with function "remove".
     * But in this function we need't remove view from viewlist and needn't
     * fire ViewDestroyingEvent. That's the different.
     */
    public boolean close(DrawingView view) {
        int count = getTabCount();
        for (int i = 0; i < count; i++) {
            JComponent comp = (JComponent) getComponentAt(i);
            if (comp instanceof JScrollPane) {
                JScrollPane scrollPane = (JScrollPane) comp;
                DrawingView view_tmp = (DrawingView) scrollPane.getViewport().getView();
                if (view_tmp == view) {
                    //remove from TabPane
                    removeTabAt(i);
                    //add to closedPaneList
                    closedPaneList.add(comp);
                    this.firePropertyChange(DrawingEditor.VIEW_CLOSED, lastView, null);
                    //update current view
                    if (i == getSelectedIndex()) {
                        JScrollPane sp = (JScrollPane) getComponentAt(i);
                        lastView = currentView;
                        currentView = (DrawingView) sp.getViewport().getView();
                        this.firePropertyChange(DrawingEditor.CURRENT_VIEW_CHANGED, lastView, currentView);
                    }

                    return true;
                }
            }
        }

        return false;
    }

    public boolean open(DrawingView view) {
        if (!viewList.contains(view)) return false;

        int index = -1;
        for (int i = 0; i < getTabCount(); i++) {
            JComponent comp = (JComponent) getComponentAt(i);
            if (comp instanceof JScrollPane) {
                JScrollPane scrollPane = (JScrollPane) comp;
                DrawingView view_tmp = (DrawingView) scrollPane.getViewport().getView();
                if (view_tmp == view) {
                    index = i;
                    break;
                }
            }
        }

        if (index >= 0) {
            //has opened in TabbedPane
            return false;
        } else {
            for (int i = 0; i < closedPaneList.size(); i++) {
                JScrollPane viewPanel = (JScrollPane) closedPaneList.get(i);
                DrawingView view_tmp = (DrawingView) viewPanel.getViewport().getView();
                if (view_tmp == view) {
                    closedPaneList.remove(i);
                }

                this.add(viewPanel, view.getDrawing().getTitle());
                setSelectedComponent(viewPanel);
                return true;
            }

            return false;
        }

    }

    public boolean contains(DrawingView view) {
        return viewList.contains(view);
    }

    public DrawingView[] toArray() {
        Object[] oResults = viewList.toArray();
        DrawingView[] results = new DrawingView[oResults.length];

        for (int i = 0; i < oResults.length; i++) {
            results[i] = (DrawingView) oResults[i];
        }

        return results;
    }

    public DrawingView[] getClosedViews(){
        Object[] objects = closedPaneList.toArray();

        int num = 0;
        if(objects != null){
            num = objects.length;
        }

        DrawingView[] views = new DrawingView[num];

        for (int i = 0; i < objects.length; i++) {
            JScrollPane jsp = (JScrollPane) objects[i];
            DrawingView view = (DrawingView) jsp.getViewport().getView();
            views[i] = view;
        }

        return views;
    }

    public DrawingView getCurrentView() {
        return currentView;
    }

    public void setCurrentView(DrawingView view) {
        int count = getTabCount();
        int index = -1;
        for (int i = 0; i < count; i++) {
            JComponent comp = (JComponent) getComponentAt(i);
            if (comp instanceof JScrollPane) {
                JScrollPane scrollPane = (JScrollPane) comp;
                DrawingView view_tmp = (DrawingView) scrollPane.getViewport().getView();
                if (view_tmp == view) {
                    index = i;
                    break;
                }
            }
        }

        if (index != -1)
            setSelectedIndex(index);

    }

    public DrawingView view() {
        return currentView;
    }

    public DrawingView[] views() {
        return toArray();
    }

    public void setTool(Tool tool) {
        currentTool = tool;

        if (currentView != null)
            currentView.setTool(tool);
    }

    public Tool getTool() {
        return currentTool;
    }

    public synchronized void addFigureSelectionListener(FigureSelectionListener fsListener) {
        figureSelectionListeners.add(fsListener);
    }

    public synchronized void removeFigureSelectionListener(FigureSelectionListener fsListener) {
        figureSelectionListeners.remove(fsListener);
    }

    public void figureSelectionChanged(DrawingView view) {
        fireSelectionChanged(view);
    }

    protected void fireSelectionChanged(DrawingView view) {
        FigureSelectionListener listener = null;
        for (int i = 0; i < figureSelectionListeners.size(); i++) {
            listener = (FigureSelectionListener) figureSelectionListeners.get(i);
            listener.figureSelectionChanged(view);
        }
    }

    /**
     public synchronized void addViewChangeListener(ViewChangeListener vsl) {
     viewChangeListeners.add(vsl);
     }

     public synchronized void removeViewChangeListener(ViewChangeListener vsl) {
     viewChangeListeners.remove(vsl);
     }

     protected void fireViewSelectionChangedEvent(DrawingView oldView, DrawingView newView) {
     ViewChangeListener listener = null;
     for (int i = 0; i < viewChangeListeners.size(); i++) {
     listener = (ViewChangeListener) viewChangeListeners.get(i);
     listener.viewSelectionChanged(oldView, newView);
     }
     }

     protected void fireViewCreatedEvent(DrawingView view) {
     ViewChangeListener listener = null;
     for (int i = 0; i < viewChangeListeners.size(); i++) {
     listener = (ViewChangeListener) viewChangeListeners.get(i);
     listener.viewAdded(view);
     }
     }

     protected void fireViewDestroyingEvent(DrawingView view) {
     ViewChangeListener listener = null;
     for (int i = 0; i < viewChangeListeners.size(); i++) {
     listener = (ViewChangeListener) viewChangeListeners.get(i);
     listener.viewRemoved(view);
     }
     }
     **/

    protected class InerChangeListener implements ChangeListener {
        public void stateChanged(ChangeEvent e) {
            JTabbedPane tabbedPane = (JTabbedPane) e.getSource();

            Component comp = tabbedPane.getSelectedComponent();

            if ((comp != null) && (comp instanceof DrawingViewPanel)) {
                lastView = currentView;
                currentView = ((DrawingViewPanel) comp).getDrawingView();
            } else {
                lastView = currentView;
                currentView = null;
            }

            firePropertyChange(DrawingEditor.CURRENT_VIEW_CHANGED, lastView, currentView);
        }
    }

    protected class CurrentViewChangeListener implements PropertyChangeListener {
        public void propertyChange(PropertyChangeEvent evt) {
            String propertyName = evt.getPropertyName();
            if (DrawingEditor.CURRENT_VIEW_CHANGED.equals(propertyName)) {
                DrawingView oldView = (DrawingView) evt.getOldValue();
                DrawingView newView = (DrawingView) evt.getNewValue();

                if (oldView != null) {
                    oldView.setTool(null);
                }

                if (newView != null) {
                    newView.setTool(getTool());
                }

            }
        }
    }

    /**
     protected class InerViewChangeListener implements ViewChangeListener {

     public void viewSelectionChanged(DrawingView oldView, DrawingView newView) {
     System.out.println("viewSelectionChanged");
     if (oldView != null) {
     oldView.setTool(null);
     }

     if (newView != null) {
     newView.setTool(getTool());
     }
     }

     public void viewAdded(DrawingView view) {
     System.out.println("viewCreated");
     }

     public void viewRemoved(DrawingView view) {
     System.out.println("viewDestroying");
     }

     public void viewOpened(DrawingView view){

     }

     public void viewClosed(DrawingView view){

     }
     }
     **/
    protected DrawingViewPanel createViewPanel(DrawingView view) {
        DrawingViewPanel vp = null;

        if (view instanceof Component) {
            view.setBackground(Color.white);
            vp = new DrawingViewPanel((JComponent) view);
            SwingUtilities.replaceUIActionMap(vp, null);
            SwingUtilities.replaceUIInputMap(vp, JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, null);

        } else {
            vp = new DrawingViewPanel();
            SwingUtilities.replaceUIActionMap(vp, null);
            SwingUtilities.replaceUIInputMap(vp, JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, null);
        }

        vp.setDrawingView(view);

        return vp;
    }

}
TOP

Related Classes of research.DrawingEditorTabbedPane$CurrentViewChangeListener

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.