import javax.jcr.observation.EventListener;\r
import javax.jcr.observation.ObservationManager;\r
\r
+import org.apache.commons.logging.Log;\r
+import org.apache.commons.logging.LogFactory;\r
import org.argeo.ArgeoException;\r
import org.argeo.eclipse.ui.jcr.AsyncUiEventListener;\r
import org.argeo.eclipse.ui.utils.CommandUtils;\r
import org.argeo.slc.client.ui.ClientUiPlugin;\r
import org.argeo.slc.client.ui.SlcUiConstants;\r
import org.argeo.slc.client.ui.commands.AddResultFolder;\r
+import org.argeo.slc.client.ui.commands.RenameResultFolder;\r
+import org.argeo.slc.client.ui.commands.RenameResultNode;\r
import org.argeo.slc.client.ui.editors.ProcessEditor;\r
import org.argeo.slc.client.ui.editors.ProcessEditorInput;\r
import org.argeo.slc.client.ui.model.ParentNodeFolder;\r
import org.argeo.slc.client.ui.model.VirtualFolder;\r
import org.argeo.slc.client.ui.providers.ResultTreeContentProvider;\r
import org.argeo.slc.client.ui.providers.ResultTreeLabelProvider;\r
+import org.argeo.slc.client.ui.wizards.ConfirmOverwriteWizard;\r
import org.argeo.slc.jcr.SlcJcrResultUtils;\r
import org.argeo.slc.jcr.SlcNames;\r
import org.argeo.slc.jcr.SlcTypes;\r
import org.eclipse.jface.viewers.SelectionChangedEvent;\r
import org.eclipse.jface.viewers.TableViewer;\r
import org.eclipse.jface.viewers.TableViewerColumn;\r
+import org.eclipse.jface.viewers.TreePath;\r
import org.eclipse.jface.viewers.TreeViewer;\r
import org.eclipse.jface.viewers.Viewer;\r
import org.eclipse.jface.viewers.ViewerDropAdapter;\r
+import org.eclipse.jface.wizard.WizardDialog;\r
import org.eclipse.swt.SWT;\r
import org.eclipse.swt.custom.SashForm;\r
import org.eclipse.swt.dnd.DND;\r
public class JcrResultTreeView extends ViewPart {\r
public final static String ID = ClientUiPlugin.ID + ".jcrResultTreeView";\r
\r
- // private final static Log log =\r
- // LogFactory.getLog(JcrResultTreeView.class);\r
+ private final static Log log = LogFactory.getLog(JcrResultTreeView.class);\r
\r
/* DEPENDENCY INJECTION */\r
private Session session;\r
SlcTypes.SLC_TEST_RESULT, SlcTypes.SLC_RESULT_FOLDER,\r
NodeType.NT_UNSTRUCTURED };\r
\r
- // FIXME cache to ease refresh after D&D\r
+ // FIXME cache to ease D&D\r
+ private boolean isActionUnderMyResult = false;\r
private ResultParent lastSelectedTargetElement;\r
- private ResultParent lastSelectedTargetElementParent;\r
+ private ResultParent lastSelectedSourceElement;\r
private ResultParent lastSelectedSourceElementParent;\r
+ private boolean isResultFolder = false;\r
+\r
+ // FIXME we cache the fact that we are moving a node to avoid exception\r
+ // triggered by the "Add Node" event while moving\r
+ // boolean isMoveInProgress = false;\r
\r
/**\r
* To be overridden to adapt size of form and result frames.\r
\r
// add change listener to display TestResult information in the property\r
// viewer\r
- viewer.addSelectionChangedListener(new ISelectionChangedListener() {\r
- public void selectionChanged(SelectionChangedEvent event) {\r
- if (!event.getSelection().isEmpty()) {\r
- IStructuredSelection sel = (IStructuredSelection) event\r
- .getSelection();\r
- Object firstItem = sel.getFirstElement();\r
- if (firstItem instanceof SingleResultNode)\r
- propertiesViewer\r
- .setInput(((SingleResultNode) firstItem)\r
- .getNode());\r
- else\r
- propertiesViewer.setInput(null);\r
- lastSelectedTargetElement = (ResultParent) firstItem;\r
- lastSelectedTargetElementParent = (ResultParent) ((ResultParent) firstItem)\r
- .getParent();\r
- }\r
- }\r
- });\r
+ viewer.addSelectionChangedListener(new MySelectionChangedListener());\r
return viewer;\r
}\r
\r
resultsObserver = new ResultObserver(resultTreeViewer\r
.getTree().getDisplay());\r
observationManager.addEventListener(resultsObserver,\r
- Event.NODE_ADDED | Event.NODE_REMOVED, UserJcrUtils\r
+ Event.NODE_MOVED | Event.NODE_ADDED\r
+ | Event.NODE_REMOVED, UserJcrUtils\r
.getUserHome(session).getPath(), true,\r
null, observedNodeTypes, false);\r
} catch (RepositoryException e) {\r
}\r
\r
} else {\r
- // FIXME implement refresh for a specific ResultParent object.\r
- if (resultParent instanceof ResultFolder) {\r
- ResultFolder currFolder = (ResultFolder) resultParent;\r
+ if (resultParent instanceof ParentNodeFolder) {\r
+ ParentNodeFolder currFolder = (ParentNodeFolder) resultParent;\r
jcrRefresh(currFolder.getNode());\r
currFolder.forceFullRefresh();\r
- resultTreeViewer.refresh(lastSelectedTargetElement);\r
}\r
+ // FIXME: specific refresh does not work\r
+ // resultTreeViewer.refresh(currFolder, true);\r
+ TreePath[] tps = resultTreeViewer.getExpandedTreePaths();\r
+ resultTreeViewer.setInput(initializeResultTree());\r
+ resultTreeViewer.setExpandedTreePaths(tps);\r
}\r
}\r
\r
// Building conditions\r
IStructuredSelection selection = (IStructuredSelection) resultTreeViewer\r
.getSelection();\r
- boolean isMyResultFolder = false;\r
+ boolean canAddSubfolder = false;\r
+ boolean isSingleResultNode = false;\r
if (selection.size() == 1) {\r
Object obj = selection.getFirstElement();\r
try {\r
- if (obj instanceof ResultFolder\r
- && (((ResultFolder) obj).getNode())\r
- .isNodeType(SlcTypes.SLC_RESULT_FOLDER))\r
- isMyResultFolder = true;\r
+ // if (obj instanceof ResultFolder\r
+ // && (((ResultFolder) obj).getNode())\r
+ // .isNodeType(SlcTypes.SLC_RESULT_FOLDER))\r
+ if (isResultFolder)\r
+ canAddSubfolder = true;\r
+ else if (obj instanceof SingleResultNode)\r
+ isSingleResultNode = true;\r
else if (obj instanceof ParentNodeFolder\r
&& (((ParentNodeFolder) obj).getNode().getPath()\r
.startsWith(SlcJcrResultUtils\r
.getMyResultsBasePath(session))))\r
- isMyResultFolder = true;\r
+ canAddSubfolder = true;\r
+\r
} catch (RepositoryException re) {\r
throw new SlcException(\r
"unexpected error while building condition for context menu",\r
AddResultFolder.DEFAULT_LABEL,\r
ClientUiPlugin.getDefault().getWorkbench().getSharedImages()\r
.getImageDescriptor(ISharedImages.IMG_OBJ_ADD),\r
- isMyResultFolder);\r
+ canAddSubfolder);\r
+\r
+ CommandUtils.refreshCommand(menuManager, window, RenameResultFolder.ID,\r
+ RenameResultFolder.DEFAULT_LABEL,\r
+ RenameResultFolder.DEFAULT_IMG_DESCRIPTOR, canAddSubfolder);\r
+\r
+ CommandUtils.refreshCommand(menuManager, window, RenameResultNode.ID,\r
+ RenameResultNode.DEFAULT_LABEL,\r
+ RenameResultNode.DEFAULT_IMG_DESCRIPTOR, isSingleResultNode);\r
}\r
\r
/* INNER CLASSES */\r
boolean doIt = false;\r
// only one node at a time for the time being.\r
if (selection.size() == 1) {\r
- Object obj = selection.getFirstElement();\r
- if (obj instanceof SingleResultNode) {\r
- Node tNode = ((SingleResultNode) obj).getNode();\r
- try {\r
- // if (tNode.getPrimaryNodeType().isNodeType(\r
- // SlcTypes.SLC_TEST_RESULT)\r
- // && (tNode.getPath()\r
- // .startsWith(SlcJcrResultUtils\r
- // .getSlcResultsBasePath(session))))\r
+ try {\r
+ Object obj = selection.getFirstElement();\r
+ if (obj instanceof SingleResultNode) {\r
+ Node tNode = ((SingleResultNode) obj).getNode();\r
+ if (tNode.getPrimaryNodeType().isNodeType(\r
+ SlcTypes.SLC_TEST_RESULT)) {\r
+ doIt = true;\r
+ isResultFolder = false;\r
+ }\r
+ } else if (obj instanceof ResultFolder) {\r
+ Node tNode = ((ResultFolder) obj).getNode();\r
if (tNode.getPrimaryNodeType().isNodeType(\r
- SlcTypes.SLC_TEST_RESULT))\r
+ SlcTypes.SLC_RESULT_FOLDER)) {\r
doIt = true;\r
- lastSelectedSourceElementParent = (ResultParent) ((SingleResultNode) obj)\r
- .getParent();\r
- } catch (RepositoryException re) {\r
- throw new SlcException(\r
- "unexpected error while validating drag source",\r
- re);\r
+ isResultFolder = true;\r
+ }\r
}\r
+ } catch (RepositoryException re) {\r
+ throw new SlcException(\r
+ "unexpected error while validating drag source", re);\r
}\r
}\r
event.doit = doIt;\r
IStructuredSelection selection = (IStructuredSelection) resultTreeViewer\r
.getSelection();\r
Object obj = selection.getFirstElement();\r
- if (obj instanceof SingleResultNode) {\r
- Node first = ((SingleResultNode) obj).getNode();\r
- try {\r
+ try {\r
+ Node first;\r
+ if (obj instanceof SingleResultNode) {\r
+ first = ((SingleResultNode) obj).getNode();\r
+ event.data = first.getIdentifier();\r
+ } else if (obj instanceof ResultFolder) {\r
+ first = ((ResultFolder) obj).getNode();\r
event.data = first.getIdentifier();\r
-\r
- } catch (RepositoryException re) {\r
- throw new SlcException(\r
- "unexpected error while setting data", re);\r
}\r
+ } catch (RepositoryException re) {\r
+ throw new SlcException("unexpected error while setting data",\r
+ re);\r
}\r
}\r
\r
public void dragFinished(DragSourceEvent event) {\r
- // implement here tree refresh in case of a move.\r
+ // refresh is done via observer\r
}\r
}\r
\r
// Implementation of the Drop Listener\r
protected class ViewDropListener extends ViewerDropAdapter {\r
-\r
- private Node currParentNode = null;\r
- private boolean copyNode = true;\r
+ private Node targetParentNode = null;\r
\r
public ViewDropListener(Viewer viewer) {\r
super(viewer);\r
@Override\r
public boolean validateDrop(Object target, int operation,\r
TransferData transferType) {\r
+\r
boolean validDrop = false;\r
try {\r
// We can only drop under myResults\r
- Node targetParentNode = null;\r
+ Node tpNode = null;\r
if (target instanceof ResultFolder) {\r
- targetParentNode = ((ResultFolder) target).getNode();\r
+ tpNode = ((ResultFolder) target).getNode();\r
} else if (target instanceof ParentNodeFolder) {\r
if ((((ParentNodeFolder) target).getNode().getPath()\r
.startsWith(SlcJcrResultUtils\r
.getMyResultsBasePath(session))))\r
- targetParentNode = ((ParentNodeFolder) target)\r
- .getNode();\r
+ tpNode = ((ParentNodeFolder) target).getNode();\r
} else if (target instanceof SingleResultNode) {\r
Node currNode = ((SingleResultNode) target).getNode();\r
if (currNode\r
.startsWith(\r
SlcJcrResultUtils\r
.getMyResultsBasePath(session)))\r
- targetParentNode = currNode.getParent();\r
+ tpNode = currNode.getParent();\r
}\r
- if (targetParentNode != null) {\r
- currParentNode = targetParentNode;\r
- validDrop = true;\r
- // FIXME\r
- lastSelectedTargetElement = (ResultParent) target;\r
- lastSelectedTargetElementParent = (ResultParent) ((ResultParent) target)\r
- .getParent();\r
- }\r
- // Check if it's a move or a copy\r
- if (validDrop) {\r
- String pPath = "";\r
- if (lastSelectedSourceElementParent instanceof ResultFolder)\r
- pPath = ((ResultFolder) lastSelectedSourceElementParent)\r
- .getNode().getPath();\r
- if ((pPath.startsWith(SlcJcrResultUtils\r
- .getMyResultsBasePath(session))))\r
- copyNode = false;\r
+\r
+ if (tpNode != null) {\r
+ // Sanity check : we cannot move a folder to one of its sub\r
+ // folder\r
+ boolean doit = true;\r
+ if (isResultFolder) {\r
+ Node source = ((ParentNodeFolder) lastSelectedSourceElement)\r
+ .getNode();\r
+ String sourcePath = source.getPath();\r
+ String targetPath = tpNode.getPath();\r
+ if (targetPath.startsWith(sourcePath))\r
+ doit = false;\r
+ }\r
+ if (doit) {\r
+ targetParentNode = tpNode;\r
+ validDrop = true;\r
+ lastSelectedTargetElement = (ResultParent) target;\r
+ }\r
}\r
+\r
} catch (RepositoryException re) {\r
throw new SlcException(\r
"unexpected error while validating drop target", re);\r
\r
@Override\r
public boolean performDrop(Object data) {\r
-\r
+ // clear selection to prevent unwanted scrolling of the UI\r
+ resultTreeViewer.setSelection(null);\r
try {\r
Node source = session.getNodeByIdentifier((String) data);\r
- if (copyNode) {\r
- Node target = currParentNode.addNode(source.getName(),\r
- source.getPrimaryNodeType().getName());\r
+\r
+ // Check is a node with same name already exists at destination\r
+ String name;\r
+ if (source.hasProperty(Property.JCR_TITLE))\r
+ name = source.getProperty(Property.JCR_TITLE).getString();\r
+ else if (source.hasProperty(SlcNames.SLC_TEST_CASE))\r
+ name = source.getProperty(SlcNames.SLC_TEST_CASE)\r
+ .getString();\r
+ else\r
+ name = source.getName();\r
+\r
+ if (targetParentNode.hasNode(name)) {\r
+ ConfirmOverwriteWizard wizard = new ConfirmOverwriteWizard(\r
+ name, targetParentNode);\r
+ WizardDialog dialog = new WizardDialog(Display.getDefault()\r
+ .getActiveShell(), wizard);\r
+ dialog.open();\r
+\r
+ if (wizard.overwrite()) {\r
+ targetParentNode.getNode(name).remove();\r
+ // session.save();\r
+ } else\r
+ name = wizard.newName();\r
+ }\r
+\r
+ Node target;\r
+ if (!isActionUnderMyResult) {// Copy\r
+ target = targetParentNode.addNode(name, source\r
+ .getPrimaryNodeType().getName());\r
JcrUtils.copy(source, target);\r
- ResultParentUtils.updatePassedStatus(\r
- target,\r
- target.getNode(SlcNames.SLC_STATUS)\r
- .getProperty(SlcNames.SLC_SUCCESS)\r
- .getBoolean());\r
- target.getSession().save();\r
- } else // move only\r
- {\r
+ } else {// move\r
String sourcePath = source.getPath();\r
- String destPath = currParentNode.getPath() + "/"\r
- + source.getName();\r
+ String destPath = targetParentNode.getPath() + "/" + name;\r
session.move(sourcePath, destPath);\r
- session.save();\r
- Node target = session.getNode(destPath);\r
- ResultParentUtils.updatePassedStatus(\r
- target,\r
- target.getNode(SlcNames.SLC_STATUS)\r
- .getProperty(SlcNames.SLC_SUCCESS)\r
- .getBoolean());\r
- session.save();\r
+ // session.save();\r
+ target = session.getNode(destPath);\r
}\r
+ if (!target.isNodeType(NodeType.MIX_TITLE))\r
+ target.addMixin(NodeType.MIX_TITLE);\r
+ target.setProperty(Property.JCR_TITLE, name);\r
+ ResultParentUtils\r
+ .updatePassedStatus(target,\r
+ target.getNode(SlcNames.SLC_STATUS)\r
+ .getProperty(SlcNames.SLC_SUCCESS)\r
+ .getBoolean());\r
+ session.save();\r
} catch (RepositoryException re) {\r
throw new SlcException(\r
"unexpected error while copying dropped node", re);\r
throws RepositoryException {\r
// unfiltered for the time being\r
return true;\r
- // for (Event event : events) {\r
- // getLog().debug("Received event " + event);\r
- // int eventType = event.getType();\r
- // if (eventType == Event.NODE_REMOVED)\r
- // ;//return true;\r
- // String path = event.getPath();\r
- // int index = path.lastIndexOf('/');\r
- // String propertyName = path.substring(index + 1);\r
- // if (propertyName.equals(SlcNames.SLC_COMPLETED)\r
- // || propertyName.equals(SlcNames.SLC_UUID)) {\r
- // ;//return true;\r
- // }\r
- // }\r
- // return false;\r
}\r
\r
protected void onEventInUiThread(List<Event> events)\r
throws RepositoryException {\r
+ int i = 0;\r
\r
for (Event event : events) {\r
- getLog().debug("Received event " + event);\r
+ i++;\r
+ // log.debug("Received event " + event);\r
int eventType = event.getType();\r
if (eventType == Event.NODE_REMOVED) {\r
String path = event.getPath();\r
- int index = path.lastIndexOf('/');\r
- String parPath = path.substring(0, index + 1);\r
+ String parPath = JcrUtils.parentPath(path);\r
if (session.nodeExists(parPath)) {\r
Node currNode = session.getNode(parPath);\r
if (currNode.isNodeType(NodeType.NT_UNSTRUCTURED)) {\r
- refresh(null);\r
- jcrRefresh(currNode);\r
- resultTreeViewer.refresh(true);\r
- resultTreeViewer.expandToLevel(\r
- lastSelectedTargetElementParent, 1);\r
-\r
+ // jcrRefresh(currNode);\r
+ refresh(lastSelectedSourceElementParent);\r
}\r
}\r
} else if (eventType == Event.NODE_ADDED) {\r
+ // refresh(lastSelectedTargetElement);\r
String path = event.getPath();\r
if (session.nodeExists(path)) {\r
Node currNode = session.getNode(path);\r
- if (currNode.isNodeType(SlcTypes.SLC_DIFF_RESULT)\r
+ if (currNode.isNodeType(SlcTypes.SLC_TEST_RESULT)\r
|| currNode\r
.isNodeType(SlcTypes.SLC_RESULT_FOLDER)) {\r
- refresh(null);\r
- resultTreeViewer.expandToLevel(\r
- lastSelectedTargetElement, 1);\r
+ refresh(lastSelectedTargetElement);\r
+ // resultTreeViewer.expandToLevel(\r
+ // lastSelectedTargetElement, 1);\r
}\r
}\r
}\r
}\r
+ if (log.isDebugEnabled())\r
+ log.debug("treated events: " + i);\r
}\r
}\r
\r
}\r
}\r
\r
+ class MySelectionChangedListener implements ISelectionChangedListener {\r
+\r
+ public void selectionChanged(SelectionChangedEvent event) {\r
+ if (!event.getSelection().isEmpty()) {\r
+ IStructuredSelection sel = (IStructuredSelection) event\r
+ .getSelection();\r
+ ResultParent firstItem = (ResultParent) sel.getFirstElement();\r
+ if (firstItem instanceof SingleResultNode)\r
+ propertiesViewer.setInput(((SingleResultNode) firstItem)\r
+ .getNode());\r
+ else\r
+ propertiesViewer.setInput(null);\r
+ // update cache for Drag & drop\r
+ lastSelectedTargetElement = firstItem;\r
+ lastSelectedSourceElement = firstItem;\r
+ lastSelectedSourceElementParent = (ResultParent) firstItem\r
+ .getParent();\r
+ String pPath = "";\r
+ try {\r
+\r
+ if (firstItem instanceof ParentNodeFolder)\r
+ pPath = ((ParentNodeFolder) firstItem).getNode()\r
+ .getPath();\r
+ else if (firstItem instanceof SingleResultNode)\r
+ pPath = ((SingleResultNode) firstItem).getNode()\r
+ .getPath();\r
+ } catch (RepositoryException e) {\r
+ throw new SlcException(\r
+ "Unexpected error while checking parent UI tree", e);\r
+ }\r
+ if ((pPath.startsWith(SlcJcrResultUtils\r
+ .getMyResultsBasePath(session))))\r
+ isActionUnderMyResult = true;\r
+ else\r
+ isActionUnderMyResult = false;\r
+ }\r
+ }\r
+ }\r
+\r
class ViewDoubleClickListener implements IDoubleClickListener {\r
public void doubleClick(DoubleClickEvent evt) {\r
processDoubleClick(evt);\r
--- /dev/null
+package org.argeo.slc.client.ui.wizards;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.argeo.slc.SlcException;
+import org.argeo.slc.client.ui.ClientUiPlugin;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.ISharedImages;
+
+public class ConfirmOverwriteWizard extends Wizard {
+
+ // Define widget here to simplify getters
+ private Button overwriteBtn, renameBtn;
+ private Text newNameTxt;
+ private Label newNameLbl;
+
+ // business object
+ private String sourceNodeName;
+ private Node targetParentNode;
+
+ private String newName;
+ private boolean overwrite;
+
+ public ConfirmOverwriteWizard(String sourceNodeName, Node targetParentNode) {
+ setWindowTitle("Confirm overwrite or define a new name");
+ this.sourceNodeName = sourceNodeName;
+ this.targetParentNode = targetParentNode;
+ }
+
+ @Override
+ public void addPages() {
+ try {
+ addPage(new MyPage());
+ } catch (Exception e) {
+ throw new SlcException("Cannot add page to wizard ", e);
+ }
+ getShell().setImage(
+ ClientUiPlugin.getDefault().getWorkbench().getSharedImages()
+ .getImageDescriptor(ISharedImages.IMG_LCL_LINKTO_HELP)
+ .createImage());
+ }
+
+ // Expose info to the calling view
+ public boolean overwrite() {
+ return overwrite;
+ }
+
+ public String newName() {
+ return newName;
+ }
+
+ @Override
+ public boolean performFinish() {
+ boolean doFinish = false;
+
+ if (canFinish()) {
+ if (overwriteBtn.getSelection())
+ doFinish = MessageDialog.openConfirm(Display.getDefault()
+ .getActiveShell(), "CAUTION", "All data contained in ["
+ + sourceNodeName
+ + "] are about to be definitively destroyed. \n "
+ + "Are you sure you want to proceed ?");
+ else
+ doFinish = true;
+ // cache values
+ }
+ if (doFinish) {
+ overwrite = overwriteBtn.getSelection();
+ newName = newNameTxt.getText();
+ }
+ return doFinish;
+ }
+
+ class MyPage extends WizardPage implements ModifyListener {
+
+ public MyPage() {
+ super("");
+ setTitle("An object with same name (" + sourceNodeName
+ + ") already exists");
+ }
+
+ public void createControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout(2, false));
+
+ // choose between overwrite and rename
+ overwriteBtn = new Button(composite, SWT.RADIO);
+ overwriteBtn.setText("Overwrite");
+ GridData gd = new GridData();
+ gd.horizontalIndent = 30;
+ gd.horizontalSpan = 2;
+ overwriteBtn.setLayoutData(gd);
+ overwriteBtn.setSelection(true);
+
+ renameBtn = new Button(composite, SWT.RADIO);
+ renameBtn.setText("Rename");
+ renameBtn.setSelection(false);
+ renameBtn.setText("Rename");
+ gd = new GridData();
+ gd.horizontalIndent = 30;
+ gd.horizontalSpan = 2;
+ renameBtn.setLayoutData(gd);
+
+ newNameLbl = new Label(composite, SWT.LEAD);
+ newNameLbl.setText("New name");
+ newNameLbl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false,
+ false));
+ newNameLbl.setEnabled(false);
+
+ newNameTxt = new Text(composite, SWT.LEAD | SWT.BORDER);
+ newNameTxt.setText(sourceNodeName);
+ newNameTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true,
+ false));
+ if (newNameTxt != null)
+ newNameTxt.addModifyListener(this);
+ newNameTxt.setEnabled(false);
+
+ SelectionAdapter sa = new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ updateSelection(overwriteBtn.getSelection());
+ }
+ };
+ overwriteBtn.addSelectionListener(sa);
+ renameBtn.addSelectionListener(sa);
+
+ // Compulsory
+ setControl(composite);
+ }
+
+ private void updateSelection(boolean overwrite) {
+ newNameLbl.setEnabled(!overwrite);
+ newNameTxt.setEnabled(!overwrite);
+ if (overwrite)
+ setPageComplete(true);
+ else
+ checkComplete();
+ }
+
+ protected String getTechName() {
+ return newNameTxt.getText();
+ }
+
+ public void modifyText(ModifyEvent event) {
+ checkComplete();
+ }
+
+ private void checkComplete() {
+ try {
+
+ String newName = newNameTxt.getText();
+ if (newName == null || "".equals(newName.trim())) {
+ setMessage("Name cannot be blank or empty",
+ WizardPage.ERROR);
+ setPageComplete(false);
+ } else if (targetParentNode.hasNode(newName)) {
+ setMessage("An object with the same name already exists.",
+ WizardPage.ERROR);
+ setPageComplete(false);
+ } else {
+ setMessage("Complete", WizardPage.INFORMATION);
+ setPageComplete(true);
+ }
+ } catch (RepositoryException e) {
+ throw new SlcException("Unexpected error while checking "
+ + "children node with same name", e);
+ }
+ }
+ }
+}