/*******************************************************************************
* Copyright (c) 2013 RelationWare, Benno Luthiger
* 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:
* RelationWare, Benno Luthiger
******************************************************************************/
package org.ripla.rap.demo.widgets.views;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Tree;
import org.ripla.interfaces.IMessages;
import org.ripla.rap.demo.widgets.Activator;
import org.ripla.rap.demo.widgets.data.CountryBean;
import org.ripla.rap.demo.widgets.data.CountryTree.TreeObject;
import org.ripla.rap.util.AbstractRiplaView;
import org.ripla.rap.util.GridLayoutHelper;
import org.ripla.rap.util.LabelHelper;
import org.ripla.rap.util.Popup;
import org.ripla.rap.util.Popup.PopupButtons;
/**
* The view to display the RAP tree widgets.
*
* @author Luthiger
*/
@SuppressWarnings("serial")
public class TreeWidgetsView extends AbstractRiplaView {
private static final IMessages MESSAGES = Activator.getMessages();
/**
* TreeWidgetsView constructor.
*
* @param inParent
* {@link Composite}
* @param inTree
* {@link TreeObject}
*/
public TreeWidgetsView(final Composite inParent, final TreeObject inTree) {
super(inParent);
createTitle(MESSAGES.getMessage("widgets.title.page.tree"));
LabelHelper.createLabel(this,
MESSAGES.getMessage("widgets.view.tree.title"), "ripla-font");
final TreeViewer lViewer = new TreeViewer(this, SWT.V_SCROLL
| SWT.H_SCROLL);
final Tree lTree = lViewer.getTree();
lTree.setLayout(GridLayoutHelper.createGridLayout());
lTree.setData(RWT.CUSTOM_VARIANT, "ripla-font");
final GridData lLayoutData = GridLayoutHelper.createFillLayoutData();
lLayoutData.heightHint = 430;
lTree.setLayoutData(lLayoutData);
lViewer.setContentProvider(new CountryTreeContentProvider());
lViewer.setLabelProvider(new CellLabelProvider() {
@Override
public void update(final ViewerCell inCell) {
final TreeObject lCountry = (TreeObject) inCell.getElement();
inCell.setText(lCountry.getLabel());
}
});
lViewer.expandAll();
lViewer.setInput(inTree);
lViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(final SelectionChangedEvent inEvent) {
final TreeObject lTreeObject = (TreeObject) ((IStructuredSelection) inEvent
.getSelection()).getFirstElement();
if (lTreeObject.hasChildren()) {
if (lViewer.getExpandedState(lTreeObject)) {
lViewer.collapseToLevel(lTreeObject,
AbstractTreeViewer.ALL_LEVELS);
} else {
lViewer.expandToLevel(lTreeObject, 1);
}
} else {
popup(lTreeObject.getCountry());
}
}
});
lTree.forceFocus();
lTree.select(lTree.getItem(0));
}
private void popup(final CountryBean inCountry) {
final Popup lPopup = new Popup(getShell(),
MESSAGES.getMessage("widgets.table.popup.title"),
inCountry.toHtml(), Popup.DFT_WIDTH, 500);
lPopup.setButtons(PopupButtons.CANCEL);
lPopup.open();
}
// ---
private static class CountryTreeContentProvider implements
ITreeContentProvider {
@Override
public Object[] getElements(final Object inParent) {
return getChildren(inParent);
}
@Override
public Object[] getChildren(final Object inParent) {
if (inParent instanceof TreeObject) {
return ((TreeObject) inParent).getChidren();
}
return new Object[0];
}
@Override
public Object getParent(final Object inChild) {
if (inChild instanceof TreeObject) {
return ((TreeObject) inChild).getParent();
}
return null;
}
@Override
public boolean hasChildren(final Object inParent) {
if (inParent instanceof TreeObject) {
return ((TreeObject) inParent).hasChildren();
}
return false;
}
@Override
public void inputChanged(final Viewer inViewer,
final Object inOldInput, final Object inNewInput) {
// nothing to do
}
@Override
public void dispose() {
// nothing to do
}
}
}