Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » Graphiti » How to implement the undo&redo functions?
How to implement the undo&redo functions? [message #1014598] Tue, 26 February 2013 06:04 Go to next message
sakop qq is currently offline sakop qqFriend
Messages: 29
Registered: January 2013
Junior Member
Hi,I am a newbie to Graphiti.

Last week,I finished the tutorial part by follwing the contents attached to the eclipse "help" menu.

However, there are still a big problem that is still haunting me,as the tutorial says nothing about this topic

How to implement "undo" and "redo" functions?

I tried to wrap several modifications into one RecordingCommand and invoked
command.execute(),the shape was drawn on the panel without any exception.
However,when I pressed "Ctrl+Z", an exception was thrown:
java.lang.IllegalStateException: Cannot modify resource set without a write transaction
at org.eclipse.emf.transaction.impl.TransactionChangeRecorder.assertWriting(TransactionChangeRecorder.java:348)


Below is the code of assertWriting,the first time tx is a valid object,however,it becomes null the second time this code is executed.

protected void assertWriting() {
		InternalTransaction tx = domain.getActiveTransaction();
		
		if ((tx == null) || tx.isReadOnly() || (tx.getOwner() != Thread.currentThread())) {
			synchronized (domain) {
				tx = domain.getActiveTransaction();

				// the transaction could be null now if it completed before we
				//    synchronized on the domain
				if (tx != null) {
					tx.abort(new Status(
						IStatus.ERROR,
						EMFTransactionPlugin.getPluginId(),
						EMFTransactionStatusCodes.CONCURRENT_WRITE,
						Messages.concurrentWrite,
						null));
				}
			}
			
			IllegalStateException ise = new IllegalStateException(
				Messages.noWriteTx);
			
			Tracing.throwing(TransactionChangeRecorder.class, "assertWriting", ise); //$NON-NLS-1$
			
			throw ise;
		}
	}




Can sb tell me how to do it(any simple examples will be fully appreciated!) or give a link to a more detailed tutorial.

Thanks!

[Updated on: Tue, 26 February 2013 07:41]

Report message to a moderator

Re: How to implement the undo&redo functions? [message #1014651 is a reply to message #1014598] Tue, 26 February 2013 08:12 Go to previous messageGo to next message
Michael Wenz is currently offline Michael WenzFriend
Messages: 1931
Registered: July 2009
Location: Walldorf, Germany
Senior Member
Sakopp,

undo/redo is implemented generically within the framework (for EMF domain
objects), so you don't need to implement anything unless you have non-EMF
domain objects. But that is not the case in the tutorial.

Seperating domain objects from graphical objects be be done best while
creating the domain objects: simply add them to another EMF resource. In
case non exists you can also create a new resource in your create feature.
There's a short snippet in an older forum entry:
http://www.eclipse.org/forums/index.php?t=msg&th=172247&start=0&S=acb08c1bf425f0ccb0106fb3a46a4bad

Michael
Re: How to implement the undo&redo functions? [message #1014664 is a reply to message #1014651] Tue, 26 February 2013 08:36 Go to previous messageGo to next message
sakop qq is currently offline sakop qqFriend
Messages: 29
Registered: January 2013
Junior Member
Thank you. So TransactionEditingDomain is only required when dealing with non-EMF object,isn't it?

Re: How to implement the undo&redo functions? [message #1015592 is a reply to message #1014664] Fri, 01 March 2013 10:15 Go to previous message
Michael Wenz is currently offline Michael WenzFriend
Messages: 1931
Registered: July 2009
Location: Walldorf, Germany
Senior Member
Sakop,

the TransactionalEditingDoamin is used in Graphiti for all operations inside
the editor that deal with EMF objects. So, if you modify any EMF data (be it
graphical or part of your EMF domain objects) you will need to do this via a
TransactionalEditingDomain (more precisly the one used in the open editor).

In case you deal with non-EMF domain objects you cannot use a
TransactionalEditingDomain for modifications on your domain objects, because
the domain can only handle EMF objects. But still you would have to use the
domain for modifying your Graphiti diagram objects.

HTH,
Michael
Previous Topic:Graphiti fails to handle resize after custom feature addition
Next Topic:Separating domain and pictogram model
Goto Forum:
  


Current Time: Tue Apr 16 22:13:48 GMT 2024

Powered by FUDForum. Page generated in 4.62607 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top