After some weeks I resolved to work in my Subversive extension again and tryed to used your example and now is working perfectly. I do not know why, but I must have done something wrong the other times.
Thank you for your help until tha moment, but I'm having
difficulty to execute de LockOperation. I did like you tell me
but lock the Eclipse IDE when execute LockOperation and Eclipse
don't response never more. What I'm doing wrong? My code is
exactly like your. I copy and paste and don't work.
The LockOperation need more settings? Because I think that
the LockOperation don't finish your execution.
All resources that will be committed are passed down
through the function input parameters. So, you don't need
to collect them from the resources tree. Instead you
should extract from the passed resources set only the
files that could be locked. You can do it like this:
LockOperation op = new LockOperation(resources,
"lock message text", false);
UIMonitorUtility.doTaskBusyDefault(op);
result = op.getStatus().getSeverity() == IStatus.OK
? Window.OK : Window.CANCEL;
}
Best regards,
Alexander.
08.08.2011 16:48, rodrigo luiz duarte пишет:
Hello Alexander,
I did like you tell me, but de LockOperation
don't work e block the eclipse IDE. I think that
the LockOperation don't executed and Eclipse stay
busy infinity. I tryed change method
UIMonitorUtility.doTaskBusyDefault(op) to
UIMonitorUtility.doTaskScheduledDefault(op) and
the LockOperation don't work. It stay in zero
percent of execution infinity. My code is:
if
(result == Window.OK) {
LockAction lockAction = new LockAction();
IResource[] resources =
lockAction.getSelectedResources();
LockOperation op = new
LockOperation(resources, "lock message text",
false);
UIMonitorUtility.doTaskBusyDefault(op);
result
= op.getStatus().getSeverity() == IStatus.OK ?
Window.OK : Window.CANCEL;
}
I used LockAction to get the resources. Is it
correct? What the correct way to get de resources
that I want lock (the resources are the same that
I want commit)?
What I'm doing wrong in the LockOperation
execution?
That won't work because lock action performs
real operation asynchronously. In order to
avoid LockDialog and to check operation
execution status you'll need to do something
like this:
int
result = Window.CANCEL;
filesToCommit
= allFilesToCommit;
CustomCommitDialog
dialog = new CustomCommitDialog(shell,
commentPanel);
dialog.setAllFilesToCommit(allFilesToCommit);
result = dialog.open();
if (result == Window.OK) {
LockOperation op = new
LockOperation(resources, "lock message
text", false /*true in order to force
locks*/);
UIMonitorUtility.doTaskBusyDefault(op);
result
= op.getSeverity() == IStatus.OK ?
Window.OK : Window.CANCEL;
}
return
result;
Also please note that there is no need of
try/catch blocks because all the errors are
handled by LockOperation
and UIMonitorUtility classes
themselves. You'll only need to
check operation execution status afterwards.
Best regards,
Alexander.
04.08.2011 23:28, rodrigo luiz duarte пишет:
Hello Alexander,
What I need is invoke Lock
operation immediatly before Commit
operation and if the Lock fail, to
cancel Commit operation. I used this
way:
int result = Window.CANCEL;
filesToCommit
= allFilesToCommit;
CustomCommitDialog
dialog = new
CustomCommitDialog(shell,
commentPanel);
dialog.setAllFilesToCommit(allFilesToCommit);
try
{
result
= dialog.open();
if
(result == Window.OK) {
LockAction
lock = new LockAction();
IAction
action = "">
lock.runImpl(acao);
}
}
catch (Exception e) {
result
= Window.CANCEL;
}
return
result;
I used the pre-lock
subversion's hook to simulate the
Lock fail, but the Commit
operation is not cancelled. Is it
possible do this? How can I do
invoke Lock operation in
background without the Lock
Dialog?
The API related to the commit
dialog were initially created
for the specific project, so
it may be not the best to work
with.
Regarding how to do it now -
it is relatively easy. Anyway
now you're implementing
ICommitDialog interface.
Right? In the method open() of
this interface you're doing
something like this:
public int open()
{
DefaultDialog
dialog = new
DefaultDialog(shell,
commentPanel);
return
dialog.open();
}
So, you may as well change the
code:
public int open()
{
DefaultDialog
dialog = new
DefaultDialog(shell,
commentPanel);
int retVal =
dialog.open();
if (retVal ==
Window.OK) {
// invoke
Lock here
}
return retVal;
}
The flaw of this solution is
that you will run your code in
the UI thread. That is not a
very nice thing, but... oh
well, that is why I said that
API created for a single
project is not the best thing
to use, it misses many
important points. So, if you
have any ideas regarding
future improvements you're
welcome to share your opinion
here: https://bugs.eclipse.org/bugs/show_bug.cgi?id=327399
Best regards,
Alexander Gurov,
Subversive Team.
03.08.2011 1:58, rodrigo luiz
duarte пишет:
Hi!
I need invoke the
Lock command
immediatly before the
Commit operation. How
can i do this using
de Commit UI extension
point?