Revision: 3416
Author: silva.josemanuel1
Date: Mon Mar 29 09:06:23 2010
Log: Wrapped the reverse engineering, copying, and deletion of multiple
objects into a transaction.
Enterprise sessions no longer ask to be saved upon closing.
Resolved some UI conflicts involivng one user dragging an object while the
other does something else before the first is done. However, currently only
works correctly if the other user is moving the same object.
Changes to reflect the name change of ClientSideSession to
RevisionController.
http://code.google.com/p/power-architect/source/detail?r=3416
Modified:
/trunk/src/main/java/ca/sqlpower/architect/enterprise/ArchitectClientSideSession.java
/trunk/src/main/java/ca/sqlpower/architect/enterprise/NetworkConflictResolver.java
/trunk/src/main/java/ca/sqlpower/architect/swingui/ArchitectSwingSessionImpl.java
/trunk/src/main/java/ca/sqlpower/architect/swingui/ContainerPane.java
/trunk/src/main/java/ca/sqlpower/architect/swingui/PlayPen.java
/trunk/src/main/java/ca/sqlpower/architect/swingui/PlayPenComponent.java
/trunk/src/main/java/ca/sqlpower/architect/swingui/PlayPenContentPane.java
/trunk/src/main/java/ca/sqlpower/architect/swingui/Relationship.java
/trunk/src/main/java/ca/sqlpower/architect/swingui/action/DeleteSelectedAction.java
/trunk/src/main/java/ca/sqlpower/architect/swingui/enterprise/RevisionListPanel.java
/trunk/src/main/java/ca/sqlpower/architect/swingui/enterprise/RevisionsTable.java
=======================================
---
/trunk/src/main/java/ca/sqlpower/architect/enterprise/ArchitectClientSideSession.java
Wed Mar 24 07:30:37 2010
+++
/trunk/src/main/java/ca/sqlpower/architect/enterprise/ArchitectClientSideSession.java
Mon Mar 29 09:06:23 2010
@@ -59,7 +59,7 @@
import ca.sqlpower.diff.DiffInfo;
import ca.sqlpower.diff.SimpleDiffChunkJSONConverter;
import ca.sqlpower.enterprise.TransactionInformation;
-import ca.sqlpower.enterprise.client.ClientSideSession;
+import ca.sqlpower.enterprise.client.RevisionController;
import ca.sqlpower.enterprise.client.SPServerInfo;
import ca.sqlpower.sql.DataSourceCollection;
import ca.sqlpower.sql.DatabaseListChangeEvent;
@@ -77,7 +77,7 @@
import ca.sqlpower.util.UserPrompter.UserPromptOptions;
import ca.sqlpower.util.UserPrompter.UserPromptResponse;
-public class ArchitectClientSideSession extends ArchitectSessionImpl
implements ClientSideSession {
+public class ArchitectClientSideSession extends ArchitectSessionImpl
implements RevisionController {
private static Logger logger =
Logger.getLogger(ArchitectClientSideSession.class);
private static CookieStore cookieStore = new BasicCookieStore();
@@ -868,4 +868,8 @@
public String getPref(String prefName, String def) {
return prefs.get(projectLocation.getUUID() + "." + prefName, def);
}
-}
+
+ public int getCurrentRevisionNumber() {
+ return updater.getRevision();
+ }
+}
=======================================
---
/trunk/src/main/java/ca/sqlpower/architect/enterprise/NetworkConflictResolver.java
Mon Mar 22 10:45:23 2010
+++
/trunk/src/main/java/ca/sqlpower/architect/enterprise/NetworkConflictResolver.java
Mon Mar 29 09:06:23 2010
@@ -435,7 +435,12 @@
}
public static interface UpdateListener {
- // true indicates that the updater should be removed from the list.
+ /**
+ * Fired when an update from the server has been performed on the
client
+ * @param resolver The NetworkConflictResolver that received the
update
+ * @return true if the listener should be removed from
+ * listener list and should not receive any more calls
+ */
public boolean updatePerformed(NetworkConflictResolver resolver);
}
}
=======================================
---
/trunk/src/main/java/ca/sqlpower/architect/swingui/ArchitectSwingSessionImpl.java
Thu Mar 18 10:14:14 2010
+++
/trunk/src/main/java/ca/sqlpower/architect/swingui/ArchitectSwingSessionImpl.java
Mon Mar 29 09:06:23 2010
@@ -606,13 +606,10 @@
* shutting down running threads, and so on.
*/
public boolean close() {
- return close(true);
- }
-
- private boolean close(boolean promptForSave) {
// IMPORTANT NOTE: If the GUI hasn't been initialized, frame will be
null.
-
- if (promptForSave) {
+
+ if (!delegateSession.isEnterpriseSession()) {
+ // Only prompt to save if it is not an enterprise session
if (getProjectLoader().isSaveInProgress()) {
// project save is in progress, don't allow exit
JOptionPane.showMessageDialog(frame,
@@ -624,9 +621,7 @@
if (!promptForUnsavedModifications()) {
return false;
}
- }
-
- if (delegateSession.isEnterpriseSession()) {
+ } else {
getEnterpriseSession().putPref("zoom", playPen.getZoom());
}
@@ -1186,7 +1181,7 @@
dialog.setAlwaysOnTop(true);
dialog.setVisible(true);
- close(false);
+ close();
((ArchitectClientSideSession) ((ArchitectSwingSessionImpl)
newSession).getDelegateSession())
.getUpdater().addListener(new
NetworkConflictResolver.UpdateListener() {
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/swingui/ContainerPane.java
Wed Mar 17 14:29:59 2010
+++ /trunk/src/main/java/ca/sqlpower/architect/swingui/ContainerPane.java
Mon Mar 29 09:06:23 2010
@@ -234,7 +234,8 @@
Iterator<ContainerPane<?, ?> > it =
pp.getSelectedContainers().iterator();
logger.debug("event point: " + p); //$NON-NLS-1$
logger.debug("zoomed event point: " + pp.zoomPoint(new
Point(p))); //$NON-NLS-1$
- pp.draggingTablePanes = true;
+ pp.setDraggingTablePanes(true);
+ startedDragging();
while (it.hasNext()) {
// create FloatingContainerPaneListener for each
selected item
@@ -255,7 +256,7 @@
}
} else if (evt.getID() == MouseEvent.MOUSE_MOVED || evt.getID() ==
MouseEvent.MOUSE_DRAGGED) {
setSelected(pp.rubberBand.intersects(getBounds(new
Rectangle())),SelectionEvent.SINGLE_SELECT);
- }
+ }
}
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/swingui/PlayPen.java Thu Mar
18 10:14:14 2010
+++ /trunk/src/main/java/ca/sqlpower/architect/swingui/PlayPen.java Mon Mar
29 09:06:23 2010
@@ -1575,12 +1575,13 @@
}
}
- session.getPlayPen().startCompoundEdit("Drag to
Playpen"); //$NON-NLS-1$
+ session.getPlayPen().startCompoundEdit("Drag to
Playpen"); //$NON-NLS-1$
// Filter out objects that would lose ETL lineage against the user's
will.
ImportSafetyChecker checker = new
ImportSafetyChecker(session);
sqlObjects = checker.filterImportedItems(sqlObjects);
+ session.getPlayPen().getPlayPenContentPane().begin("Drag to
Playpen");
try {
// reset iterator
@@ -1641,9 +1642,14 @@
logger.error("Unknown object dropped in PlayPen: "+someData);
//$NON-NLS-1$
}
}
+
session.getPlayPen().getPlayPenContentPane().commit();
} catch (SQLObjectException e) {
+
session.getPlayPen().getPlayPenContentPane().rollback(e.getMessage());
ASUtils.showExceptionDialog(session,
"Unexpected Exception During Import", e); //$NON-NLS-1$
+ } catch (Throwable e) {
+
session.getPlayPen().getPlayPenContentPane().rollback(e.getMessage());
+ throw new RuntimeException(e);
} finally {
session.getArchitectFrame().getContentPane().setCursor(new
Cursor(Cursor.DEFAULT_CURSOR));
session.getPlayPen().endCompoundEdit("Ending multi-select");
//$NON-NLS-1$
@@ -2083,27 +2089,38 @@
Transferable t = dtde.getTransferable();
PlayPen playpen = (PlayPen)
dtde.getDropTargetContext().getComponent();
+ PlayPenContentPane cp = playpen.getPlayPenContentPane();
try {
- Point dropLoc = playpen.unzoomPoint(new
Point(dtde.getLocation()));
- if (playpen.addTransferable(t, dropLoc,
TransferStyles.REVERSE_ENGINEER)){
+ Point dropLoc = playpen.unzoomPoint(new
Point(dtde.getLocation()));
+ cp.begin("Reverse engineering database");
+ if (playpen.addTransferable(t, dropLoc,
TransferStyles.REVERSE_ENGINEER)){
dtde.acceptDrop(DnDConstants.ACTION_COPY);
dtde.dropComplete(true);
+ cp.commit();
} else {
dtde.rejectDrop();
+ cp.rollback("Reverse engineer unsuccessful");
}
} catch (UnsupportedFlavorException ufe) {
logger.error(ufe);
dtde.rejectDrop();
+ cp.rollback("Reverse engineer unsuccessful");
} catch (IOException ioe) {
logger.error(ioe);
dtde.rejectDrop();
+ cp.rollback("Reverse engineer unsuccessful");
} catch (InvalidDnDOperationException ex) {
logger.error(ex);
dtde.rejectDrop();
+ cp.rollback("Reverse engineer unsuccessful");
} catch (SQLObjectException ex) {
logger.error(ex);
dtde.rejectDrop();
+ cp.rollback("Reverse engineer unsuccessful");
+ } catch (Throwable ex) {
+ cp.rollback("Reverse engineer unsuccessful");
+ throw new RuntimeException(ex);
}
}
@@ -2385,9 +2402,16 @@
}
public void mouseReleased(MouseEvent evt) {
- draggingTablePanes = false;
+ if (draggingTablePanes) {
+ draggingTablePanes = false;
+ Point p = evt.getPoint();
+ unzoomPoint(p);
+ PlayPenComponent c = contentPane.getComponentAt(p);
+ if (c != null && c.isMoving()) {
+ c.doneDragging();
+ }
+ }
selectionInProgress = false;
- contentPane.doneDragging();
if (rubberBand != null && evt.getButton() ==
MouseEvent.BUTTON1) {
Rectangle dirtyRegion = rubberBand;
=======================================
---
/trunk/src/main/java/ca/sqlpower/architect/swingui/PlayPenComponent.java
Mon Mar 22 09:39:58 2010
+++
/trunk/src/main/java/ca/sqlpower/architect/swingui/PlayPenComponent.java
Mon Mar 29 09:06:23 2010
@@ -34,11 +34,14 @@
import java.util.LinkedList;
import java.util.List;
+import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import org.apache.log4j.Logger;
import ca.sqlpower.architect.ArchitectUtils;
+import ca.sqlpower.architect.enterprise.NetworkConflictResolver;
+import
ca.sqlpower.architect.enterprise.NetworkConflictResolver.UpdateListener;
import ca.sqlpower.architect.swingui.event.SelectionEvent;
import ca.sqlpower.architect.swingui.event.SelectionListener;
import ca.sqlpower.object.AbstractSPObject;
@@ -77,6 +80,19 @@
protected boolean componentPreviouslySelected;
+ /**
+ * This listens for updates in case the user is dragging a table
+ * the same time an update comes in.
+ */
+ private final UpdateListener updateWhileMovingListener = new
UpdateListener() {
+ public boolean updatePerformed(NetworkConflictResolver resolver) {
+ if (isMoving) {
+ doneDragging(false);
+ }
+ return true;
+ }
+ };
+
protected PlayPenComponent(String name) {
setName(name);
}
@@ -124,7 +140,7 @@
@Transient @Accessor
public PlayPen getPlayPen() {
if (getParent() == null) return null;
- return ((PlayPenContentPane) getParent()).getPlayPen();
+ return getParent().getPlayPen();
}
@Transient @Accessor
@@ -225,13 +241,6 @@
logger.debug("Updating bounds on "+getName() //$NON-NLS-1$
+" to ["+r.x+","+r.y+","+r.width+","+r.height+"]");
//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
}
-
- if (this instanceof TablePane
&& !getParent().isWaitingToPersistLocation()) {
- PlayPen pp = getParent().getPlayPen();
- if (pp != null && pp.isDraggingTablePanes()) {
- getParent().startedDragging();
- }
- }
bounds.setBounds(r.x,r.y,r.width,r.height);
firePropertyChange("bounds", oldBounds, new Rectangle(bounds));
@@ -515,6 +524,11 @@
private final List<SelectionListener> selectionListeners = new
LinkedList<SelectionListener>();
+ /**
+ * Keeps track of whether this component is being dragged or not.
+ */
+ private boolean isMoving = false;
+
public final void addSelectionListener(SelectionListener l) {
logger.info("" + this + " is adding " + l);
selectionListeners.add(l);
@@ -569,6 +583,50 @@
repaint();
}
}
+
+ @NonBound
+ public boolean isMoving() {
+ return isMoving;
+ }
+
+ /**
+ * Initiate a drag, which begins a transaction for this object
+ * and sets up an update listener to listen for conflicts while
dragging
+ */
+ public void startedDragging() {
+ if (!isMoving) {
+ isMoving = true;
+ if (getPlayPen().getSession().isEnterpriseSession()) {
+
getPlayPen().getSession().getEnterpriseSession().getUpdater().addListener(updateWhileMovingListener);
+ }
+ begin("Dragging " + this);
+ } else {
+ throw new IllegalStateException("Component is already in the
middle of a drag");
+ }
+ }
+
+ public void doneDragging() {
+ doneDragging(true);
+ }
+
+ /**
+ * Completes the drag on this component by ending the transaction.
+ * @param ok If false, this component will rollback instead of commit.
+ * Used by the update conflict listener to rollback the drag.
+ */
+ public void doneDragging(boolean ok) {
+ if (isMoving) {
+ isMoving = false;
+ if (ok) {
+ commit();
+ } else {
+ rollback("Update received while dragging");
+ JOptionPane.showMessageDialog(getPlayPen(), "There was an
update while you were dragging");
+ }
+ } else {
+ throw new IllegalStateException("Component is not in the
middle of a drag");
+ }
+ }
public boolean allowsChildren() {
return (allowedChildTypes.size() > 0);
=======================================
---
/trunk/src/main/java/ca/sqlpower/architect/swingui/PlayPenContentPane.java
Wed Mar 17 14:29:59 2010
+++
/trunk/src/main/java/ca/sqlpower/architect/swingui/PlayPenContentPane.java
Mon Mar 29 09:06:23 2010
@@ -50,7 +50,6 @@
public class PlayPenContentPane extends AbstractSPObject {
private static final Logger logger =
Logger.getLogger(PlayPenContentPane.class);
-
public static final List<Class<? extends SPObject>> allowedChildTypes =
Collections.unmodifiableList(new ArrayList<Class<? extends
SPObject>>(
Arrays.asList(TablePane.class, Relationship.class,
UsageComponent.class,
@@ -66,14 +65,6 @@
* to the filtered listener that is created in
addComponentPropertyListener
*/
private HashMap<SPListener, SPListener> componentListeners = new
HashMap<SPListener, SPListener>();
-
- /**
- * This boolean becomes true when a table pane has begun moving,
- * and will remain true until doneDragging() is called by the
- * PlayPen's mouseReleased() method. This allows for location
- * changes to be wrapped in a transaction.
- */
- private boolean waitingToPersistLocation = false;
@Constructor
public PlayPenContentPane() {
@@ -365,27 +356,6 @@
public void removeComponentPropertyListener(SPListener listener) {
componentListeners.remove(listener);
}
-
- @NonBound
- public boolean isWaitingToPersistLocation() {
- return waitingToPersistLocation;
- }
-
- public void startedDragging() {
- waitingToPersistLocation = true;
- begin("Started moving table pane");
- }
-
- /**
- * Called by PlayPen on its mouseReleased event to notify a component
that
- * it may complete its location-change transaction if it has been
waiting to.
- */
- public void doneDragging() {
- if (waitingToPersistLocation) {
- waitingToPersistLocation = false;
- commit();
- }
- }
@NonBound
public HashMap<SPListener, SPListener> getComponentListeners() {
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/swingui/Relationship.java
Mon Mar 22 09:39:58 2010
+++ /trunk/src/main/java/ca/sqlpower/architect/swingui/Relationship.java
Mon Mar 29 09:06:23 2010
@@ -464,7 +464,8 @@
this.movingPk = movePk;
this.startingPk = new Point(r.getPkConnectionPoint().x,
r.getPkConnectionPoint().y);
this.startingFk = new Point(r.getFkConnectionPoint().x,
r.getFkConnectionPoint().y);
- r.getModel().begin("Reposition relationship");
+ r.getPlayPen().startCompoundEdit("Dragging
relationship");
+ r.startedDragging();
r.getPlayPen().addMouseMotionListener(this);
r.getPlayPen().addMouseListener(this);
r.getPlayPen().setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
@@ -521,20 +522,13 @@
* instance's creator saved a reference).
*/
public void mouseReleased(MouseEvent e) {
- if (!r.getPkConnectionPoint().equals(startingPk)) {
- r.firePropertyChange("pkConnectionPoint", startingPk,
r.getPkConnectionPoint());
- }
- if (!r.getFkConnectionPoint().equals(startingFk)) {
- r.firePropertyChange("fkConnectionPoint", startingFk,
r.getFkConnectionPoint());
- }
- cleanup();
- }
-
- protected void cleanup() {
+ if (r.isMoving()) {
+ r.doneDragging();
+ }
+ r.getPlayPen().endCompoundEdit("Done dragging
relationship");
r.getPlayPen().removeMouseMotionListener(this);
r.getPlayPen().removeMouseListener(this);
r.getPlayPen().setCursor(null);
- r.getModel().commit();
}
}
@@ -697,7 +691,7 @@
} else if (evt.getID() == MouseEvent.MOUSE_MOVED || evt.getID() ==
MouseEvent.MOUSE_DRAGGED) {
// relationship is non-rectangular so we can't use getBounds
for intersection testing
setSelected(intersects(pp.rubberBand),SelectionEvent.SINGLE_SELECT);
- }
+ }
}
@Transient @Mutator
=======================================
---
/trunk/src/main/java/ca/sqlpower/architect/swingui/action/DeleteSelectedAction.java
Thu Mar 4 08:08:10 2010
+++
/trunk/src/main/java/ca/sqlpower/architect/swingui/action/DeleteSelectedAction.java
Mon Mar 29 09:06:23 2010
@@ -116,6 +116,7 @@
}
}
+ playpen.getPlayPenContentPane().begin("Delete");
try {
playpen.startCompoundEdit("Delete"); //$NON-NLS-1$
@@ -150,15 +151,20 @@
Messages.getString("DeleteSelectedAction.couldNotDeleteColumnDialogTitle"),
//$NON-NLS-1$
JOptionPane.YES_NO_OPTION);
if (decision == JOptionPane.NO_OPTION) {
+ playpen.getPlayPenContentPane().commit();
return;
}
} catch (IllegalArgumentException e) {
+ playpen.getPlayPenContentPane().rollback(e.toString());
throw new RuntimeException(e);
} catch (ObjectDependentException e) {
+ playpen.getPlayPenContentPane().rollback(e.toString());
throw new RuntimeException(e);
- }
- }
-
+ } catch (Throwable e) {
+ playpen.getPlayPenContentPane().rollback(e.toString());
+ }
+ }
+ playpen.getPlayPenContentPane().commit();
} finally {
playpen.endCompoundEdit("Ending multi-select"); //$NON-NLS-1$
playpen.setIgnoreTreeSelection(false);
=======================================
---
/trunk/src/main/java/ca/sqlpower/architect/swingui/enterprise/RevisionListPanel.java
Mon Mar 22 09:39:58 2010
+++
/trunk/src/main/java/ca/sqlpower/architect/swingui/enterprise/RevisionListPanel.java
Mon Mar 29 09:06:23 2010
@@ -248,8 +248,7 @@
DefaultFormBuilder builder = new DefaultFormBuilder(new FormLayout(
"default:grow, 5dlu, pref",
- "pref, 2dlu, default:grow"));
-
+ "pref, 2dlu, default:grow"));
int currentRevision = session.getUpdater().getRevision();
long from = currentRevision - 100;
=======================================
---
/trunk/src/main/java/ca/sqlpower/architect/swingui/enterprise/RevisionsTable.java
Wed Mar 24 07:30:37 2010
+++
/trunk/src/main/java/ca/sqlpower/architect/swingui/enterprise/RevisionsTable.java
Mon Mar 29 09:06:23 2010
@@ -46,7 +46,7 @@
import javax.swing.table.DefaultTableModel;
import ca.sqlpower.enterprise.TransactionInformation;
-import ca.sqlpower.enterprise.client.ClientSideSession;
+import ca.sqlpower.enterprise.client.RevisionController;
import ca.sqlpower.swingui.SPSUtils;
/**
@@ -56,7 +56,7 @@
private static final String[] HEADERS = {"Version", "Time
Created", "Author", "Description"};
- private ClientSideSession session;
+ private RevisionController session;
private List<TransactionInformation> transactions = new
ArrayList<TransactionInformation>();
@@ -123,7 +123,7 @@
}
}
- public RevisionsTable(ClientSideSession session, long fromRevision,
long toRevision) {
+ public RevisionsTable(RevisionController session, long fromRevision,
long toRevision) {
super();
this.session = session;
To unsubscribe from this group, send email to
architect-commits+unsubscribegooglegroups.com or reply to this email with the words
"REMOVE ME" as the subject.