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;
}
}