/* * Copyright (c) 2010-2012 Research In Motion Limited. All rights reserved. * * This program and the accompanying materials are made available * under the terms of the Eclipse Public License, Version 1.0, * which accompanies this distribution and is available at * * http://www.eclipse.org/legal/epl-v10.html * */ package net.rim.ejde.internal.ui.editors.model; import net.rim.ejde.internal.core.ContextManager; import net.rim.ejde.internal.core.IConstants; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreePath; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.forms.SectionPart; import org.eclipse.ui.views.contentoutline.ContentOutlinePage; /** * The outline view page for the editor. Please note, some of this code was created for demo purposes only and does not reflect * the final implementation. Some areas of this code should be changed and coded better once implementation of the outline view * officially begins. Also note that the outline view prototype is currently disabled and to re-enable it, please uncomment the * appropriate code in getAdapter() method. * * @author jkeshavarzi * */ public class BlackBerryProjectOutlinePage extends ContentOutlinePage implements ISelectionChangedListener { BlackBerryProjectFormEditor _editor; public BlackBerryProjectOutlinePage( BlackBerryProjectFormEditor editor ) { this._editor = editor; } @Override public void createControl( Composite parent ) { super.createControl( parent ); TreeViewer contentOutlineViewer = getTreeViewer(); contentOutlineViewer.addSelectionChangedListener( this ); contentOutlineViewer.setContentProvider( new ContentProvider() ); contentOutlineViewer.setLabelProvider( new LabelProvider() ); contentOutlineViewer.setInput( _editor.getPages() ); } @Override public void selectionChanged( SelectionChangedEvent event ) { super.selectionChanged( event ); Object source = event.getSource(); BlackBerryProjectPropertiesPage page = null; Control control = null; if( source instanceof TreeViewer ) { TreeViewer v = (TreeViewer) source; TreeSelection t = (TreeSelection) v.getSelection(); Object obj = t.getFirstElement(); if( obj instanceof BlackBerryProjectPropertiesPage ) { page = (BlackBerryProjectPropertiesPage) obj; } else { page = (BlackBerryProjectPropertiesPage) t.getPaths()[ 0 ].getFirstSegment(); } if( _editor.getActivePage() != page.getIndex() ) { _editor.setActivePage( page.getIndex() ); } if( obj instanceof Control ) { control = (Control) obj; control.setFocus(); if( control instanceof Text ) { Text text = (Text) control; text.selectAll(); } } else if( obj instanceof TableItem ) { // Table table = (Table) t.getPaths()[ 0 ].getParentPath().getLastSegment(); TreePath path = t.getPaths()[ 0 ]; Object parentObject = path.getSegment( path.getSegmentCount() - 2 ); if( parentObject instanceof Table ) { Table table = (Table) parentObject; table.select( BlackBerryProjectPropertiesPage.getItemIndex( table, v.getTree().getSelection()[ 0 ].getText() ) .intValue() ); } } } } public void updateTreeSelection( Control control ) { TreeViewer viewer = getTreeViewer(); Tree tree = viewer.getTree(); TreeItem item = null; if( tree.getSelection() == null ) { return; } if( control instanceof Table ) { Table table = (Table) control; TableItem selections[] = table.getSelection(); if( selections.length > 0 ) { item = getTableItem( tree, selections[ 0 ].getText( 2 ) ); } } else { item = getControlItem( tree, control.getData( BlackBerryProjectPropertiesPage.CONTROL_TITLE_KEY ).toString() ); } if( item != null ) { TreeItem selectedItem[] = tree.getSelection(); if( ( selectedItem.length > 0 ) && selectedItem[ 0 ].equals( item ) ) { return; } tree.deselectAll(); tree.select( item ); } } public void updateTreeSelection( BlackBerryProjectPropertiesPage page ) { TreeViewer viewer = getTreeViewer(); Tree tree = viewer.getTree(); TreeItem item = getPageItem( tree, page.getTitle() ); if( item != null ) { TreeItem selectedItem[] = tree.getSelection(); if( ( selectedItem.length > 0 ) && selectedItem[ 0 ].equals( item ) ) { return; } tree.deselectAll(); tree.select( item ); } } private TreeItem getControlItem( Tree tree, String text ) { // TODO Change this demo prototype code. Find a better way to get a control item. for( TreeItem item : tree.getItems()[ 0 ].getItems() ) { if( item.getText().equals( text ) ) { return item; } } return null; } private TreeItem getTableItem( Tree tree, String text ) { // TODO Change this demo prototype code. Find a better way to get a table item. for( TreeItem item : tree.getItems()[ 0 ].getItems()[ 4 ].getItems() ) { if( item.getText().equals( text ) ) { return item; } } return null; } private TreeItem getPageItem( Tree tree, String text ) { // TODO Change this demo prototype code. Find a better way to get a page item. for( TreeItem item : tree.getItems() ) { if( item.getText().equals( text ) ) { return item; } } return null; } private class LabelProvider implements ILabelProvider { Image image = null; @Override public Image getImage( Object element ) { if( element instanceof BlackBerryProjectPropertiesPage ) { ImageDescriptor desc = ContextManager.getImageDescriptor( "icons/obj16/page_obj.gif" ); //$NON-NLS-1$ image = desc.createImage(); return image; } if( element instanceof TableItem ) { TableItem item = (TableItem) element; return item.getImage( 1 ); } return null; } @Override public String getText( Object element ) { if( element instanceof BlackBerryProjectPropertiesPage ) { return ( (BlackBerryProjectPropertiesPage) element ).getTitle(); } else if( element instanceof SectionPart ) { return ( (SectionPart) element ).getSection().getText(); } else if( element instanceof Control ) { Object text = ( (Control) element ).getData( BlackBerryProjectPropertiesPage.CONTROL_TITLE_KEY ); return text == null ? IConstants.EMPTY_STRING : text.toString(); } else if( element instanceof TableItem ) { TableItem item = ( (TableItem) element ); Object obj = item.getParent().getData( BlackBerryProjectPropertiesPage.TABLE_TEXT_INDEX_KEY ); if( ( obj != null ) && ( obj instanceof Integer ) ) { return item.getText( ( (Integer) obj ).intValue() ); } } return null; } @Override public void addListener( ILabelProviderListener listener ) { // Do Nothing } @Override public void dispose() { // Do Nothing } @Override public boolean isLabelProperty( Object element, String property ) { return false; } @Override public void removeListener( ILabelProviderListener listener ) { // Do Nothing } } private class ContentProvider implements ITreeContentProvider { @Override public Object[] getChildren( Object parentElement ) { if( parentElement instanceof BlackBerryProjectPropertiesPage ) { return ( (BlackBerryProjectPropertiesPage) parentElement ).getSections(); } else if( parentElement instanceof AbstractSection ) { return ( (AbstractSection) parentElement ).getOutlineControls(); } else if( parentElement instanceof Table ) { return ( (Table) parentElement ).getItems(); } return null; } @Override public Object getParent( Object element ) { return null; } @Override public boolean hasChildren( Object element ) { if( ( element instanceof BlackBerryProjectPropertiesPage ) || ( element instanceof SectionPart ) || ( element instanceof Table ) ) { return true; } return false; } @Override public Object[] getElements( Object inputElement ) { if( inputElement instanceof BlackBerryProjectPropertiesPage[] ) { return (BlackBerryProjectPropertiesPage[]) inputElement; } else if( inputElement instanceof TableItem[] ) { return (TableItem[]) inputElement; } return new Object[] {}; } @Override public void dispose() { // Do Nothing } @Override public void inputChanged( Viewer viewer, Object oldInput, Object newInput ) { // Do Nothing } } }