svn commit: r15510 - branches/gsoc2008/work_issue5029_maurelio1234: . src/org/argouml/i18n src/org/argouml/kernel src/org/argouml/notation/providers/uml src/org/argouml/profile src/org/argouml/profile/init src/org/argouml/profile/internal src/org/argouml/ui src/org/argouml/ui/explorer src/org/argouml/uml src/org/argouml/uml/diagram/ui src/org/argouml/uml/reveng/java src/org/argouml/uml/reveng/ui src/org/argouml/uml/ui src/org/argouml/uml/ui/foundation/core src/org/argouml/uml/ui/foundation/extension_mechanisms src/org/argouml/uml/ui/model_management tests/org/argouml/application tests/org/argouml/kernel tests/org/argouml/persistence tests/org/argouml/profile/internal tests/org/argouml/uml/ui tests/org/argouml/util

[email protected]
Newsgroups gmane.comp.lang.uml.argouml.cvs
Message-ID <[email protected]>
Author: maurelio1234
Date: 2008-08-05 02:50:06-0700
New Revision: 15510

Added:
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/kernel/UmlModelMutator.java
      - copied unchanged from r15509, /trunk/src/argouml-app/src/org/argouml/kernel/UmlModelMutator.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/profile/UserDefinedProfileHelper.java
      - copied unchanged from r15509, /trunk/src/argouml-app/src/org/argouml/profile/UserDefinedProfileHelper.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionList.java
      - copied unchanged from r15509, /trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/ActionList.java
   branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/application/InitSubSystemForTest.java
      - copied unchanged from r15509, /trunk/src/argouml-app/tests/org/argouml/application/InitSubSystemForTest.java
Removed:
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/ProfileSelectionTab.java
Modified:
   branches/gsoc2008/work_issue5029_maurelio1234/   (props changed)
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/i18n/dialog.properties
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/i18n/tab.properties
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/kernel/Project.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/kernel/ProjectImpl.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/kernel/ProjectManager.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/notation/providers/uml/TransitionNotationUml.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/profile/URLModelLoader.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/profile/init/InitProfileSubsystem.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/profile/internal/ProfileManagerImpl.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/CmdCreateNode.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/ProjectBrowser.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/ProjectSettingsTabProfile.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/SettingsTabProfile.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/explorer/ActionManageProfiles.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/explorer/DnDExplorerTree.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/explorer/ExplorerPopup.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ActionAddStereotype.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionAddNote.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionAddStereotype.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionModifierAbstract.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionModifierActive.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionModifierLeaf.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionModifierRoot.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionVisibilityPackage.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionVisibilityPrivate.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionVisibilityProtected.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionVisibilityPublic.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/FigEdgeModelElement.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/FigNodeAssociation.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/FigNodeModelElement.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/reveng/java/Modeller.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/reveng/ui/RESequenceDiagramDialog.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/AbstractActionAddModelElement2.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/AbstractActionNewModelElement.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/ActionDeleteModelElements.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/ElementPropPanelFactory.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/PropPanel.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/TabProps.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/UMLComboBoxNavigator.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/UMLList2.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/UMLMutableLinkedList.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/ActionAddAttribute.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/ActionAddEnumerationLiteral.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/ActionAddOperation.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/PropPanelAssociation.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/PropPanelModelElement.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/UMLModelElementVisibilityRadioButtonPanel.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/extension_mechanisms/ActionNewTagDefinition.java
   branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/model_management/PropPanelPackage.java
   branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/kernel/TestProjectWithProfiles.java
   branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/persistence/TestZargoFilePersister.java
   branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/profile/internal/TestProfileManagerImpl.java
   branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/uml/ui/GUITestActionSaveGraphics.java
   branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/util/CheckMain.java

Log:
merging with trunk 15337:15509



Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/i18n/dialog.properties
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/i18n/dialog.properties?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/i18n/dialog.properties&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/i18n/dialog.properties&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/i18n/dialog.properties	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/i18n/dialog.properties	2008-08-05 02:50:06-0700
@@ -68,6 +68,11 @@
   the problem as a bug by going to \
   <a href="http://argouml.tigris.org/project_bugs.html">\
   http://argouml.tigris.org/project_bugs.html</a>.
+dialog.error.xmi.reference.error = XMI reference error : {0} \n\
+  Please make sure that either this XMI file is listed in the profile tab of\n\
+  the edit->settings dialog, or a module containing this XMI as a profile\n\
+  is loaded (e.g. by putting the module jar file in the ext directory of\n\
+  your ArgoUML installation).
 dialog.exception.link.report = Please report this problem at \
  <a href="http://argouml.tigris.org/project_bugs.html">\
  http://argouml.tigris.org/project_bugs.html</a>

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/i18n/tab.properties
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/i18n/tab.properties?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/i18n/tab.properties&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/i18n/tab.properties&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/i18n/tab.properties	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/i18n/tab.properties	2008-08-05 02:50:06-0700
@@ -60,8 +60,9 @@
 tab.profiles.directories.desc = Default XMI directories:
 tab.profiles.directories.add = Add
 tab.profiles.directories.remove = Remove
-tab.profiles.directories.refresh = Refresh
+tab.profiles.directories.refresh = Refresh List
 
+tab.profiles.cantremoveuml = The UML profile can not be removed!
 tab.profiles.cannotdelete = Only user defined profiles can be unregistered!
 tab.profiles.confirmdeleteunregistered = The selected profile is only available \
  in this project, after removed there is no way to add it again. \

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/kernel/Project.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/kernel/Project.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/kernel/Project.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/kernel/Project.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/kernel/Project.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/kernel/Project.java	2008-08-05 02:50:06-0700
@@ -276,7 +276,14 @@
 
     /**
      * Returns all top level Packages (e.g. Models), including the profile
-     * packages.
+     * packages. 
+     * <p>
+     * <em>WARNING:</em> The models returned by this method are <em>not</em>
+     * ordered.  Any code which makes the assumption that the user model is
+     * first (or any other ordering assumption) is broken!
+     * <p><em>NOTE:</em> Since user defined models and profiles are
+     * handled quite differently, you normally want to use
+     * {@link #getUserDefinedModelList()} instead of this method.
      * 
      * @return A Collection containing all models.
      */
@@ -288,7 +295,8 @@
      * If there isn't exactly one model, <code>null</code> is returned.
      *
      * @return the model.
-     * @deprecated for 0.25.4 by tfmorris.  Use {@link #getModels()}.
+     * @deprecated for 0.25.4 by tfmorris.  Use 
+     * {@link #getUserDefinedModelList()} or {@link #getModels()}.
      */
     @Deprecated
     public Object getModel();
@@ -706,4 +714,5 @@
      * @return the UndoManager for this project
      */
     public UndoManager getUndoManager();
+
 }
\ No newline at end of file

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/kernel/ProjectImpl.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/kernel/ProjectImpl.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/kernel/ProjectImpl.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/kernel/ProjectImpl.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/kernel/ProjectImpl.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/kernel/ProjectImpl.java	2008-08-05 02:50:06-0700
@@ -46,6 +46,7 @@
 import org.argouml.application.helpers.ApplicationVersion;
 import org.argouml.configuration.Configuration;
 import org.argouml.i18n.Translator;
+import org.argouml.model.InvalidElementException;
 import org.argouml.model.Model;
 import org.argouml.persistence.PersistenceManager;
 import org.argouml.profile.Profile;
@@ -1067,15 +1068,14 @@
         }
 
         members.clear();
-
-        for (Object model : roots) {
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("Deleting root element "
-                        + Model.getFacade().getName(model));
+        if (!roots.isEmpty()) {
+            try {
+                Model.getUmlFactory().deleteExtent(roots.iterator().next());
+            } catch (InvalidElementException e) {
+                LOG.warn("Extent deleted a second time");
             }
-            Model.getUmlFactory().delete(model);
+            roots.clear();
         }
-        roots.clear();
         models.clear();
         diagrams.clear();
         searchpath.clear();

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/kernel/ProjectManager.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/kernel/ProjectManager.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/kernel/ProjectManager.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/kernel/ProjectManager.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/kernel/ProjectManager.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/kernel/ProjectManager.java	2008-08-05 02:50:06-0700
@@ -101,6 +101,7 @@
 
     /**
      * Flag to indicate we are creating a new current project.
+     * TODO: This isn't a thread-safe way of doing mutual exclusion.
      */
     private boolean creatingCurrentProject;
 

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/notation/providers/uml/TransitionNotationUml.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/notation/providers/uml/TransitionNotationUml.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/notation/providers/uml/TransitionNotationUml.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/notation/providers/uml/TransitionNotationUml.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/notation/providers/uml/TransitionNotationUml.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/notation/providers/uml/TransitionNotationUml.java	2008-08-05 02:50:06-0700
@@ -272,7 +272,15 @@
                         /* Just change the ChangeExpression */
                         Object changeExpr = 
                             Model.getFacade().getChangeExpression(evt);
-                        Model.getDataTypesHelper().setBody(changeExpr, s);
+                        if (changeExpr == null) {
+                            /* Create a new expression: */
+                            changeExpr = Model.getDataTypesFactory()
+                                .createBooleanExpression("", s);
+                            Model.getStateMachinesHelper().setExpression(evt, 
+                                    changeExpr);
+                        } else {
+                            Model.getDataTypesHelper().setBody(changeExpr, s);
+                        }
                     } else {
                         /* The parsed text describes a change-event,
                          * but the model contains another type! */
@@ -429,17 +437,18 @@
                 effect =
                     Model.getCommonBehaviorFactory()
                         .createCallAction();
+                /* And hook it to the transition immediately,
+                 * so that an exception can not cause it to remain dangling: */
+                Model.getStateMachinesHelper().setEffect(trans, effect);
                 Model.getCommonBehaviorHelper().setScript(effect,
                         Model.getDataTypesFactory()
                                 .createActionExpression(""/*language*/,
                                                         actions));
                 Model.getCoreHelper().setName(effect, "anon");
-                Model.getStateMachinesHelper().setEffect(trans, effect);
             } else { // case 2
                 Object script = Model.getFacade().getScript(effect);
                 String language = (script == null) ? null
-                        : Model.getDataTypesHelper().getLanguage(
-                            Model.getFacade().getScript(effect));
+                        : Model.getDataTypesHelper().getLanguage(script);
                 Model.getCommonBehaviorHelper().setScript(effect,
                         Model.getDataTypesFactory()
                                 .createActionExpression(language, actions));

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/profile/URLModelLoader.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/profile/URLModelLoader.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/profile/URLModelLoader.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/profile/URLModelLoader.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/profile/URLModelLoader.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/profile/URLModelLoader.java	2008-08-05 02:50:06-0700
@@ -38,7 +38,7 @@
 
 /**
  * Abstract ProfileModelLoader which loads models from a URL.
- * 
+ *
  * @author Tom Morris, Thomas Neustupny
  */
 public class URLModelLoader implements ProfileModelLoader {
@@ -52,7 +52,8 @@
      *         single package stereotyped <<profile>>
      * @throws ProfileException if the XMIReader couldn't read the profile
      */
-    public Collection loadModel(URL url, URL publicId) throws ProfileException {
+    public Collection loadModel(URL url, URL publicId) 
+        throws ProfileException {
         if (url == null) {
             throw new ProfileException("Null profile URL");
         }

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/profile/init/InitProfileSubsystem.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/profile/init/InitProfileSubsystem.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/profile/init/InitProfileSubsystem.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/profile/init/InitProfileSubsystem.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/profile/init/InitProfileSubsystem.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/profile/init/InitProfileSubsystem.java	2008-08-05 02:50:06-0700
@@ -40,6 +40,12 @@
      * Initialize the Profiles subsystem by binding the 2 packages together.
      */
     public void init() {
+        // TODO: There are tests which depend on being able to reinitialize
+        // the Profile subsystem multiple times.
+//        if (!ProfileFacade.isInitiated()) {
+//            ProfileFacade.setManager(
+//                    new org.argouml.profile.internal.ProfileManagerImpl());
+//        }
         ProfileFacade.setManager(
                 new org.argouml.profile.internal.ProfileManagerImpl());
 

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/profile/internal/ProfileManagerImpl.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/profile/internal/ProfileManagerImpl.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/profile/internal/ProfileManagerImpl.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/profile/internal/ProfileManagerImpl.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/profile/internal/ProfileManagerImpl.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/profile/internal/ProfileManagerImpl.java	2008-08-05 02:50:06-0700
@@ -26,12 +26,12 @@
 
 import java.io.File;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.StringTokenizer;
 
 import org.apache.log4j.Logger;
-import org.argouml.cognitive.Agency;
 import org.argouml.configuration.Configuration;
 import org.argouml.configuration.ConfigurationKey;
 import org.argouml.model.Model;
@@ -40,17 +40,16 @@
 import org.argouml.profile.ProfileException;
 import org.argouml.profile.ProfileManager;
 import org.argouml.profile.UserDefinedProfile;
-import org.argouml.uml.cognitive.critics.CrUML;
 
 /**
  * Default <code>ProfileManager</code> implementation
- * 
- * @author maurelio1234
+ *
+ * @author Marcos Aurelio
  */
 public class ProfileManagerImpl implements ProfileManager {
-
-    private static final Logger LOG = Logger
-            .getLogger(ProfileManagerImpl.class);
+    
+    private static final Logger LOG = Logger.getLogger(
+            ProfileManagerImpl.class);
 
     private static final String DIRECTORY_SEPARATOR = "*";
 
@@ -70,24 +69,31 @@
      * Avoids recursive configuration update when loading configuration
      */
     private boolean disableConfigurationUpdate = false;
-
+    
     private List<Profile> profiles = new ArrayList<Profile>();
 
     private List<Profile> defaultProfiles = new ArrayList<Profile>();
 
     private List<String> searchDirectories = new ArrayList<String>();
 
-    private ProfileUML profileUML = null;
+    private Profile profileUML;
+    
+    private Profile profileJava;
+
     /**
      * Constructor - includes initialization of built-in default profiles.
      */
     public ProfileManagerImpl() {
         try {
             profileUML = new ProfileUML();
+            profileJava = new ProfileJava(profileUML);
             
-            defaultProfiles.add(profileUML);
             registerProfile(profileUML);
-            registerProfile(new ProfileJava(profileUML));
+            addToDefaultProfiles(profileUML); 
+                // the UML Profile is always present and default
+            
+            // register the built-in profiles
+            registerProfile(profileJava);                
             registerProfile(new ProfileMeta());
         } catch (ProfileException e) {
             throw new RuntimeException(e);
@@ -100,36 +106,44 @@
         loadDefaultProfilesfromConfiguration();
     }
 
-    private void loadDefaultProfilesfromConfiguration() {
+    private void loadDefaultProfilesfromConfiguration() {    
         disableConfigurationUpdate = true;
+        
+        String defaultProfilesList = Configuration
+                        .getString(KEY_DEFAULT_PROFILES);
+        if (defaultProfilesList.equals("")) {
+            // if the list does not exist
+            // add the Java profile as default
+            
+            addToDefaultProfiles(profileJava);
+        } else {
+            StringTokenizer tokenizer = new StringTokenizer(
+                    defaultProfilesList, DIRECTORY_SEPARATOR, false);
+
+            while (tokenizer.hasMoreTokens()) {
+                String desc = tokenizer.nextToken();
+                Profile p = null;
+
+                if (desc.charAt(0) == 'U') {
+                    String fileName = desc.substring(1);
+                    p = findUserDefinedProfile(new File(fileName));
+                } else if (desc.charAt(0) == 'C') {
+                    String className = desc.substring(1);
+                    p = getProfileForClass(className);
+                }
 
-        StringTokenizer tokenizer = new StringTokenizer(Configuration
-                .getString(KEY_DEFAULT_PROFILES), DIRECTORY_SEPARATOR, false);
-
-        while (tokenizer.hasMoreTokens()) {
-            String desc = tokenizer.nextToken();
-            Profile p = null;
-
-            if (desc.charAt(0) == 'U') {
-                String fileName = desc.substring(1);
-                p = findUserDefinedProfile(new File(fileName));
-            } else if (desc.charAt(0) == 'C') {
-                String className = desc.substring(1);
-                p = getProfileForClass(className);
-            }
-
-            if (p != null) {
-                addToDefaultProfiles(p);
+                if (p != null) {
+                    addToDefaultProfiles(p);
+                }
             }
         }
-
         disableConfigurationUpdate = false;
     }
 
     private void updateDefaultProfilesConfiguration() {
         if (!disableConfigurationUpdate) {
             StringBuffer buf = new StringBuffer();
-
+            
             for (Profile p : defaultProfiles) {
                 if (p instanceof UserDefinedProfile) {
                     buf.append("U"
@@ -148,14 +162,16 @@
 
     private void loadDirectoriesFromConfiguration() {
         disableConfigurationUpdate = true;
-
-        StringTokenizer tokenizer = new StringTokenizer(Configuration
-               .getString(KEY_DEFAULT_DIRECTORIES), DIRECTORY_SEPARATOR, false);
+        
+        StringTokenizer tokenizer = 
+            new StringTokenizer(
+                    Configuration.getString(KEY_DEFAULT_DIRECTORIES), 
+                    DIRECTORY_SEPARATOR, false);
 
         while (tokenizer.hasMoreTokens()) {
             searchDirectories.add(tokenizer.nextToken());
         }
-
+        
         disableConfigurationUpdate = false;
     }
 
@@ -171,39 +187,44 @@
         }
     }
 
+
     public List<Profile> getRegisteredProfiles() {
         return profiles;
     }
 
-    public void registerProfile(Profile p) {
+
+    public void registerProfile(Profile p) {        
         if (p != null && !profiles.contains(p)) {
             if (p instanceof UserDefinedProfile
                     || getProfileForClass(p.getClass().getName()) == null) {
                 profiles.add(p);
-
-                for (CrUML critic : p.getCritics()) {
-                    for (Object meta : critic.getCriticizedMetatypes()) {
-                        Agency.register(critic, meta);
-                    }
-
-                    critic.setEnabled(false);
-                }
-
-                // this profile could have not been loaded when
-                // the default profile configuration
+                
+                // this profile could have not been loaded when 
+                // the default profile configuration 
                 // was loaded at first, so we need to do it again
                 loadDefaultProfilesfromConfiguration();
             }
         }
     }
 
+
     public void removeProfile(Profile p) {
-        if (p != null && (p instanceof UserDefinedProfile)) {
+        if (p != null && p != profileUML) {
             profiles.remove(p);
             defaultProfiles.remove(p);
         }
+        try {
+            Collection packages = p.getProfilePackages();
+            if (packages != null && !packages.isEmpty()) {
+                // We assume profile is contained in a single extent
+                Model.getUmlFactory().deleteExtent(packages.iterator().next());
+            }
+        } catch (ProfileException e) {
+            // Nothing to delete if we couldn't get the packages
+        }
     }
 
+
     public Profile getProfileForClass(String profileClass) {
         Profile found = null;
         for (Profile p : profiles) {
@@ -215,24 +236,29 @@
         return found;
     }
 
+
     public void addToDefaultProfiles(Profile p) {
-        if (p != null && profiles.contains(p) && !defaultProfiles.contains(p)) {
+        if (p != null && profiles.contains(p) 
+                && !defaultProfiles.contains(p)) {
             defaultProfiles.add(p);
             updateDefaultProfilesConfiguration();
         }
     }
 
+
     public List<Profile> getDefaultProfiles() {
         return Collections.unmodifiableList(defaultProfiles);
     }
 
+
     public void removeFromDefaultProfiles(Profile p) {
-        if (p != null && profiles.contains(p) && !(p instanceof ProfileUML)) {
+        if (p != null && p != profileUML && profiles.contains(p)) {
             defaultProfiles.remove(p);
             updateDefaultProfilesConfiguration();
         }
     }
 
+
     public void addSearchPathDirectory(String path) {
         if (path != null && !searchDirectories.contains(path)) {
             searchDirectories.add(path);
@@ -245,10 +271,12 @@
         }
     }
 
+
     public List<String> getSearchPathDirectories() {
         return Collections.unmodifiableList(searchDirectories);
     }
 
+
     public void removeSearchPathDirectory(String path) {
         if (path != null) {
             searchDirectories.remove(path);
@@ -271,7 +299,8 @@
                     // TODO: Allow .zargo as profile as well?
                     if (file.getName().toLowerCase().endsWith(".xmi")) {
 
-                        boolean found = findUserDefinedProfile(file) != null;
+                        boolean found = 
+                            findUserDefinedProfile(file) != null;
 
                         if (!found) {
                             UserDefinedProfile udp = null;
@@ -281,7 +310,7 @@
                             } catch (ProfileException e) {
                                 // if an exception is raised file is unusable
                                 LOG.warn("Failed to load user defined profile "
-                                        + file.getAbsolutePath() + ".", e);
+                                    + file.getAbsolutePath() + ".", e);
                             }
                         }
                     }
@@ -291,7 +320,7 @@
     }
 
     private Profile findUserDefinedProfile(File file) {
-
+        
         for (Profile p : profiles) {
             if (p instanceof UserDefinedProfile) {
                 UserDefinedProfile udp = (UserDefinedProfile) p;
@@ -304,6 +333,7 @@
         return null;
     }
 
+
     public Profile getUMLProfile() {
         return profileUML;
     }

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/CmdCreateNode.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/CmdCreateNode.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/CmdCreateNode.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/CmdCreateNode.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/CmdCreateNode.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/CmdCreateNode.java	2008-08-05 02:50:06-0700
@@ -65,7 +65,11 @@
      * @see org.tigris.gef.graph.GraphFactory#makeNode()
      * @see org.tigris.gef.base.CmdCreateNode#makeNode()
      */
+    @Override
     public Object makeNode() {
+        // TODO: We need to get the model/extent (and package?) associated with
+        // the current diagram so that we can create the new element in the
+        // right place.
         Object newNode = Model.getUmlFactory().buildNode(getArg("className"));
         return newNode;
     }

Removed: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/ProfileSelectionTab.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/ProfileSelectionTab.java?view=auto&rev=15509

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/ProjectBrowser.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/ProjectBrowser.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/ProjectBrowser.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/ProjectBrowser.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/ProjectBrowser.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/ProjectBrowser.java	2008-08-05 02:50:06-0700
@@ -88,6 +88,7 @@
 import org.argouml.persistence.UmlVersionException;
 import org.argouml.persistence.VersionException;
 import org.argouml.persistence.XmiFormatException;
+import org.argouml.persistence.XmiReferenceException;
 import org.argouml.taskmgmt.ProgressMonitor;
 import org.argouml.ui.cmd.GenericArgoMenuBar;
 import org.argouml.ui.targetmanager.TargetEvent;
@@ -1573,7 +1574,7 @@
 
         PersistenceManager pm = PersistenceManager.getInstance();
         Project oldProject = ProjectManager.getManager().getCurrentProject();
-        boolean success = true;
+        boolean success = false;
 
         // TODO:
         // This is actually a hack! Some diagram types
@@ -1604,7 +1605,6 @@
                 ProjectFilePersister persister =
                     pm.getPersisterFromFileName(file.getName());
                 if (persister == null) {
-                    success = false;
                     throw new IllegalStateException("Filename "
                             + file.getName()
                             + " is not of a known file type");
@@ -1647,9 +1647,8 @@
                         Translator.localize(
                                 "statusmsg.bar.open-project-status-read",
                                 new Object[] {file.getName(), }));
+                success = true;
             } catch (VersionException ex) {
-                project = oldProject;
-                success = false;
                 reportError(
                         pmw,
                         Translator.localize(
@@ -1657,29 +1656,31 @@
                                 new Object[] {ex.getMessage()}),
                         showUI);
             } catch (OutOfMemoryError ex) {
-                project = oldProject;
-                success = false;
                 LOG.error("Out of memory while loading project", ex);
                 reportError(
                         pmw,
                         Translator.localize("dialog.error.memory.limit"),
                         showUI);
             } catch (java.lang.InterruptedException ex) {
-                project = oldProject;
-                success = false;
                 LOG.error("Project loading interrupted by user");
             } catch (UmlVersionException ex) {
-                project = oldProject;
-                success = false;
                 reportError(
                         pmw,
                         Translator.localize(
                                 "dialog.error.file.version.error",
                                 new Object[] {ex.getMessage()}),
                         showUI, ex);
+            } catch (XmiReferenceException ex) {
+                // an error that can be corrected by the user, so no stack
+                // trace, but instead an explanation and a hint how to fix it
+                reportError(
+                        pmw,
+                        Translator.localize(
+                                "dialog.error.xmi.reference.error",
+                                new Object[] {ex.getMessage()}),
+                        ex.toString(),
+                        showUI);
             } catch (XmiFormatException ex) {
-                project = oldProject;
-                success = false;
                 reportError(
                         pmw,
                         Translator.localize(
@@ -1687,8 +1688,6 @@
                                 new Object[] {ex.getMessage()}),
                         showUI, ex);
             } catch (IOException ex) {
-                success = false;
-                project = oldProject;
                 LOG.error("Exception while loading project", ex);
                 reportError(
                         pmw,
@@ -1697,8 +1696,6 @@
                                 new Object[] {file.getName()}),
                         showUI, ex);
             } catch (OpenException ex) {
-                success = false;
-                project = oldProject;
                 LOG.error("Exception while loading project", ex);
                 reportError(
                         pmw,
@@ -1707,8 +1704,6 @@
                                 new Object[] {file.getName()}),
                         showUI, ex);
             } catch (RuntimeException ex) {
-                success = false;
-                project = oldProject;
                 LOG.error("Exception while loading project", ex);
                 reportError(
                         pmw,
@@ -1718,47 +1713,34 @@
                         showUI, ex);
             } finally {
 
-        	try {
-                    if (oldProject != null) {
-                        // if p equals oldProject there was an exception and we
-                        // do not have to gc (garbage collect) the old project
-                        if (project != null && !project.equals(oldProject)) {
-                            //prepare the old project for gc
-                            LOG.info("There are "
-                                    + oldProject.getDiagramList().size()
-                                    + " diagrams in the old project");
-                            LOG.info("There are " 
-                                    + project.getDiagramList().size()
-                                    + " diagrams in the new project");
-                            // Set new project before removing old so we always
-                            // have a valid current project
-                            ProjectManager.getManager().setCurrentProject(
-                                    project);
-                            ProjectManager.getManager().removeProject(
-                                    oldProject);
-                            project.getProjectSettings().init();
-                            Command cmd = new NonUndoableCommand() {
-                                public Object execute() {
-                                    // This is temporary. Load project
-                                    // should create a new project
-                                    // with its own UndoManager and so
-                                    // there should be no Command
-                                    return null;
-                                }
-                            };
-                            project.getUndoManager().addCommand(cmd);
-                        }
+                try {
+                    if (!success) {
+                        project = 
+                            ProjectManager.getManager().makeEmptyProject();
                     }
-
-                    if (project == null) {
-                        LOG.info("The current project is null");
-                    } else {
-                        LOG.info("There are " + project.getDiagramList().size()
-                                + " diagrams in the current project");
+                    ProjectManager.getManager().setCurrentProject(project);
+                    if (oldProject != null) {
+                        ProjectManager.getManager().removeProject(oldProject);
                     }
                     
+                    project.getProjectSettings().init();
+                    
+                    Command cmd = new NonUndoableCommand() {
+                        public Object execute() {
+                            // This is temporary. Load project
+                            // should create a new project
+                            // with its own UndoManager and so
+                            // there should be no Command
+                            return null;
+                        }
+                    };
+                    project.getUndoManager().addCommand(cmd);
+
+                    LOG.info("There are " + project.getDiagramList().size()
+                            + " diagrams in the current project");
+
                     Designer.enableCritiquing();
-        	} finally {
+                } finally {
                     // Make sure save action is always reinstated
                     this.saveAction = rememberedSaveAction;
                     ProjectManager.getManager().setSaveAction(
@@ -1766,7 +1748,7 @@
                     if (success) {
                         rememberedSaveAction.setEnabled(false);
                     }
-        	}
+                }
             }
         }
         return success;
@@ -1852,6 +1834,42 @@
     }
 
     /**
+     * Open a Message Dialog with an error message and an explanation. No
+     * stack trace, since it's not an application error, but a user issue.
+     *
+     * @param message the message to display.
+     * @param explanation the explanation to display.
+     * @param showUI true if an error message may be shown to the user,
+     *               false if run in commandline mode
+     */
+    private void reportError(ProgressMonitor monitor, final String message,
+            final String explanation, boolean showUI) {
+        if (showUI) {
+            if (monitor != null) {
+                monitor.notifyMessage(
+                        Translator.localize("dialog.error.title"),
+                        explanation,
+                        message);
+            } else {
+                SwingUtilities.invokeLater(new Runnable() {
+                    public void run() {
+                        JDialog dialog =
+                            new ExceptionDialog(
+                                    ArgoFrame.getInstance(),
+                                    Translator.localize("dialog.error.title"),
+                                    explanation,
+                                    message);
+                        dialog.setVisible(true);
+                    }
+                });
+            }
+        } else {
+            reportError(monitor, message + "\n" + explanation + "\n\n",
+                    showUI);
+        }
+    }
+
+    /**
      * We should remove all open dialogs. They have as parent the
      * ProjectBrowser. This is needed for the non-modal dialogs
      * such as Find and Goto.

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/ProjectSettingsTabProfile.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/ProjectSettingsTabProfile.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/ProjectSettingsTabProfile.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/ProjectSettingsTabProfile.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/ProjectSettingsTabProfile.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/ProjectSettingsTabProfile.java	2008-08-05 02:50:06-0700
@@ -63,7 +63,7 @@
  * The Tab where new profiles can be added and the registered ones can be

  * activated or deactivated on current project

  * 

- * @author Marcos Aur�lio

+ * @author Marcos Aurelio

  */

 public class ProjectSettingsTabProfile extends JPanel implements

         GUISettingsTabInterface, ActionListener {


Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/SettingsTabProfile.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/SettingsTabProfile.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/SettingsTabProfile.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/SettingsTabProfile.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/SettingsTabProfile.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/SettingsTabProfile.java	2008-08-05 02:50:06-0700
@@ -57,6 +57,7 @@
 import org.argouml.profile.ProfileException;
 import org.argouml.profile.ProfileFacade;
 import org.argouml.profile.UserDefinedProfile;
+import org.argouml.profile.UserDefinedProfileHelper;
 import org.argouml.swingext.JLinkButton;
 import org.argouml.uml.diagram.DiagramAppearance;
 
@@ -71,9 +72,6 @@
     private JButton loadFromFile = new JButton(Translator
             .localize("tab.profiles.userdefined.load"));
 
-    private JButton unregisterProfile = new JButton(Translator
-            .localize("tab.profiles.userdefined.unload"));
-
     private JButton addButton = new JButton(">>");
 
     private JButton removeButton = new JButton("<<");
@@ -200,10 +198,8 @@
         JPanel lffPanel = new JPanel();
         lffPanel.setLayout(new FlowLayout());
         lffPanel.add(loadFromFile);
-        lffPanel.add(unregisterProfile);
         lffPanel.add(refreshProfiles);
 
-        unregisterProfile.addActionListener(this);
         loadFromFile.addActionListener(this);
         refreshProfiles.addActionListener(this);
 
@@ -316,55 +312,36 @@
             if (defaultList.getSelectedIndex() != -1) {
                 Profile selected = (Profile) modelUsd.getElementAt(defaultList
                         .getSelectedIndex());
-                modelUsd.removeElement(selected);
-                modelAvl.addElement(selected);
-            }
-        } else if (arg0.getSource() == unregisterProfile) {
-            if (availableList.getSelectedIndex() != -1) {
-                Profile selected = (Profile) modelAvl
-                        .getElementAt(availableList.getSelectedIndex());
-                if (selected instanceof UserDefinedProfile) {
-                    ProfileFacade.getManager().removeProfile(selected);
-                    modelAvl.removeElement(selected);
-                } else {
+                
+                if (selected == ProfileFacade.getManager().getUMLProfile()) {
                     JOptionPane.showMessageDialog(this, Translator
-                            .localize("tab.profiles.cannotdelete"));
+                            .localize("tab.profiles.cantremoveuml"));
+                } else {
+                    modelUsd.removeElement(selected);
+                    modelAvl.addElement(selected);
                 }
             }
         } else if (arg0.getSource() == loadFromFile) {
-            JFileChooser fileChooser = new JFileChooser();
-            fileChooser.setFileFilter(new FileFilter() {
-
-                public boolean accept(File file) {
-                    return file.isDirectory()
-                            || (file.isFile() && (file.getName().toLowerCase()
-                                    .endsWith(".xmi")
-                                    || file.getName().toLowerCase().endsWith(
-                                            ".xml")
-                                    || file.getName().toLowerCase().endsWith(
-                                            ".xmi.zip") || file.getName()
-                                    .toLowerCase().endsWith(".xml.zip")));
-                }
-
-                public String getDescription() {
-                    return "*.xmi *.xml *.xmi.zip *.xml.zip";
-                }
-
-            });
-
+            JFileChooser fileChooser =
+                UserDefinedProfileHelper.createUserDefinedProfileFileChooser();
             int ret = fileChooser.showOpenDialog(this);
+            List<File> files = null;
             if (ret == JFileChooser.APPROVE_OPTION) {
-                File file = fileChooser.getSelectedFile();
-
-                try {
-                    UserDefinedProfile profile = new UserDefinedProfile(file);
-
-                    ProfileFacade.getManager().registerProfile(profile);
-
-                    modelAvl.addElement(profile);
-                } catch (ProfileException e) {
-                    JOptionPane.showMessageDialog(this, Translator
-                            .localize("tab.profiles.userdefined.errorloading"));
+                files = UserDefinedProfileHelper.getFileList(
+                    fileChooser.getSelectedFiles());
+            }
+            if (files != null && files.size() > 0) {
+                for (File file : files) {
+                    try {
+                        UserDefinedProfile profile =
+                            new UserDefinedProfile(file);
+                        ProfileFacade.getManager().registerProfile(profile);
+                        modelAvl.addElement(profile);
+                    } catch (ProfileException e) {
+                        JOptionPane.showMessageDialog(this, Translator
+                            .localize("tab.profiles.userdefined.errorloading")
+                            + ": " + file.getAbsolutePath());
+                    }
                 }
             }
 
@@ -514,5 +491,4 @@
         }
 
     }
-
 }

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/explorer/ActionManageProfiles.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/explorer/ActionManageProfiles.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/explorer/ActionManageProfiles.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/explorer/ActionManageProfiles.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/explorer/ActionManageProfiles.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/explorer/ActionManageProfiles.java	2008-08-05 02:50:06-0700
@@ -34,7 +34,6 @@
 import org.argouml.application.helpers.ResourceLoaderWrapper;
 import org.argouml.i18n.Translator;
 import org.argouml.ui.GUI;
-import org.argouml.ui.ProfileSelectionTab;
 import org.argouml.ui.ProjectSettingsDialog;
 import org.argouml.ui.ProjectSettingsTabProfile;
 

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/explorer/DnDExplorerTree.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/explorer/DnDExplorerTree.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/explorer/DnDExplorerTree.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/explorer/DnDExplorerTree.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/explorer/DnDExplorerTree.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/explorer/DnDExplorerTree.java	2008-08-05 02:50:06-0700
@@ -1,5 +1,5 @@
 // $Id$
-// Copyright (c) 1996-2007 The Regents of the University of California. All
+// Copyright (c) 1996-2008 The Regents of the University of California. All
 // Rights Reserved. Permission to use, copy, modify, and distribute this
 // software and its documentation without fee, and without a written
 // agreement is hereby granted, provided that the above copyright notice
@@ -308,9 +308,29 @@
             return false;
         }
 
+        /* We are sure "dest" is a Namespace now. */
+        if (Model.getModelManagementHelper().isReadOnly(dest)) {
+            LOG.debug("No valid Drag: "
+                    + "this is not an editable UML element (profile?).");
+            return false;
+        }
+
         /* If the destination is a DataType, then abort: */
+
         // TODO: Any Namespace can contain other elements.  Why don't we allow
         // this? - tfm
+        /* 
+         * MVW: These are the WFRs for DataType:
+         * [1] A DataType can only contain Operations, 
+         * which all must be queries.
+         * self.allFeatures->forAll(f |
+         *  f.oclIsKindOf(Operation) and f.oclAsType(Operation).isQuery) 
+         * [2] A DataType cannot contain any other ModelElements.
+         *  self.allContents->isEmpty
+         *  IMHO we should enforce these WFRs here.
+         *  ... so it is still possible to copy or move query operations,
+         *  hence we should allow this. 
+         */
         if (Model.getFacade().isADataType(dest)) {
             LOG.debug("No valid Drag: destination is a DataType.");
             return false;
@@ -326,9 +346,20 @@
                 (Collection) tf.getTransferData(
                     TransferableModelElements.UML_COLLECTION_FLAVOR);
             for (Object element : transfers) {
-                if (Model.getCoreHelper().isValidNamespace(element, dest)) {
-                    LOG.debug("Valid Drag: namespace " + dest);
-                    return true;
+                if (Model.getFacade().isAUMLElement(element)) {
+                    if (!Model.getModelManagementHelper().isReadOnly(element)) {
+                        if (Model.getFacade().isAModelElement(dest) 
+                                && Model.getFacade().isANamespace(element) 
+                                && Model.getCoreHelper().isValidNamespace(
+                                        element, dest)) {
+                            LOG.debug("Valid Drag: namespace " + dest);
+                            return true;
+                        }
+                        if (Model.getFacade().isAFeature(element) 
+                                && Model.getFacade().isAClassifier(dest)) {
+                            return true;
+                        }
+                    }
                 }
                 if (element instanceof Relocatable) {
                     Relocatable d = (Relocatable) element;
@@ -337,10 +368,6 @@
                         return true;
                     }
                 }
-                if (Model.getFacade().isAFeature(element) 
-                        && Model.getFacade().isAClassifier(dest)) {
-                    return true;
-                }
             }
         } catch (UnsupportedFlavorException e) {
             LOG.debug(e);
@@ -567,7 +594,8 @@
             if (pt.equals(lastMouseLocation)) {
                 return;
             }
-            LOG.debug("dragOver");
+            /* Many many of these events .. this slows things down: */
+//            LOG.debug("dragOver");
 
             lastMouseLocation = pt;
 
@@ -663,12 +691,21 @@
             if (!Model.getFacade().isANamespace(dest)) {
                 if (LOG.isDebugEnabled()) {
                     LOG.debug("No valid Drag: "
-                            + Model.getFacade().getName(dest)
-                            + " not a namespace.");
+                            + (Model.getFacade().isAUMLElement(dest) 
+                                    ? Model.getFacade().getName(dest)
+                                            + " not a namespace."
+                                    :  " not a UML element."));
                 }
                 dropTargetDragEvent.rejectDrag();
                 return;
             }
+            /* We are sure "dest" is a Namespace now. */
+
+            if (Model.getModelManagementHelper().isReadOnly(dest)) {
+                LOG.debug("No valid Drag: "
+                        + "not an editable UML element (profile?).");
+                return;
+            }
 
             /* If the destination is a DataType, then reject: */
             if (Model.getFacade().isADataType(dest)) {
@@ -746,12 +783,31 @@
                     dropTargetDropEvent.rejectDrop();
                     return;
                 }
+
+                if (Model.getFacade().isAUMLElement(dest)) {
+                    if (Model.getModelManagementHelper().isReadOnly(dest)) {
+                        dropTargetDropEvent.rejectDrop();
+                        return;
+                    }
+                }
+                if (Model.getFacade().isAUMLElement(src)) {
+                    if (Model.getModelManagementHelper().isReadOnly(src)) {
+                        dropTargetDropEvent.rejectDrop();
+                        return;
+                    }
+                }
+                
                 // TODO: Really should be Element/ModelElement, but we don't
                 // have a type which is portable for this
                 Collection<Object> newTargets = new ArrayList<Object>();
                 try {
                     dropTargetDropEvent.acceptDrop(action);
                     for (Object me : modelElements) {
+                        if (Model.getFacade().isAUMLElement(me)) {
+                            if (Model.getModelManagementHelper().isReadOnly(me)) {
+                                continue;
+                            }
+                        }
                         if (LOG.isDebugEnabled()) {
                             LOG.debug((moveAction ? "move " : "copy ") + me);
                         }

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/explorer/ExplorerPopup.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/explorer/ExplorerPopup.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/explorer/ExplorerPopup.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/explorer/ExplorerPopup.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/explorer/ExplorerPopup.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/ui/explorer/ExplorerPopup.java	2008-08-05 02:50:06-0700
@@ -301,7 +301,9 @@
                 }
             }
 
-            if (selectedItem != projectModel) {
+            if (modelElementsOnly && selectedItem != projectModel) {
+                // TODO: Shouldn't be creating a new instance here. We should
+                // hold the delete action in some central place.
                 this.add(new ActionDeleteModelElements());
             }
         }
@@ -338,15 +340,16 @@
                         classifiers);
                 this.add(action);
             }
-        }
-
-        if (selectedItem instanceof Diagram) {
+        } else if (selectedItem instanceof Diagram) {
             this.add(new ActionSaveDiagramToClipboard());
+            // TODO: Delete should be available on any combination of model
+            // elements and diagrams.
+            // TODO: Shouldn't be creating a new instance here. We should
+            // hold the delete action in some central place.
             ActionDeleteModelElements ad = new ActionDeleteModelElements();
             ad.setEnabled(ad.shouldBeEnabled());
             this.add(ad);
         }
-
     }
 
     /**
@@ -765,6 +768,7 @@
         }
     }
 
+    // TODO: Is this needed now we have ModelManagementHelper.isReadOnly?
     private boolean isRelatedToProfiles(Project currentProject,
             Object selectedItem) {
         boolean found = selectedItem instanceof ProfileConfiguration

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ActionAddStereotype.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ActionAddStereotype.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ActionAddStereotype.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ActionAddStereotype.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ActionAddStereotype.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ActionAddStereotype.java	2008-08-05 02:50:06-0700
@@ -32,6 +32,7 @@
 import org.argouml.kernel.Project;
 import org.argouml.kernel.ProjectManager;
 import org.argouml.kernel.ProjectSettings;
+import org.argouml.kernel.UmlModelMutator;
 import org.argouml.model.Model;
 import org.tigris.gef.undo.UndoableAction;
 
@@ -40,7 +41,9 @@
  * Action to add a sterotype to a model element.
  * @author Bob Tarling
  */
+@UmlModelMutator
 public class ActionAddStereotype extends UndoableAction {
+    
     private Object modelElement;
     private Object stereotype;
 

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionAddNote.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionAddNote.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionAddNote.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionAddNote.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionAddNote.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionAddNote.java	2008-08-05 02:50:06-0700
@@ -35,6 +35,7 @@
 import org.argouml.application.helpers.ResourceLoaderWrapper;
 import org.argouml.i18n.Translator;
 import org.argouml.kernel.ProjectManager;
+import org.argouml.kernel.UmlModelMutator;
 import org.argouml.model.Model;
 import org.argouml.ui.ProjectBrowser;
 import org.argouml.ui.targetmanager.TargetManager;
@@ -54,6 +55,7 @@
  * The modelelements that are present on the current diagram, are connected
  * graphically. All others are only annotated in the model.
  */
+@UmlModelMutator
 public class ActionAddNote extends UndoableAction {
 
     /**

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionAddStereotype.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionAddStereotype.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionAddStereotype.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionAddStereotype.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionAddStereotype.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionAddStereotype.java	2008-08-05 02:50:06-0700
@@ -32,6 +32,7 @@
 import org.argouml.kernel.Project;

 import org.argouml.kernel.ProjectManager;

 import org.argouml.kernel.ProjectSettings;

+import org.argouml.kernel.UmlModelMutator;

 import org.argouml.model.Model;

 import org.tigris.gef.undo.UndoableAction;

 

@@ -40,6 +41,7 @@
  * Action to add a stereotype to a model element.

  * @author Bob Tarling

  */

+@UmlModelMutator

 class ActionAddStereotype extends UndoableAction {

     private Object modelElement;

     private Object stereotype;


Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionModifierAbstract.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionModifierAbstract.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionModifierAbstract.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionModifierAbstract.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionModifierAbstract.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionModifierAbstract.java	2008-08-05 02:50:06-0700
@@ -24,8 +24,10 @@
 
 package org.argouml.uml.diagram.ui;
 
+import org.argouml.kernel.UmlModelMutator;
 import org.argouml.model.Model;
 
+@UmlModelMutator
 class ActionModifierAbstract extends AbstractActionCheckBoxMenuItem {
     
     /**

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionModifierActive.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionModifierActive.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionModifierActive.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionModifierActive.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionModifierActive.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionModifierActive.java	2008-08-05 02:50:06-0700
@@ -24,8 +24,10 @@
 
 package org.argouml.uml.diagram.ui;
 
+import org.argouml.kernel.UmlModelMutator;
 import org.argouml.model.Model;
 
+@UmlModelMutator
 class ActionModifierActive extends AbstractActionCheckBoxMenuItem {
     /**
      * Serial version generated for rev. 1.5

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionModifierLeaf.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionModifierLeaf.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionModifierLeaf.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionModifierLeaf.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionModifierLeaf.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionModifierLeaf.java	2008-08-05 02:50:06-0700
@@ -24,8 +24,10 @@
 
 package org.argouml.uml.diagram.ui;
 
+import org.argouml.kernel.UmlModelMutator;
 import org.argouml.model.Model;
 
+@UmlModelMutator
 class ActionModifierLeaf extends AbstractActionCheckBoxMenuItem {
     /**
      * Serial version generated for rev. 1.5

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionModifierRoot.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionModifierRoot.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionModifierRoot.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionModifierRoot.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionModifierRoot.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionModifierRoot.java	2008-08-05 02:50:06-0700
@@ -24,8 +24,10 @@
 
 package org.argouml.uml.diagram.ui;
 
+import org.argouml.kernel.UmlModelMutator;
 import org.argouml.model.Model;
 
+@UmlModelMutator
 class ActionModifierRoot extends AbstractActionCheckBoxMenuItem {
     /**
      * Serial version generated for rev. 1.5

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionVisibilityPackage.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionVisibilityPackage.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionVisibilityPackage.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionVisibilityPackage.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionVisibilityPackage.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionVisibilityPackage.java	2008-08-05 02:50:06-0700
@@ -24,8 +24,10 @@
 
 package org.argouml.uml.diagram.ui;
 
+import org.argouml.kernel.UmlModelMutator;
 import org.argouml.model.Model;
 
+@UmlModelMutator
 class ActionVisibilityPackage extends AbstractActionRadioMenuItem {
     /**
      * Serial version generated for rev 1.3

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionVisibilityPrivate.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionVisibilityPrivate.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionVisibilityPrivate.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionVisibilityPrivate.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionVisibilityPrivate.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionVisibilityPrivate.java	2008-08-05 02:50:06-0700
@@ -24,9 +24,12 @@
 
 package org.argouml.uml.diagram.ui;
 
+import org.argouml.kernel.UmlModelMutator;
 import org.argouml.model.Model;
 
+@UmlModelMutator
 class ActionVisibilityPrivate extends AbstractActionRadioMenuItem {
+    
     /**
      * Serial version generated for rev 1.5
      */

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionVisibilityProtected.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionVisibilityProtected.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionVisibilityProtected.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionVisibilityProtected.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionVisibilityProtected.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionVisibilityProtected.java	2008-08-05 02:50:06-0700
@@ -24,8 +24,10 @@
 
 package org.argouml.uml.diagram.ui;
 
+import org.argouml.kernel.UmlModelMutator;
 import org.argouml.model.Model;
 
+@UmlModelMutator
 class ActionVisibilityProtected extends AbstractActionRadioMenuItem {
     /**
      * Serial version generated for rev 1.5

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionVisibilityPublic.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionVisibilityPublic.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionVisibilityPublic.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionVisibilityPublic.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionVisibilityPublic.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/ActionVisibilityPublic.java	2008-08-05 02:50:06-0700
@@ -24,8 +24,10 @@
 
 package org.argouml.uml.diagram.ui;
 
+import org.argouml.kernel.UmlModelMutator;
 import org.argouml.model.Model;
 
+@UmlModelMutator
 class ActionVisibilityPublic extends AbstractActionRadioMenuItem {
     /**
      * Serial version generated for rev 1.5

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/FigEdgeModelElement.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/FigEdgeModelElement.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/FigEdgeModelElement.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/FigEdgeModelElement.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/FigEdgeModelElement.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/FigEdgeModelElement.java	2008-08-05 02:50:06-0700
@@ -261,12 +261,13 @@
     }
 
     /**
-     * This method shall return a Vector of one of these 4 types:
-     * AbstractAction, JMenu, JMenuItem, JSeparator.
+     * @return a Vector containing a combination of these 4 types:
+     * Action, JMenu, JMenuItem, JSeparator.
      */
     @Override
     public Vector getPopUpActions(MouseEvent me) {
-        Vector popUpActions = super.getPopUpActions(me);
+        ActionList popUpActions =
+            new ActionList(super.getPopUpActions(me), isReadOnly());
         
         // popupAddOffset should be equal to the number of items added here:
         popUpActions.add(new JSeparator());
@@ -279,9 +280,7 @@
         popUpActions.add(new ActionDeleteModelElements());
         popupAddOffset++;
 
-        /* Check if multiple items are selected: */
-        boolean ms = TargetManager.getInstance().getTargets().size() > 1;
-        if (!ms) {
+        if (TargetManager.getInstance().getTargets().size() == 1) {
             ToDoList list = Designer.theDesigner().getToDoList();
             List<ToDoItem> items = list.elementListForOffender(getOwner());
             if (items != null && items.size() > 0) {
@@ -380,11 +379,16 @@
     }
 
     /**
+     * This is used to draw a box round the edge of any editable FigText
+     * annotations of the edge when the edge is selected.
+     * TODO: This logic probably belongs in our base selection class
+     * SelectionEdgeClarifiers and could be written to discover what FigText
+     * annotations exist rather than hard code in subclasses.
      * @param f the fig to indicate the bounds of
      * @param g the graphics
      */
     protected void indicateBounds(FigText f, Graphics g) {
-        if (f == null) {
+        if (f == null || isReadOnly()) {
             return;
         }
         String text = f.getText();
@@ -706,15 +710,24 @@
      * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
      */
     public void mouseClicked(MouseEvent me) {
-        if (me.isConsumed())
-            return;
-        if (me.getClickCount() >= 2) {
+        if (!me.isConsumed() && !isReadOnly() && me.getClickCount() >= 2) {
             Fig f = hitFig(new Rectangle(me.getX() - 2, me.getY() - 2, 4, 4));
-            if (f instanceof MouseListener && canEdit(f))
+            if (f instanceof MouseListener && canEdit(f)) {
 		((MouseListener) f).mouseClicked(me);
+            }
         }
         me.consume();
     }
+    
+    /**
+     * Return true if the model element that this Fig represents is read only
+     * @return The model element is read only.
+     */
+    private boolean isReadOnly() {
+        return Model.getModelManagementHelper().isReadOnly(getOwner());
+    }
+
+    
 
     /*
      * @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent)
@@ -734,10 +747,12 @@
      * @see java.awt.event.KeyListener#keyTyped(java.awt.event.KeyEvent)
      */
     public void keyTyped(KeyEvent ke) {
-        if (ke.isConsumed())
-            return;
-        if (nameFig != null && canEdit(nameFig))
+        if (!ke.isConsumed()
+                && !isReadOnly()
+                && nameFig != null
+                && canEdit(nameFig)) {
             nameFig.keyTyped(ke);
+        }
     }
 
 

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/FigNodeAssociation.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/FigNodeAssociation.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/FigNodeAssociation.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/FigNodeAssociation.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/FigNodeAssociation.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/FigNodeAssociation.java	2008-08-05 02:50:06-0700
@@ -28,6 +28,7 @@
 import java.awt.Dimension;
 import java.awt.Rectangle;
 import java.beans.PropertyChangeEvent;
+import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 
@@ -133,32 +134,66 @@
      */
     protected void updateLayout(UmlChangeEvent mee) {
         super.updateLayout(mee);
-        if (mee instanceof RemoveAssociationEvent
+        if (mee.getSource() == getOwner()
+                && mee instanceof RemoveAssociationEvent
                 && "connection".equals(mee.getPropertyName())
-                && Model.getFacade().getConnections(mee.getSource()).size() 
-                == 2) {
+                && Model.getFacade().getConnections(getOwner()).size() == 2) {
             reduceToBinary();
         }
     }
 
     /**
-     * When association end nr 3 is removed, 
-     * from the model (OR from the diagram?), 
-     * reduce this to a binary association.
+     * Called when deletion of an association end reduces the number of ends
+     * of an association down to only two. This Fig which represent the diamond
+     * node of a n-ary association needs to be replaced by a FigAssociation
+     * representing the binary relationship.
      */
     private void reduceToBinary() {
         final Object association = getOwner();
+        assert (Model.getFacade().getConnections(association).size() == 2);
+        
+        // Detach any non-associationend edges (such as comment edges) already
+        // attached before this association node is removed.
+        // They'll later be re-attached to the new FigAssociation
+        final Collection<FigEdge> existingEdges = getEdges();
+        for (Iterator<FigEdge> it = existingEdges.iterator(); it.hasNext(); ) {
+            FigEdge edge = it.next();
+            if (edge instanceof FigAssociationEnd) {
+                it.remove();
+            } else {
+                removeFigEdge(edge);
+            }
+        }
+        
+        // Now we can remove ourself (which will also remove the
+        // attached association ends edges)
         final LayerPerspective lay = (LayerPerspective) getLayer();
         final MutableGraphModel gm = (MutableGraphModel) lay.getGraphModel();
         gm.removeNode(association);
         removeFromDiagram();
         
+        // Create the new FigAssociation edge to replace the node
         final GraphEdgeRenderer renderer =
             lay.getGraphEdgeRenderer();
         final FigAssociation figEdge = (FigAssociation) renderer.getFigEdgeFor(
                 gm, lay, association, null);
         lay.add(figEdge);
         gm.addEdge(association);
+        
+        // Add the non-associationend edges (such as comment edges) that were
+        // originally attached to this and attach them to the new
+        // FigAssociation and make sure they are positioned correctly.
+        for (FigEdge edge : existingEdges) {
+            figEdge.makeEdgePort();
+            if (edge.getDestFigNode() == this) {
+                edge.setDestFigNode(figEdge.getEdgePort());
+                edge.setDestPortFig(figEdge.getEdgePort());
+            }
+            if (edge.getSourceFigNode() == this) {
+                edge.setSourceFigNode(figEdge.getEdgePort());
+                edge.setSourcePortFig(figEdge.getEdgePort());
+            }
+        }
         figEdge.computeRoute();
     }
     

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/FigNodeModelElement.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/FigNodeModelElement.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/FigNodeModelElement.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/FigNodeModelElement.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/FigNodeModelElement.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/diagram/ui/FigNodeModelElement.java	2008-08-05 02:50:06-0700
@@ -253,11 +253,13 @@
     private Vector<Fig> enclosedFigs = new Vector<Fig>();
 
     /**
-     * The figure enclosing this figure.
+     * The figure enclosing this figure such as a package surrounding a class.
      */
     private Fig encloser;
 
+    // TODO: Bobs says - what is the purpose of this flag? Please document.
     private boolean readyToEdit = true;
+    
     private boolean suppressCalcBounds;
     private static boolean showBoldName;
 
@@ -478,7 +480,8 @@
      */
     @Override
     public Vector getPopUpActions(MouseEvent me) {
-        Vector popUpActions = super.getPopUpActions(me);
+        ActionList popUpActions =
+            new ActionList(super.getPopUpActions(me), isReadOnly());
 
         // Show ...
         ArgoJMenu show = buildShowPopUp();
@@ -965,7 +968,9 @@
             }
         } else if (pName.equals("editing")
                 && Boolean.TRUE.equals(pve.getNewValue())) {
-            textEditStarted((FigText) src);
+            if (!isReadOnly()) {
+                textEditStarted((FigText) src);
+            }
         } else {
             super.propertyChange(pve);
         }
@@ -1020,6 +1025,14 @@
             SwingUtilities.invokeLater(doWorkRunnable);
         }
     }
+    
+    /**
+     * Return true if the model element that this Fig represents is read only
+     * @return The model element is read only.
+     */
+    private boolean isReadOnly() {
+        return Model.getModelManagementHelper().isReadOnly(getOwner());
+    }
 
     /**
      * Called by propertyChanged when it detects that a stereotype
@@ -1147,10 +1160,9 @@
         }
         if (me.getClickCount() >= 2
                 && !(me.isPopupTrigger()
-                        || me.getModifiers() == InputEvent.BUTTON3_MASK)) {
-            if (getOwner() == null) {
-                return;
-            }
+                        || me.getModifiers() == InputEvent.BUTTON3_MASK)
+                && getOwner() != null
+                && !isReadOnly()) {
             Rectangle r = new Rectangle(me.getX() - 2, me.getY() - 2, 4, 4);
             Fig f = hitFig(r);
             if (f instanceof MouseListener && f.isVisible()) {
@@ -1192,7 +1204,7 @@
      * @see java.awt.event.KeyListener#keyTyped(java.awt.event.KeyEvent)
      */
     public void keyTyped(KeyEvent ke) {
-        if (!editable) {
+        if (!editable || isReadOnly()) {
             return;
         }
         if (!readyToEdit) {
@@ -1579,7 +1591,9 @@
      * @see org.argouml.application.events.ArgoNotationEventListener#notationChanged(org.argouml.application.events.ArgoNotationEvent)
      */
     public void notationChanged(ArgoNotationEvent event) {
-        if (getOwner() == null) return;
+        if (getOwner() == null) {
+            return;
+        }
         initNotationProviders(getOwner());
         try {
             renderingChanged();
@@ -1701,8 +1715,7 @@
 
                 labelFig.addPropertyChangeListener(this);
 
-                getBigPort().
-                setBounds(stereotypeFigProfileIcon.getBounds());
+                getBigPort().setBounds(stereotypeFigProfileIcon.getBounds());
 
                 for (Object fig : getFigs()) {
                     ((Fig) fig).setVisible(fig == stereotypeFigProfileIcon);

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/reveng/java/Modeller.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/reveng/java/Modeller.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/reveng/java/Modeller.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/reveng/java/Modeller.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/reveng/java/Modeller.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/reveng/java/Modeller.java	2008-08-05 02:50:06-0700
@@ -140,9 +140,12 @@
     
     /**
      * Create a new modeller.
-     *
+     * 
      * @param theModel The model to work with.
-     * @param settings the settings to use for this import
+     * @param attributeSelected true if associations should be modeled as
+     *                attributes
+     * @param datatypeSelected true if arrays should be modeled as datatypes
+     *                instead of instead of using UML multiplicities
      * @param theFileName the current file name
      */
     public Modeller(Object theModel, boolean attributeSelected,

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/reveng/ui/RESequenceDiagramDialog.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/reveng/ui/RESequenceDiagramDialog.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/reveng/ui/RESequenceDiagramDialog.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/reveng/ui/RESequenceDiagramDialog.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/reveng/ui/RESequenceDiagramDialog.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/reveng/ui/RESequenceDiagramDialog.java	2008-08-05 02:50:06-0700
@@ -1,5 +1,5 @@
 // $Id$
-// Copyright (c) 1996-2007 The Regents of the University of California. All
+// Copyright (c) 1996-2008 The Regents of the University of California. All
 // Rights Reserved. Permission to use, copy, modify, and distribute this
 // software and its documentation without fee, and without a written
 // agreement is hereby granted, provided that the above copyright notice
@@ -102,7 +102,7 @@
      */
     private static final Logger LOG =
         Logger.getLogger(RESequenceDiagramDialog.class);
-    
+
     /**
      * The UID.
      */
@@ -119,7 +119,6 @@
     
     // TODO: Why is this not final?
     private Modeller modeller;
-    
     private final Object classifier;
     private final Object operation;
     
@@ -183,7 +182,7 @@
                 true);
         setResizable(false);
         this.project = project;
-        
+
         SequenceDiagramLayer layer = (SequenceDiagramLayer) diagram.getLayer();
 
         operation = oper;
@@ -277,7 +276,7 @@
             }
         }
     }
-    
+
     /*
      * @see java.awt.event.ItemListener#itemStateChanged(java.awt.event.ItemEvent)
      */

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/AbstractActionAddModelElement2.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/AbstractActionAddModelElement2.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/AbstractActionAddModelElement2.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/AbstractActionAddModelElement2.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/AbstractActionAddModelElement2.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/AbstractActionAddModelElement2.java	2008-08-05 02:50:06-0700
@@ -34,6 +34,7 @@
 import javax.swing.JOptionPane;

 

 import org.argouml.i18n.Translator;

+import org.argouml.kernel.UmlModelMutator;

 import org.argouml.util.ArgoFrame;

 import org.tigris.gef.undo.UndoableAction;

 

@@ -44,6 +45,7 @@
  * @since Oct 2, 2002

  * @author [email protected]

  */

+@UmlModelMutator

 public abstract class AbstractActionAddModelElement2 extends UndoableAction {

 

     private Object target;


Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/AbstractActionNewModelElement.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/AbstractActionNewModelElement.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/AbstractActionNewModelElement.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/AbstractActionNewModelElement.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/AbstractActionNewModelElement.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/AbstractActionNewModelElement.java	2008-08-05 02:50:06-0700
@@ -29,12 +29,14 @@
 
 import org.argouml.application.helpers.ResourceLoaderWrapper;
 import org.argouml.i18n.Translator;
+import org.argouml.kernel.UmlModelMutator;
 import org.tigris.gef.undo.UndoableAction;
 
 /**
  * @since Oct 3, 2002
  * @author [email protected]
  */
+@UmlModelMutator
 public abstract class AbstractActionNewModelElement extends UndoableAction {
 
     private Object target;

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/ActionDeleteModelElements.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/ActionDeleteModelElements.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/ActionDeleteModelElements.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/ActionDeleteModelElements.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/ActionDeleteModelElements.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/ActionDeleteModelElements.java	2008-08-05 02:50:06-0700
@@ -40,6 +40,7 @@
 import org.argouml.i18n.Translator;
 import org.argouml.kernel.Project;
 import org.argouml.kernel.ProjectManager;
+import org.argouml.kernel.UmlModelMutator;
 import org.argouml.model.InvalidElementException;
 import org.argouml.model.Model;
 import org.argouml.ui.targetmanager.TargetEvent;
@@ -59,6 +60,7 @@
  * Objects can be Modelelements, Diagrams (argodiagram and it's children),
  * Figs without owner,... 
  */
+@UmlModelMutator
 public class ActionDeleteModelElements extends UndoableAction {
 
     /**
@@ -265,6 +267,14 @@
      * @return true if the tool should be enabled
      */
     public boolean shouldBeEnabled() {
+        List targets = TargetManager.getInstance().getTargets();
+        for (Object target : targets) {
+            if (Model.getFacade().isAModelElement(target)
+                    && Model.getModelManagementHelper().isReadOnly(target)) {
+                return false;
+            }
+        }
+        
         int size = 0;
         try {
             Editor ce = Globals.curEditor();
@@ -278,6 +288,8 @@
         if (size > 0) {
             return true;
         }
+        // TODO: All of the following can be broken if we have multiple
+        // targets selected
         Object target = TargetManager.getInstance().getTarget();
         if (target instanceof ArgoDiagram) { 
             // we cannot delete the last diagram

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/ElementPropPanelFactory.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/ElementPropPanelFactory.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/ElementPropPanelFactory.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/ElementPropPanelFactory.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/ElementPropPanelFactory.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/ElementPropPanelFactory.java	2008-08-05 02:50:06-0700
@@ -252,7 +252,12 @@
             }
         } else if (Model.getFacade().isAUseCase(element)) {
             return new PropPanelUseCase();
-        }
+        } 
+        
+        // TODO: In UML 2.x Associations will fall through here because they
+        // are Classifiers as well as Relationships, but we test for Classifier
+        // first.
+        
         throw new IllegalArgumentException("Unsupported Element type");
     }
 

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/PropPanel.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/PropPanel.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/PropPanel.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/PropPanel.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/PropPanel.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/PropPanel.java	2008-08-05 02:50:06-0700
@@ -57,6 +57,7 @@
 import org.argouml.i18n.Translator;
 import org.argouml.kernel.ProfileConfiguration;
 import org.argouml.kernel.ProjectManager;
+import org.argouml.kernel.UmlModelMutator;
 import org.argouml.model.Model;
 import org.argouml.ui.ActionCreateContainedModelElement;
 import org.argouml.ui.LookAndFeelMgr;
@@ -134,6 +135,7 @@
     @Deprecated
     public PropPanel(String label, ImageIcon icon, Orientation orientation) {
         super(Translator.localize(label));
+        
         setOrientation(orientation);
         
         LabelledLayout layout =
@@ -235,7 +237,9 @@
     }
     
     public void buildToolbar() {
-        ToolBarFactory factory = new ToolBarFactory(actions);
+        LOG.debug("Building toolbar");
+
+        ToolBarFactory factory = new ToolBarFactory(getActions());
         factory.setRollover(true);
         factory.setFloatable(false);
         JToolBar toolBar = factory.createToolBar();
@@ -248,6 +252,14 @@
                 Translator.localize("action.select"));
     }
 
+    /**
+     * Get the actions that will make up the toolbar on this panel.
+     * @return The list of actions to show for this panel.
+     */
+    protected List getActions() {
+        return actions;
+    }
+
     private static class TargettableButton extends JButton
         implements TargettableModelView {
 
@@ -394,6 +406,7 @@
             dispatch = new UMLChangeDispatch(this,
                     UMLChangeDispatch.TARGET_CHANGED_ADD);
 
+            buildToolbar();
         } else {
             dispatch = new UMLChangeDispatch(this,
                     UMLChangeDispatch.TARGET_REASSERTED);
@@ -653,12 +666,25 @@
         return titleLabel;
     }
 
-    protected JPanel createBorderPanel(String title) {
-    	JPanel panel = new JPanel(new GridLayout2());
-    	TitledBorder border = new TitledBorder(Translator.localize(title));
-    	border.setTitleFont(stdFont);
-    	panel.setBorder(border);
-    	return panel;
+    protected final JPanel createBorderPanel(String title) {
+    	return new GroupPanel(Translator.localize(title));
+    }
+    
+    private class GroupPanel extends JPanel {
+        
+        public GroupPanel(String title) {
+            super(new GridLayout2());
+            TitledBorder border = new TitledBorder(Translator.localize(title));
+            border.setTitleFont(stdFont);
+            setBorder(border);
+        }
+        
+        public void setEnabled(boolean enabled) {
+            super.setEnabled(enabled);
+            for (final Component component : getComponents()) {
+                component.setEnabled(enabled);
+            }
+        }
     }
 
     /**

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/TabProps.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/TabProps.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/TabProps.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/TabProps.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/TabProps.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/TabProps.java	2008-08-05 02:50:06-0700
@@ -248,9 +248,6 @@
             LOG.debug("Factory created " + panel.getClass().getName()
                     + " for " + trgt.getClass().getName());
             panels.put(trgt.getClass(), panel);
-            if (panel instanceof PropPanel) {
-        	((PropPanel) panel).buildToolbar();
-            }
             return panel;
         }
 
@@ -284,9 +281,9 @@
             ((Orientable) propPanel).setOrientation(getOrientation());
         }
         
+        // TODO: We shouldn't need this as well as the above.
         if (propPanel instanceof PropPanel) {
             ((PropPanel) propPanel).setOrientation(getOrientation());
-            ((PropPanel) propPanel).buildToolbar();
         }
 
         return propPanel;

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/UMLComboBoxNavigator.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/UMLComboBoxNavigator.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/UMLComboBoxNavigator.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/UMLComboBoxNavigator.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/UMLComboBoxNavigator.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/UMLComboBoxNavigator.java	2008-08-05 02:50:06-0700
@@ -172,4 +172,9 @@
             theButton.setEnabled(false);
         }
     }
+    
+    public void setEnabled(boolean enabled) {
+        theComboBox.setEnabled(enabled);
+        theComboBox.setEditable(enabled);
+    }
 }

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/UMLList2.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/UMLList2.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/UMLList2.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/UMLList2.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/UMLList2.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/UMLList2.java	2008-08-05 02:50:06-0700
@@ -33,6 +33,7 @@
 import javax.swing.ListCellRenderer;
 import javax.swing.ListModel;
 
+import org.argouml.model.Model;
 import org.argouml.ui.LookAndFeelMgr;
 import org.argouml.ui.targetmanager.TargetListener;
 import org.argouml.ui.targetmanager.TargettableModelView;
@@ -88,55 +89,46 @@
      * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
      */
     public void mouseClicked(MouseEvent e) {
-        if (e.isPopupTrigger()) {
-            showPopup(e);
-        }
+        showPopup(e);
     }
     
     /*
      * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
      */
     public void mouseEntered(MouseEvent e) {
-        if (e.isPopupTrigger()) {
-            showPopup(e);
-        }
     }
     
     /*
      * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
      */
     public void mouseExited(MouseEvent e) {
-        if (e.isPopupTrigger()) {
-            showPopup(e);
-        }
     }
     
     /*
      * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
      */
     public void mousePressed(MouseEvent e) {
-        if (e.isPopupTrigger()) {
-            showPopup(e);
-        }
+        showPopup(e);
     }
     
     /*
      * @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
      */
     public void mouseReleased(MouseEvent e) {
-        if (e.isPopupTrigger()) {
-            showPopup(e);
-        }
+        showPopup(e);
     }
 
     private final void showPopup(MouseEvent event) {
-        Point point = event.getPoint();
-        int index = locationToIndex(point);
-        JPopupMenu popup = new JPopupMenu();
-        ListModel lm = getModel(); 
-        if (lm instanceof UMLModelElementListModel2) {
-            if (((UMLModelElementListModel2) lm).buildPopup(popup, index)) {
-                popup.show(this, point.x, point.y);
+        if (event.isPopupTrigger()
+                && !Model.getModelManagementHelper().isReadOnly(getTarget())) {
+            Point point = event.getPoint();
+            int index = locationToIndex(point);
+            JPopupMenu popup = new JPopupMenu();
+            ListModel lm = getModel(); 
+            if (lm instanceof UMLModelElementListModel2) {
+                if (((UMLModelElementListModel2) lm).buildPopup(popup, index)) {
+                    popup.show(this, point.x, point.y);
+                }
             }
         }
     }

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/UMLMutableLinkedList.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/UMLMutableLinkedList.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/UMLMutableLinkedList.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/UMLMutableLinkedList.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/UMLMutableLinkedList.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/UMLMutableLinkedList.java	2008-08-05 02:50:06-0700
@@ -32,6 +32,8 @@
 
 import javax.swing.JPopupMenu;
 
+import org.argouml.model.Model;
+
 /**
  * This class is the GUI front for a mutable linked list. The user can add,
  * delete or create modelelements to the model. He can do that via a popup menu.
@@ -292,7 +294,8 @@
      */
     @Override
     public void mouseReleased(MouseEvent e) {
-        if (e.isPopupTrigger()) {
+        if (e.isPopupTrigger()
+                && !Model.getModelManagementHelper().isReadOnly(getTarget())) {
             Point point = e.getPoint();
             int index = locationToIndex(point);
             JPopupMenu popup = getPopupMenu();
@@ -313,7 +316,8 @@
      */
     @Override
     public void mousePressed(MouseEvent e) {
-        if (e.isPopupTrigger()) {
+        if (e.isPopupTrigger()
+                && !Model.getModelManagementHelper().isReadOnly(getTarget())) {
             JPopupMenu popup = getPopupMenu();
             if (popup.getComponentCount() > 0) {
                 initActions();
@@ -374,7 +378,8 @@
      */
     @Override
     public void mouseClicked(MouseEvent e) {
-        if (e.isPopupTrigger()) {
+        if (e.isPopupTrigger()
+                && !Model.getModelManagementHelper().isReadOnly(getTarget())) {
             JPopupMenu popup = getPopupMenu();
             if (popup.getComponentCount() > 0) {
                 initActions();

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/ActionAddAttribute.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/ActionAddAttribute.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/ActionAddAttribute.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/ActionAddAttribute.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/ActionAddAttribute.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/ActionAddAttribute.java	2008-08-05 02:50:06-0700
@@ -32,6 +32,7 @@
 import org.argouml.i18n.Translator;
 import org.argouml.kernel.Project;
 import org.argouml.kernel.ProjectManager;
+import org.argouml.kernel.UmlModelMutator;
 import org.argouml.model.Model;
 import org.argouml.ui.targetmanager.TargetEvent;
 import org.argouml.ui.targetmanager.TargetListener;
@@ -44,6 +45,7 @@
  * This class shall be the only one that knows 
  * when this tool should be downlighted or not.
  */
+@UmlModelMutator
 public class ActionAddAttribute extends UndoableAction {
 
     private static ActionAddAttribute targetFollower;
@@ -115,7 +117,9 @@
      */
     public boolean shouldBeEnabled() {
         Object target = TargetManager.getInstance().getSingleModelTarget();
-        if (target == null) return false;
+        if (target == null) {
+            return false;
+        }
         return Model.getFacade().isAClassifier(target)
             || Model.getFacade().isAFeature(target)
             || Model.getFacade().isAAssociationEnd(target);

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/ActionAddEnumerationLiteral.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/ActionAddEnumerationLiteral.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/ActionAddEnumerationLiteral.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/ActionAddEnumerationLiteral.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/ActionAddEnumerationLiteral.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/ActionAddEnumerationLiteral.java	2008-08-05 02:50:06-0700
@@ -28,6 +28,7 @@
 
 import org.argouml.application.helpers.ResourceLoaderWrapper;
 import org.argouml.i18n.Translator;
+import org.argouml.kernel.UmlModelMutator;
 import org.argouml.model.Model;
 import org.argouml.ui.targetmanager.TargetManager;
 import org.tigris.gef.undo.UndoableAction;
@@ -35,6 +36,7 @@
 /**
  * Action to add an operation to a classifier.
  */
+@UmlModelMutator
 public class ActionAddEnumerationLiteral extends UndoableAction {
 
     /**

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/ActionAddOperation.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/ActionAddOperation.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/ActionAddOperation.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/ActionAddOperation.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/ActionAddOperation.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/ActionAddOperation.java	2008-08-05 02:50:06-0700
@@ -32,6 +32,7 @@
 import org.argouml.i18n.Translator;
 import org.argouml.kernel.Project;
 import org.argouml.kernel.ProjectManager;
+import org.argouml.kernel.UmlModelMutator;
 import org.argouml.model.Model;
 import org.argouml.ui.targetmanager.TargetEvent;
 import org.argouml.ui.targetmanager.TargetListener;
@@ -41,6 +42,7 @@
 /**
  * Action to add an operation to a classifier.
  */
+@UmlModelMutator
 public class ActionAddOperation extends UndoableAction {
 
     private static ActionAddOperation targetFollower;

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/PropPanelAssociation.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/PropPanelAssociation.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/PropPanelAssociation.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/PropPanelAssociation.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/PropPanelAssociation.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/PropPanelAssociation.java	2008-08-05 02:50:06-0700
@@ -36,7 +36,9 @@
 
 /**
  * The properties panel for a Association.
- *
+ * <p>
+ * TODO: In UML 2.x an Association is both a Relationship and a Classifier, so
+ * this inheritance hierarchy needs to be changed.
  */
 public class PropPanelAssociation extends PropPanelRelationship {
 

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/PropPanelModelElement.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/PropPanelModelElement.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/PropPanelModelElement.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/PropPanelModelElement.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/PropPanelModelElement.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/PropPanelModelElement.java	2008-08-05 02:50:06-0700
@@ -24,15 +24,22 @@
 
 package org.argouml.uml.ui.foundation.core;
 
+import java.awt.Component;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.Action;
 import javax.swing.ImageIcon;
 import javax.swing.JComboBox;
 import javax.swing.JComponent;
+import javax.swing.JLabel;
 import javax.swing.JList;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 import javax.swing.JTextField;
 
 import org.argouml.i18n.Translator;
+import org.argouml.kernel.UmlModelMutator;
 import org.argouml.model.Model;
 import org.argouml.ui.targetmanager.TargetManager;
 import org.argouml.uml.ui.PropPanel;
@@ -47,7 +54,6 @@
 
 /**
  * The properties panel for a modelelement.
- *
  */
 public abstract class PropPanelModelElement extends PropPanel {
 
@@ -170,6 +176,43 @@
                 new UMLDerivedCheckBox());
 
     }
+    
+    /*
+     * @see org.argouml.uml.ui.PropPanel#setTarget(java.lang.Object)
+     */
+    public void setTarget(Object target) {
+        super.setTarget(target);
+        boolean enable =
+            !Model.getModelManagementHelper().isReadOnly(target);
+        for (final Component component : getComponents()) {
+            if (!(component instanceof JLabel)) {
+                component.setEnabled(enable);
+            }
+        }
+    }
+
+    /**
+     * This overrides the behaviour of the base class to filter out any
+     * actions that could be used to attempt to modify the UML model on
+     * a readonly element.
+     * @return The list of actions to show for this panel.
+     */
+    protected final List getActions() {
+        List actions = super.getActions();
+        if (Model.getFacade().isAUMLElement(getTarget())
+                && Model.getModelManagementHelper().isReadOnly(getTarget())) {
+            final List filteredActions = new ArrayList(2);
+            for (Object o : actions) {
+                if (o instanceof Action && !o.getClass().isAnnotationPresent(
+                        UmlModelMutator.class)) {
+                    filteredActions.add(o);
+                }
+            }
+            return filteredActions;
+        } else {
+            return actions;
+        }
+    }
 
     /**
      * Calling this method navigates the target one level up, to the owner of

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/UMLModelElementVisibilityRadioButtonPanel.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/UMLModelElementVisibilityRadioButtonPanel.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/UMLModelElementVisibilityRadioButtonPanel.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/UMLModelElementVisibilityRadioButtonPanel.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/UMLModelElementVisibilityRadioButtonPanel.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/core/UMLModelElementVisibilityRadioButtonPanel.java	2008-08-05 02:50:06-0700
@@ -24,6 +24,7 @@
 
 package org.argouml.uml.ui.foundation.core;
 
+import java.awt.Component;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -105,5 +106,11 @@
             }
         }
     }
+    
+    public void setEnabled(boolean enabled) {
+        for (final Component component : getComponents()) {
+            component.setEnabled(enabled);
+        }
+    }
 
 }

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/extension_mechanisms/ActionNewTagDefinition.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/extension_mechanisms/ActionNewTagDefinition.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/extension_mechanisms/ActionNewTagDefinition.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/extension_mechanisms/ActionNewTagDefinition.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/extension_mechanisms/ActionNewTagDefinition.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/foundation/extension_mechanisms/ActionNewTagDefinition.java	2008-08-05 02:50:06-0700
@@ -30,6 +30,7 @@
 
 import org.argouml.application.helpers.ResourceLoaderWrapper;
 import org.argouml.i18n.Translator;
+import org.argouml.kernel.UmlModelMutator;
 import org.argouml.model.Model;
 import org.argouml.ui.targetmanager.TargetManager;
 import org.tigris.gef.undo.UndoableAction;
@@ -41,6 +42,7 @@
  *
  * @author [email protected]
  */
+@UmlModelMutator
 public class ActionNewTagDefinition extends UndoableAction {
 
     /**

Modified: branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/model_management/PropPanelPackage.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/model_management/PropPanelPackage.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/model_management/PropPanelPackage.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/model_management/PropPanelPackage.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/model_management/PropPanelPackage.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/src/org/argouml/uml/ui/model_management/PropPanelPackage.java	2008-08-05 02:50:06-0700
@@ -37,6 +37,7 @@
 
 import org.argouml.application.helpers.ResourceLoaderWrapper;
 import org.argouml.i18n.Translator;
+import org.argouml.kernel.UmlModelMutator;
 import org.argouml.model.Model;
 import org.argouml.ui.targetmanager.TargetManager;
 import org.argouml.uml.ui.ActionNavigateNamespace;
@@ -212,6 +213,7 @@
  * that the doIt(), getChoices(), and getSelected() methods here accept an extra
  * argument containing the target.
  */
+@UmlModelMutator
 class ActionDialogElementImport extends UndoableAction {
 
     /**

Modified: branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/kernel/TestProjectWithProfiles.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/kernel/TestProjectWithProfiles.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/kernel/TestProjectWithProfiles.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/kernel/TestProjectWithProfiles.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/kernel/TestProjectWithProfiles.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/kernel/TestProjectWithProfiles.java	2008-08-05 02:50:06-0700
@@ -33,6 +33,7 @@
 import java.io.IOException;
 import java.lang.reflect.Method;
 import java.util.Collection;
+import java.util.List;
 
 import junit.framework.TestCase;
 
@@ -92,16 +93,22 @@
 
     /**
      * Basic test that a new project contains a {@link ProfileConfiguration} 
-     * and that this contains at least the UML profile.
+     * and that this contains the default profiles.
      */
     public void testCreatedProjectContainsProfileConfiguration() {
+        List<Profile> defaultProfiles 
+            = ProfileFacade.getManager().getDefaultProfiles();               
+        
         Project project = ProjectManager.getManager().makeEmptyProject();
         ProfileConfiguration profileConfiguration = 
             project.getProfileConfiguration();
+                        
         assertNotNull(profileConfiguration);
         assertNotNull(profileConfiguration.getProfiles());
-        assertTrue(profileConfiguration.getProfiles().contains(
-                ProfileFacade.getManager().getUMLProfile()));
+        
+        for (Profile profile : defaultProfiles) {
+            assertTrue(profileConfiguration.getProfiles().contains(profile));
+        }
     }
     
     /**

Modified: branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/persistence/TestZargoFilePersister.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/persistence/TestZargoFilePersister.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/persistence/TestZargoFilePersister.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/persistence/TestZargoFilePersister.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/persistence/TestZargoFilePersister.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/persistence/TestZargoFilePersister.java	2008-08-05 02:50:06-0700
@@ -120,7 +120,8 @@
      * @throws Exception when e.g. the file is not found
      */
     public void testDoLoadEmptyUml13() throws Exception {
-        doLoad("/testmodels/uml13/Empty.zargo");
+        Project p = doLoad("/testmodels/uml13/Empty.zargo");
+        p.remove();
     }
 
     /**
@@ -129,7 +130,8 @@
      * @throws Exception when e.g. the file is not found
      */
     public void testDoLoadEmptyUml14() throws Exception {
-        doLoad("/testmodels/uml14/EmptyProject024.zargo");
+        Project p = doLoad("/testmodels/uml14/EmptyProject024.zargo");
+        p.remove();
     }
 
     /**
@@ -138,7 +140,8 @@
      * @throws Exception when e.g. the file is not found
      */
     public void testDoLoadUml13() throws Exception {
-        doLoad("/testmodels/uml13/Alittlebitofeverything.zargo");
+        Project p = doLoad("/testmodels/uml13/Alittlebitofeverything.zargo");
+        p.remove();
     }
 
     /**
@@ -147,8 +150,10 @@
      * @throws Exception when e.g. the file is not found
      */
     public void testDoLoadUml14() throws Exception {
-        doLoad("/testmodels/uml14/Alittlebitofeverything.zargo");
-        doLoad("/testmodels/uml14/SequenceDiagram.zargo");
+        Project p = doLoad("/testmodels/uml14/Alittlebitofeverything.zargo");
+        p.remove();
+        p = doLoad("/testmodels/uml14/SequenceDiagram.zargo");
+        p.remove();
     }
 
     /**
@@ -157,7 +162,8 @@
      * @throws Exception when e.g. the file is not found
      */
     public void testDoLoadUml14i18n() throws Exception {
-        doLoad("/testmodels/uml14/i18n.zargo");
+        Project p = doLoad("/testmodels/uml14/i18n.zargo");
+        p.remove();
     }
 
     
@@ -170,6 +176,7 @@
         Project p = doLoad("/testmodels/uml14/Alittlebitofeverything.zargo");
         ZargoFilePersister persister = new ZargoFilePersister();
         persister.save(p, new File("Alittlebitofeverything2.zargo"));
+        p.remove();
     }
 
     /**
@@ -204,11 +211,11 @@
             InterruptedException {
      
         // Load a project which contains links to it
-        doLoad("/testmodels/uml14/LinkedProfile.zargo");
+        Project p = doLoad("/testmodels/uml14/LinkedProfile.zargo");
         
         // Make sure the contents match what we expect
         final Facade f = Model.getFacade();
-        Collection topElements = f.getRootElements();
+        Collection topElements = p.getRoots();
         assertFalse("No top level elements", topElements.isEmpty());
         for (Object element : topElements) {
             if (f.isAClass(element)) {
@@ -222,6 +229,8 @@
                         f.getName(parent));
             }
         }
+        
+        p.remove();
     }
 }
 

Modified: branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/profile/internal/TestProfileManagerImpl.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/profile/internal/TestProfileManagerImpl.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/profile/internal/TestProfileManagerImpl.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/profile/internal/TestProfileManagerImpl.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/profile/internal/TestProfileManagerImpl.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/profile/internal/TestProfileManagerImpl.java	2008-08-05 02:50:06-0700
@@ -24,14 +24,17 @@
 
 package org.argouml.profile.internal;
 
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.Vector;
 
 import junit.framework.TestCase;
 
 import org.argouml.model.InitializeModel;
 import org.argouml.profile.Profile;
+import org.argouml.profile.ProfileException;
 import org.argouml.profile.ProfileManager;
 
 /**
@@ -89,6 +92,29 @@
         manager.removeProfile(umlProfile);
         assertFalse(manager.getRegisteredProfiles().contains(umlProfile));
         assertFalse(manager.getDefaultProfiles().contains(umlProfile));
+        Profile testProfile = new Profile() {
+
+            @Override
+            public String getDisplayName() {
+                return "Test Profile";
+            }
+
+            @Override
+            public Collection getProfilePackages() throws ProfileException {
+                return new Vector();
+            }
+            
+        };
+        
+        manager.registerProfile(testProfile);        
+        assertTrue(manager.getRegisteredProfiles().contains(testProfile));
+        
+        manager.addToDefaultProfiles(testProfile);                
+        assertTrue(manager.getDefaultProfiles().contains(testProfile));
+        
+        manager.removeProfile(testProfile);
+        assertFalse(manager.getRegisteredProfiles().contains(testProfile));
+        assertFalse(manager.getDefaultProfiles().contains(testProfile));
     }
 
 }

Modified: branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/uml/ui/GUITestActionSaveGraphics.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/uml/ui/GUITestActionSaveGraphics.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/uml/ui/GUITestActionSaveGraphics.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/uml/ui/GUITestActionSaveGraphics.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/uml/ui/GUITestActionSaveGraphics.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/uml/ui/GUITestActionSaveGraphics.java	2008-08-05 02:50:06-0700
@@ -1,5 +1,5 @@
 // $Id$
-// Copyright (c) 2004-2007 The Regents of the University of California. All
+// Copyright (c) 2004-2008 The Regents of the University of California. All
 // Rights Reserved. Permission to use, copy, modify, and distribute this
 // software and its documentation without fee, and without a written
 // agreement is hereby granted, provided that the above copyright notice
@@ -27,12 +27,19 @@
 import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
+import javax.swing.JPanel;
 
 import junit.framework.TestCase;
 
+// Test classes
 import org.argouml.model.InitializeModel;
-import org.argouml.profile.init.InitProfileSubsystem;
 import org.argouml.util.CheckMain;
+import org.argouml.application.InitSubSystemForTest;
+
+// Real classes
+import org.argouml.notation.providers.uml.InitNotationUml;
+import org.argouml.profile.init.InitProfileSubsystem;
+import org.argouml.ui.ProjectBrowser;
 
 /**
  * @author Linus Tolke
@@ -57,6 +64,9 @@
         super.setUp();
         InitializeModel.initializeDefault();
         new InitProfileSubsystem().init();
+        ProjectBrowser.makeInstance(null, true, new JPanel());
+	InitSubSystemForTest.initSubsystem(new InitUmlUI());
+        InitSubSystemForTest.initSubsystem(new InitNotationUml());
     }
 
     /**

Modified: branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/util/CheckMain.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/util/CheckMain.java?view=diff&rev=15510&p1=branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/util/CheckMain.java&p2=branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/util/CheckMain.java&r1=15509&r2=15510
==============================================================================
--- branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/util/CheckMain.java	(original)
+++ branches/gsoc2008/work_issue5029_maurelio1234/tests/org/argouml/util/CheckMain.java	2008-08-05 02:50:06-0700
@@ -1,5 +1,5 @@
 // $Id$
-// Copyright (c) 2004-2007 The Regents of the University of California. All
+// Copyright (c) 2004-2008 The Regents of the University of California. All
 // Rights Reserved. Permission to use, copy, modify, and distribute this
 // software and its documentation without fee, and without a written
 // agreement is hereby granted, provided that the above copyright notice
@@ -25,6 +25,8 @@
 package org.argouml.util;
 
 import java.io.File;
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.List;
 
@@ -65,11 +67,18 @@
      */
     public static File getTestModel(String filename) {
         // This works when running the test from within Eclipse.
-        // Apparantly Eclipse runs the tests using a classloader that
+        // Apparently Eclipse runs the tests using a class-loader that
         // has the tests Folder among the URL:s.
         URL url = CheckMain.class.getClassLoader().getResource(filename);
         if (url != null) {
-            return new File(url.getFile());
+            URI uri;
+            try {
+                uri = url.toURI();
+                return new File(uri);
+            } catch (URISyntaxException e) {
+                Assert.fail("Could not locate the model due to "
+                        + "URI syntax problem for " + filename);
+            }
         }
 
         // We have the path provided from the build script.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.