/*!
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved.
*/
package org.pentaho.pms.ui.concept.editor;
import java.util.Iterator;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.pentaho.pms.schema.concept.ConceptPropertyInterface;
public class PropertyNavigationWidget extends Composite implements ISelectionProvider {
// ~ Static fields/initializers ======================================================================================
private static final Log logger = LogFactory.getLog(PropertyNavigationWidget.class);
// ~ Instance fields =================================================================================================
private PropertyTreeWidget propertyTree;
private ToolItem delButton;
private IConceptModel conceptModel;
private EventSupport eventSupport = new EventSupport();
// ~ Constructors ====================================================================================================
public PropertyNavigationWidget(final Composite parent, final int style) {
super(parent, style);
createContents();
}
public void setConceptModel(IConceptModel conceptModel) {
propertyTree.setConceptModel(conceptModel);
this.conceptModel = conceptModel;
}
// ~ Methods =========================================================================================================
protected void createContents() {
addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
PropertyNavigationWidget.this.widgetDisposed(e);
}
});
setLayout(new GridLayout(2, false));
Label lab1 = new Label(this, SWT.NONE);
lab1.setText("Available");
ToolBar tb3 = new ToolBar(this, SWT.FLAT);
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalAlignment = SWT.END;
tb3.setLayoutData(gridData);
ToolItem ti4 = new ToolItem(tb3, SWT.PUSH);
ti4.setImage(Constants.getImageRegistry(Display.getCurrent()).get("add-button"));
ti4.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(final SelectionEvent e) {
PropertyNavigationWidget.this.addButtonPressed(e);
}
public void widgetSelected(final SelectionEvent e) {
PropertyNavigationWidget.this.addButtonPressed(e);
}
});
delButton = new ToolItem(tb3, SWT.PUSH);
delButton.setImage(Constants.getImageRegistry(Display.getCurrent()).get("del-button"));
delButton.setEnabled(false);
delButton.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(final SelectionEvent e) {
PropertyNavigationWidget.this.deleteButtonPressed(e);
}
public void widgetSelected(final SelectionEvent e) {
PropertyNavigationWidget.this.deleteButtonPressed(e);
}
});
propertyTree = new PropertyTreeWidget(this, PropertyTreeWidget.SHOW_USED, true);
propertyTree.setConceptModel(conceptModel);
gridData = new GridData(GridData.FILL_BOTH);
gridData.horizontalSpan = 2;
propertyTree.getTree().setLayoutData(gridData);
propertyTree.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(final SelectionChangedEvent e) {
IStructuredSelection structuredSelection = (StructuredSelection) propertyTree.getSelection();
Object objectSelected = structuredSelection.getFirstElement();
if (objectSelected instanceof PropertyTreeWidget.PropertyNode) {
fireSelectionChangedEvent(e);
// we're dealing with a property
ConceptPropertyInterface prop = conceptModel.getProperty(((PropertyTreeWidget.PropertyNode) objectSelected).getId(), IConceptModel.REL_THIS);
if (null != prop) {
// it's a child property; allow it to be deleted
if (prop.isRequired()) {
delButton.setEnabled(false);
} else {
delButton.setEnabled(true);
}
} else {
// it's a parent/inherited/security property; it cannot be deleted
// on this concept
delButton.setEnabled(false);
}
} else {
delButton.setEnabled(false);
}
}
});
}
protected void deleteButtonPressed(final SelectionEvent e) {
String propertyId = null;
Object selectedObject = ((StructuredSelection)propertyTree.getSelection()).getFirstElement();
if (selectedObject instanceof PropertyTreeWidget.PropertyNode) {
propertyId = ((PropertyTreeWidget.PropertyNode)selectedObject).getId();
} else if (selectedObject instanceof PropertyTreeWidget.GroupNode) {
propertyId = ((PropertyTreeWidget.GroupNode)selectedObject).getGroupName();
}
else {
if (logger.isWarnEnabled()) {
logger.warn("unknown node selected in property tree");
}
return;
}
boolean delete = MessageDialog.openConfirm(getShell(), "Confirm", "Are you sure you want to remove the property '"
+ PredefinedVsCustomPropertyHelper.getDescription(propertyId) + "'?");
if (delete) {
conceptModel.removeProperty(propertyId);
}
}
protected void widgetDisposed(final DisposeEvent e) {
}
protected void addButtonPressed(final SelectionEvent e) {
new AddPropertyDialog(getShell(), conceptModel).open();
}
public void addSelectionChangedListener(final ISelectionChangedListener listener) {
eventSupport.addListener(listener);
}
public ISelection getSelection() {
return propertyTree.getSelection();
}
public void removeSelectionChangedListener(final ISelectionChangedListener listener) {
eventSupport.removeListener(listener);
}
protected void fireSelectionChangedEvent(final SelectionChangedEvent e) {
Set listeners = eventSupport.getListeners();
for (Iterator iter = listeners.iterator(); iter.hasNext();) {
ISelectionChangedListener listener = (ISelectionChangedListener) iter.next();
listener.selectionChanged(e);
}
}
public void setSelection(ISelection selection) {
// not currently supported
throw new UnsupportedOperationException();
}
}