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.api.model;
042:
043: import java.util.Set;
044: import java.util.HashMap;
045:
046: /**
047: * The class represents a document change event. There is an only one event type for document changes. The class tracks
048: * all types of changes. Types of changes are: Any change of a property value, components hierarchy, or selection.
049: * <p>
050: * The event also contains all values of property values. These old values are one that were store at the begining of the transaction.
051: * When a property is overriden many times, only the newest value is stored in the document and the oldest value is stored
052: * in the event.
053: * <p>
054: * When a component hierarchy is changed, the event remembers which components were affected during the transaction.
055: * The newest hierarchy is stored in the document. There is no way how to resolve state before the transaction. Also
056: * when a component is removed from and then added back to structure, so hierarchy is the same as before, an event is fired
057: * anyway and the component and its parent are marked as hierarchy-modified.
058: * <p>
059: * When a component is created, the event remembers all those components that were created during the transaction.
060: *
061: * @author David Kaspar
062: */
063: public final class DesignEvent {
064:
065: private final long eventID;
066:
067: private final Set<DesignComponent> fullyComponents;
068: private final Set<DesignComponent> partlyComponents;
069:
070: private final Set<DesignComponent> fullyHierarchies;
071: private final Set<DesignComponent> partlyHierarchies;
072:
073: private Set<DesignComponent> descriptorChangedComponents;
074:
075: private Set<DesignComponent> createdComponents;
076:
077: // NOTE - do not expose this
078: private HashMap<DesignComponent, HashMap<String, PropertyValue>> oldPropertyValues;
079:
080: private boolean selectionChanged;
081:
082: private boolean structureChanged;
083:
084: DesignEvent(
085: long eventID,
086: Set<DesignComponent> fullyComponents,
087: Set<DesignComponent> partlyComponents,
088: Set<DesignComponent> fullyHierarchies,
089: Set<DesignComponent> partlyHierarchies,
090: Set<DesignComponent> descriptorChangedComponents,
091: Set<DesignComponent> createdComponents,
092: HashMap<DesignComponent, HashMap<String, PropertyValue>> oldPropertyValues,
093: boolean selectionChanged) {
094: this .eventID = eventID;
095: this .fullyComponents = fullyComponents;
096: this .partlyComponents = partlyComponents;
097: this .fullyHierarchies = fullyHierarchies;
098: this .partlyHierarchies = partlyHierarchies;
099: this .descriptorChangedComponents = descriptorChangedComponents;
100: this .createdComponents = createdComponents;
101: this .oldPropertyValues = oldPropertyValues;
102: this .selectionChanged = selectionChanged;
103:
104: this .structureChanged = !(fullyComponents.isEmpty()
105: && partlyComponents.isEmpty()
106: && fullyHierarchies.isEmpty()
107: && partlyHierarchies.isEmpty()
108: && descriptorChangedComponents.isEmpty()
109: && createdComponents.isEmpty() && oldPropertyValues
110: .isEmpty());
111: }
112:
113: /**
114: * Returns an event id. The id is increasing non-negative number.
115: * @return the event id
116: */
117: public long getEventID() {
118: return eventID;
119: }
120:
121: /**
122: * Returns a set of all components that have at least one property changed during a transaction.
123: * @return the set of fully property-affected components
124: */
125: public Set<DesignComponent> getFullyAffectedComponents() {
126: return fullyComponents;
127: }
128:
129: /**
130: * Returns a set of all components that have changed their placement in components-hierarchy during a transaction.
131: * <p>
132: * An affected component is the one that is added to or removed from a parent component. The parent component is
133: * an affected component too.
134: * @return the set of fully hierarchy-affected components
135: */
136: public Set<DesignComponent> getFullyAffectedHierarchies() {
137: return fullyHierarchies;
138: }
139:
140: /**
141: * Returns a set of all components where they or one of their sub-components have at least one property changed during a transaction.
142: * @return the set of partly property-affected components
143: */
144: public Set<DesignComponent> getPartlyAffectedComponents() {
145: return partlyComponents;
146: }
147:
148: /**
149: * Returns a set of all components where they or one of their sub-components have changed their placement
150: * in components-hierarchy during a transaction.
151: * <p>
152: * An affected component is the one that is added to or removed from a parent component. The parent component is
153: * an affected component too.
154: * @return the set of partly hierarchy-affected components
155: */
156: public Set<DesignComponent> getPartlyAffectedHierarchies() {
157: return partlyHierarchies;
158: }
159:
160: /**
161: * Returns a set of all components whose component descriptor is changed during a transaction because of component-descriptor-registry update.
162: * @return the set of components with changed descriptor
163: */
164: public Set<DesignComponent> getDescriptorChangedComponents() {
165: return descriptorChangedComponents;
166: }
167:
168: /**
169: * Returns a set of all components that were created during a transaction.
170: * @return the set of created components
171: */
172: public Set<DesignComponent> getCreatedComponents() {
173: return createdComponents;
174: }
175:
176: /**
177: * Returns an old value of a property of a component.
178: * @param component the component
179: * @param propertyName the property name
180: * @return the old value, null if a property is not changed
181: */
182: public PropertyValue getOldPropertyValue(DesignComponent component,
183: String propertyName) {
184: HashMap<String, PropertyValue> properties = oldPropertyValues
185: .get(component);
186: if (properties == null)
187: return null;
188: return properties.get(propertyName);
189: }
190:
191: /**
192: * Returns whether a property of a component is changed.
193: * @param component the component
194: * @param propertyName the property name
195: * @return true, if a property is changed
196: */
197: public boolean isComponentPropertyChanged(
198: DesignComponent component, String propertyName) {
199: HashMap<String, PropertyValue> properties = oldPropertyValues
200: .get(component);
201: return properties != null
202: && properties.containsKey(propertyName);
203: }
204:
205: /**
206: * Returns whether a selection is changed. The actual selection is store in a document.
207: * @return true if changed.
208: */
209: public boolean isSelectionChanged() {
210: return selectionChanged;
211: }
212:
213: /**
214: * Returns whether a document structure is changed. It means a property, hierarchy, or a descriptor is changed.
215: * @return true if a structure is changed
216: */
217: public boolean isStructureChanged() {
218: return structureChanged;
219: }
220:
221: }
|