/******************************************************************************* | |
* Copyright (c) 2010 BSI Business Systems Integration AG. | |
* All rights reserved. This program and the accompanying materials | |
* are made available under the terms of the Eclipse Public License v1.0 | |
* which accompanies this distribution, and is available at | |
* http://www.eclipse.org/legal/epl-v10.html | |
* | |
* Contributors: | |
* BSI Business Systems Integration AG - initial API and implementation | |
******************************************************************************/ | |
package org.eclipse.scout.sdk.ui.fields; | |
import java.beans.PropertyChangeEvent; | |
import java.beans.PropertyChangeListener; | |
import org.eclipse.core.resources.IFolder; | |
import org.eclipse.core.resources.ResourcesPlugin; | |
import org.eclipse.core.runtime.Path; | |
import org.eclipse.jface.dialogs.Dialog; | |
import org.eclipse.scout.commons.CompareUtility; | |
import org.eclipse.scout.commons.EventListenerList; | |
import org.eclipse.scout.commons.OptimisticLock; | |
import org.eclipse.scout.sdk.ui.dialog.CheckableTreeSelectionDialog; | |
import org.eclipse.scout.sdk.ui.fields.bundletree.ITreeNode; | |
import org.eclipse.scout.sdk.ui.fields.bundletree.NodeFilters; | |
import org.eclipse.scout.sdk.ui.fields.bundletree.TreeUtility; | |
import org.eclipse.scout.sdk.ui.internal.ScoutSdkUi; | |
import org.eclipse.scout.sdk.util.SdkProperties; | |
import org.eclipse.scout.sdk.workspace.IScoutProject; | |
import org.eclipse.swt.SWT; | |
import org.eclipse.swt.custom.StyledText; | |
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.FormAttachment; | |
import org.eclipse.swt.layout.FormData; | |
import org.eclipse.swt.layout.FormLayout; | |
import org.eclipse.swt.widgets.Button; | |
import org.eclipse.swt.widgets.Composite; | |
import org.eclipse.swt.widgets.Control; | |
import org.eclipse.swt.widgets.Label; | |
/** | |
* <h3>ProposalTextField</h3> ... | |
*/ | |
public class ResourceServletFolderSelectionField extends TextField { | |
private Button m_popupButton; | |
private IFolder m_folder; | |
private EventListenerList m_eventListeners; | |
private OptimisticLock m_inputLock = new OptimisticLock(); | |
private ITreeNode m_rootNode; | |
public ResourceServletFolderSelectionField(Composite parent, IScoutProject scoutProject) { | |
super(parent); | |
m_eventListeners = new EventListenerList(); | |
m_rootNode = new ResourceServletFolderTree(scoutProject).getRootNode(); | |
} | |
@Override | |
public void setEnabled(boolean enabled) { | |
super.setEnabled(enabled); | |
m_popupButton.setEnabled(enabled); | |
} | |
@Override | |
protected void createContent(Composite parent) { | |
super.createContent(parent); | |
Label label = getLabelComponent(); | |
StyledText text = getTextComponent(); | |
m_popupButton = new Button(parent, SWT.PUSH | SWT.FLAT); | |
m_popupButton.setImage(ScoutSdkUi.getImage(ScoutSdkUi.ToolDropdown)); | |
m_popupButton.addSelectionListener(new SelectionAdapter() { | |
@Override | |
public void widgetSelected(SelectionEvent e) { | |
showFolderChooser(); | |
} | |
}); | |
text.addModifyListener(new ModifyListener() { | |
@Override | |
public void modifyText(ModifyEvent e) { | |
try { | |
if (m_inputLock.acquire()) { | |
String input = getText(); | |
Path p = new Path(input); | |
if (p.segmentCount() > 1) { | |
IFolder folder = ResourcesPlugin.getWorkspace().getRoot().getFolder(p); | |
if (folder.exists()) { | |
if (TreeUtility.findNode(getRootNode(), NodeFilters.getByData(folder)) != null) { | |
setFolderInternal(folder); | |
return; | |
} | |
} | |
} | |
setFolderInternal(null); | |
} | |
} | |
finally { | |
m_inputLock.release(); | |
} | |
} | |
}); | |
parent.setTabList(new Control[]{text}); | |
// layout | |
parent.setLayout(new FormLayout()); | |
FormData labelData = new FormData(); | |
labelData.top = new FormAttachment(0, 0); | |
labelData.left = new FormAttachment(0, 0); | |
labelData.right = new FormAttachment(40, 0); | |
labelData.bottom = new FormAttachment(100, 0); | |
label.setLayoutData(labelData); | |
FormData textData = new FormData(); | |
textData.top = new FormAttachment(0, 0); | |
textData.left = new FormAttachment(label, 5); | |
textData.right = new FormAttachment(m_popupButton, -2); | |
textData.bottom = new FormAttachment(100, 0); | |
text.setLayoutData(textData); | |
FormData buttonData = new FormData(SdkProperties.TOOL_BUTTON_SIZE, SdkProperties.TOOL_BUTTON_SIZE); | |
buttonData.top = new FormAttachment(0, 0); | |
buttonData.right = new FormAttachment(100, 0); | |
buttonData.bottom = new FormAttachment(100, 0); | |
m_popupButton.setLayoutData(buttonData); | |
} | |
private void showFolderChooser() { | |
CheckableTreeSelectionDialog dialog = new CheckableTreeSelectionDialog(getShell(), m_rootNode); | |
dialog.addPropertyChangeListener(new PropertyChangeListener() { | |
@Override | |
public void propertyChange(PropertyChangeEvent evt) { | |
if (CheckableTreeSelectionDialog.PROP_SELECTED_NODE.equals(evt.getPropertyName())) { | |
boolean complete = false; | |
if (evt.getNewValue() instanceof ITreeNode) { | |
ITreeNode selNode = (ITreeNode) evt.getNewValue(); | |
complete = selNode.getType() == ResourceServletFolderTree.NODE_TYPE_FOLDER; | |
} | |
((CheckableTreeSelectionDialog) evt.getSource()).setComplete(complete); | |
} | |
} | |
}); | |
if (dialog.open() == Dialog.OK) { | |
ITreeNode selectedNode = dialog.getSelectedNode(); | |
String text = ""; | |
IFolder selectedFolder = null; | |
if (selectedNode.getType() == ResourceServletFolderTree.NODE_TYPE_FOLDER) { | |
selectedFolder = (IFolder) selectedNode.getData(); | |
text = selectedFolder.getProject().getName() + "/" + selectedFolder.getProjectRelativePath(); | |
} | |
setFolderInternal(selectedFolder); | |
try { | |
m_inputLock.acquire(); | |
getTextComponent().setText(text); | |
} | |
finally { | |
m_inputLock.release(); | |
} | |
} | |
} | |
/** | |
* @return the rootNode | |
*/ | |
public ITreeNode getRootNode() { | |
return m_rootNode; | |
} | |
public void addProductSelectionListener(IFolderSelectedListener listener) { | |
m_eventListeners.add(IFolderSelectedListener.class, listener); | |
} | |
public void removeProductSelectionListener(IFolderSelectedListener listener) { | |
m_eventListeners.remove(IFolderSelectedListener.class, listener); | |
} | |
private void fireProductSelected(IFolder folder) { | |
for (IFolderSelectedListener l : m_eventListeners.getListeners(IFolderSelectedListener.class)) { | |
l.handleFolderSelection(folder); | |
} | |
} | |
public void setFolder(IFolder folder) { | |
m_folder = folder; | |
if (!isDisposed()) { | |
try { | |
if (m_inputLock.acquire()) { | |
String text = ""; | |
if (folder != null) { | |
text = folder.getProject().getName() + "/" + folder.getProjectRelativePath(); | |
} | |
getTextComponent().setText(text); | |
} | |
} | |
finally { | |
m_inputLock.release(); | |
} | |
} | |
} | |
private void setFolderInternal(IFolder folder) { | |
if (!CompareUtility.equals(m_folder, folder)) { | |
setFolder(folder); | |
fireProductSelected(folder); | |
} | |
} | |
/** | |
* @return the folder | |
*/ | |
public IFolder getFolder() { | |
return m_folder; | |
} | |
} |