001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041: package org.netbeans.modules.vmd.structure.document;
042:
043: import org.netbeans.modules.vmd.api.io.DataObjectContext;
044: import org.netbeans.modules.vmd.api.io.DesignDocumentAwareness;
045: import org.netbeans.modules.vmd.api.model.*;
046:
047: import javax.swing.*;
048: import java.util.Collection;
049:
050: /**
051: * @author David Kaspar
052: */
053: public class DocumentController implements DesignDocumentAwareness,
054: DesignListener {
055:
056: private DataObjectContext context;
057: private JToolBar toolbarRepresentation;
058: private JScrollPane scrollPane;
059:
060: private DesignDocument document;
061: private DocumentScene scene;
062: private JComponent view;
063:
064: public DocumentController(DataObjectContext context) {
065: this .context = context;
066: scene = new DocumentScene();
067: view = scene.createView();
068: scrollPane = new JScrollPane(view);
069: }
070:
071: public JComponent getVisualRepresentation() {
072: return scrollPane;
073: }
074:
075: public void setDesignDocument(final DesignDocument newDocument) {
076: SwingUtilities.invokeLater(new Runnable() {
077: public void run() {
078: updateDocumentReference(newDocument);
079: }
080: });
081: }
082:
083: public void attach() {
084: context.addDesignDocumentAwareness(this );
085: }
086:
087: public void deattach() {
088: context.removeDesignDocumentAwareness(this );
089: }
090:
091: public JComponent getToolbarRepresentation() {
092: if (toolbarRepresentation == null) {
093: toolbarRepresentation = new JToolBar();
094: toolbarRepresentation.setFloatable(false);
095: }
096: return toolbarRepresentation;
097: }
098:
099: private void updateDocumentReference(DesignDocument wantedDocument) {
100: if (document == wantedDocument)
101: return;
102: if (document != null)
103: document.getListenerManager().removeDesignListener(this );
104: document = wantedDocument;
105: if (document != null) {
106: document.getListenerManager().addDesignListener(this ,
107: new DesignEventFilter().setGlobal(true));
108: designChanged(null);
109: } else
110: scene.setupLoadingDocument();
111: }
112:
113: public void designChanged(DesignEvent event) {
114: SwingUtilities.invokeLater(new Runnable() {
115: public void run() {
116: final DesignDocument document = DocumentController.this .document;
117: if (document != null)
118: document.getTransactionManager().readAccess(
119: new Runnable() {
120: public void run() {
121: updateScene(document);
122: }
123: });
124: }
125: });
126: }
127:
128: private void updateScene(DesignDocument document) {
129: if (document == null)
130: return;
131:
132: scene.clear();
133: Collection<DesignComponent> selectedComponents = document
134: .getSelectedComponents();
135: DesignComponent rootComponent = document.getRootComponent();
136: ComponentWidget widget = new ComponentWidget(scene,
137: rootComponent, selectedComponents
138: .contains(rootComponent));
139: scene.setRootNode(document, widget);
140: updateForChildren(selectedComponents, widget, rootComponent);
141: scene.validate();
142: }
143:
144: private void updateForChildren(
145: Collection<DesignComponent> selectedComponents,
146: ComponentWidget widget, DesignComponent component) {
147: for (DesignComponent child : component.getComponents()) {
148: ComponentWidget childWidget = new ComponentWidget(scene,
149: child, selectedComponents.contains(child));
150: widget.addChildComponentWidget(childWidget);
151: updateForChildren(selectedComponents, childWidget, child);
152: }
153: }
154:
155: }
|