blob: 316b0126af58ec9478489f81265e6d00eb9b83c4 [file] [log] [blame]
/*******************************************************************************
* 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;
}
}