Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 package com.generalrobotix.ui.view;
00020
00021 import java.util.ArrayList;
00022 import java.util.List;
00023 import java.util.Map;
00024 import java.util.Vector;
00025 import java.util.Iterator;
00026
00027 import org.eclipse.jface.action.Action;
00028 import org.eclipse.jface.action.MenuManager;
00029 import org.eclipse.jface.viewers.ISelection;
00030 import org.eclipse.jface.viewers.ISelectionChangedListener;
00031 import org.eclipse.jface.viewers.IStructuredSelection;
00032 import org.eclipse.jface.viewers.ITreeContentProvider;
00033 import org.eclipse.jface.viewers.IViewerLabelProvider;
00034 import org.eclipse.jface.viewers.LabelProvider;
00035 import org.eclipse.jface.viewers.SelectionChangedEvent;
00036 import org.eclipse.jface.viewers.StructuredSelection;
00037 import org.eclipse.jface.viewers.TreeViewer;
00038 import org.eclipse.jface.viewers.Viewer;
00039 import org.eclipse.jface.viewers.ViewerLabel;
00040
00041 import org.eclipse.swt.SWT;
00042 import org.eclipse.swt.graphics.Image;
00043 import org.eclipse.swt.widgets.Composite;
00044 import org.eclipse.swt.widgets.Event;
00045 import org.eclipse.swt.widgets.Listener;
00046 import org.eclipse.swt.widgets.Tree;
00047 import org.eclipse.ui.ISharedImages;
00048 import org.eclipse.ui.PlatformUI;
00049
00050 import com.generalrobotix.ui.GrxBaseItem;
00051 import com.generalrobotix.ui.GrxBaseView;
00052 import com.generalrobotix.ui.GrxBasePlugin;
00053 import com.generalrobotix.ui.GrxBaseViewPart;
00054 import com.generalrobotix.ui.GrxPluginManager;
00055 import com.generalrobotix.ui.grxui.Activator;
00056 import com.generalrobotix.ui.item.GrxExtraJointItem;
00057 import com.generalrobotix.ui.item.GrxHwcItem;
00058 import com.generalrobotix.ui.item.GrxLinkItem;
00059 import com.generalrobotix.ui.item.GrxModeInfoItem;
00060 import com.generalrobotix.ui.item.GrxModelItem;
00061 import com.generalrobotix.ui.item.GrxProjectItem;
00062 import com.generalrobotix.ui.item.GrxSegmentItem;
00063 import com.generalrobotix.ui.item.GrxSensorItem;
00064 import com.generalrobotix.ui.item.GrxTransformItem;
00065 import com.generalrobotix.ui.util.OrderedHashMap;
00066
00067 @SuppressWarnings("serial")
00071 public class GrxItemView extends GrxBaseView {
00072
00073 GrxItemViewPart vp;
00074
00075 TreeViewer tv;
00076 MenuManager menuMgr= new MenuManager();
00077
00078 private List<GrxBasePlugin> baseItems_ = new ArrayList<GrxBasePlugin>();
00086 @SuppressWarnings("unchecked")
00087 public GrxItemView(String name, GrxPluginManager manager, GrxBaseViewPart vp, Composite parent) {
00088 super(name, manager, vp, parent);
00089
00090 tv = new TreeViewer(composite_);
00091 tv.setContentProvider( new TreeContentProvider() );
00092 tv.setLabelProvider( new TreeLabelProvider() );
00093
00094 Tree t = tv.getTree();
00095
00096
00097 tv.addSelectionChangedListener(new ISelectionChangedListener() {
00098 public void selectionChanged(SelectionChangedEvent event) {
00099 ISelection selection = event.getSelection();
00100 for (Object o : ((IStructuredSelection) selection).toArray() ){
00101 if ( GrxBaseItem.class.isAssignableFrom(o.getClass()) ){
00102 manager_.focusedItem((GrxBaseItem)o);
00103 }else if(o instanceof String){
00104 manager_.focusedItem(manager_.getProject());
00105 }
00106 }
00107 }
00108 });
00109
00110 t.addListener ( SWT.DefaultSelection, new Listener () {
00111 public void handleEvent (Event event) {
00112 ISelection selection = tv.getSelection();
00113 for (Object o : ((IStructuredSelection) selection).toArray() ){
00114 if ( GrxBaseItem.class.isAssignableFrom(o.getClass()) ){
00115 manager_.setSelectedItem( (GrxBaseItem)o, !((GrxBaseItem)o).isSelected() );
00116 }
00117 }
00118 }
00119 });
00120
00121
00122 t.setMenu(menuMgr.createContextMenu( t ));
00123 t.addListener ( SWT.MenuDetect, new Listener () {
00124 public void handleEvent (Event event) {
00125 ISelection selection = tv.getSelection();
00126 Object o = ((IStructuredSelection) selection).getFirstElement();
00127 menuMgr.removeAll();
00128
00129
00130 if (o instanceof String){
00131 Vector<Action> menus = manager_.getProject().getMenu();
00132 for( Action a: menus){
00133 menuMgr.add(a);
00134 }
00135 }
00136
00137
00138 if( Class.class.isAssignableFrom( o.getClass() ) ){
00139 if( GrxBaseItem.class.isAssignableFrom( (Class<?>)o ) ) {
00140 Vector<Action> menus = manager_.getItemMenu( (Class<? extends GrxBaseItem>) o );
00141 for( Action a: menus){
00142 menuMgr.add(a);
00143 }
00144 }
00145 }
00146
00147 if( GrxBasePlugin.class.isAssignableFrom( o.getClass() ) ){
00148 Vector<Action> menus = ((GrxBasePlugin)o).getMenu();
00149 for( Action a: menus){
00150 menuMgr.add(a);
00151 }
00152 Vector<MenuManager> subMenus = ((GrxBasePlugin)o).getSubMenu();
00153 for( MenuManager m: subMenus){
00154 menuMgr.add(m);
00155 }
00156 }
00157 }
00158 });
00159
00160
00161 tv.setInput( manager_ );
00162
00163 manager_.registerItemChangeListener(this, GrxBaseItem.class);
00164 setUp();
00165 }
00166
00167 public void setUp(){
00168 Iterator<GrxBasePlugin> it0 = baseItems_.iterator();
00169 while(it0.hasNext())
00170 it0.next().deleteObserver(this);
00171 baseItems_.clear();
00172 GrxModeInfoItem mode = manager_.getMode();
00173 Iterator<Class<? extends GrxBaseItem>> it = mode.activeItemClassList_.listIterator();
00174 while (it.hasNext()){
00175 Class<? extends GrxBaseItem> local = (Class<? extends GrxBaseItem>)it.next();
00176 if ( manager_.isItemVisible( local ) ){
00177 Map<String, ?> map = (Map<String, ?>) manager_.getItemMap(local);
00178 Iterator itI = map.values().iterator();
00179 while(itI.hasNext()){
00180 GrxBaseItem baseItem = (GrxBaseItem) itI.next();
00181 baseItems_.add(baseItem);
00182 baseItem.addObserver(this);
00183 if(baseItem instanceof GrxModelItem){
00184 GrxModelItem model = (GrxModelItem)baseItem;
00185 GrxLinkItem root = model.rootLink();
00186 if (root != null){
00187 addchildrenObserver(root);
00188 }
00189 }
00190 }
00191 }
00192 }
00193 GrxProjectItem projectItem = manager_.getProject();
00194 if(!projectItem.getObserver().contains(this))
00195 projectItem.addObserver(this);
00196 updateTree();
00197 }
00198
00199 private void addchildrenObserver(GrxBaseItem item){
00200 baseItems_.add(item);
00201 item.addObserver(this);
00202 Vector<GrxTransformItem> children = ((GrxTransformItem)item).children_;
00203 for(int i=0; i<children.size(); i++){
00204 addchildrenObserver(children.get(i));
00205 }
00206 }
00207
00211 class TreeContentProvider implements ITreeContentProvider {
00212
00213 Object[] gets( Object o ) {
00214
00215 if( o instanceof GrxPluginManager ) {
00216 Object[] os = { ((GrxPluginManager)o).getProjectName() };
00217 return os;
00218 }
00219
00220
00221 if( o instanceof String ) {
00222 GrxModeInfoItem mode = manager_.getMode();
00223
00224 ArrayList<Class<? extends GrxBaseItem>> localList = new ArrayList<Class<? extends GrxBaseItem>>();
00225 Iterator<Class<? extends GrxBaseItem>> it = mode.activeItemClassList_.listIterator();
00226
00227 while (it.hasNext()){
00228 Class<? extends GrxBaseItem> local = (Class<? extends GrxBaseItem>)it.next();
00229 if ( manager_.isItemVisible( local ) ){
00230 localList.add( local );
00231 }
00232 }
00233 return localList.toArray();
00234 }
00235
00236
00237 if( o instanceof Class ) {
00238 if( GrxBaseItem.class.isAssignableFrom( (Class<?>)o ) ) {
00239 OrderedHashMap oMap = manager_.pluginMap_.get( o);
00240 return oMap.values().toArray();
00241 }
00242 }
00243
00244 if (o instanceof GrxModelItem){
00245 GrxModelItem model = (GrxModelItem)o;
00246 if (model.rootLink() != null){
00247
00248 Vector<GrxExtraJointItem> extraJointList = ((GrxModelItem)o).extraJoints_;
00249 Object[] os = new Object[extraJointList.size() + 1];
00250 os[0] = ((GrxModelItem)o).rootLink();
00251 for(int i=0; i<extraJointList.size(); i++)
00252 os[i+1] = extraJointList.get(i);
00253 return os;
00254 }else{
00255 return null;
00256 }
00257 }
00258
00259 if (o instanceof GrxLinkItem){
00260 GrxLinkItem link = (GrxLinkItem)o;
00261 return link.children_.toArray();
00262 }
00263
00264
00265 if (o instanceof GrxSegmentItem){
00266 GrxSegmentItem link = (GrxSegmentItem)o;
00267 return link.children_.toArray();
00268 }
00269
00270
00271 if (o instanceof GrxSensorItem){
00272 GrxSensorItem sensor = (GrxSensorItem)o;
00273 return sensor.children_.toArray();
00274 }
00275
00276
00277 if (o instanceof GrxHwcItem){
00278 GrxHwcItem hwc = (GrxHwcItem)o;
00279 return hwc.children_.toArray();
00280 }
00281
00282
00283 return null;
00284 }
00285 public Object[] getChildren(Object parentElement) { return gets(parentElement); }
00286 public Object getParent(Object element) { return null; }
00287 public boolean hasChildren(Object element) {
00288 Object[] os = gets(element);
00289 return os != null && os.length > 0;
00290 }
00291 public Object[] getElements(Object inputElement) { return gets(inputElement); }
00292 public void dispose() {}
00293 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
00294 }
00295
00299 class TreeLabelProvider extends LabelProvider implements IViewerLabelProvider{
00300
00301 public String getText(Object object) {
00302
00303 if( object instanceof Class ) {
00304 if( GrxBaseItem.class.isAssignableFrom( (Class<?>) object ) ) {
00305 return manager_.getItemTitle( (Class<? extends GrxBaseItem>)object );
00306 }
00307
00308 }else{
00309 if( GrxBaseItem.class.isAssignableFrom( object.getClass() ) ) {
00310 return ((GrxBaseItem)object).getName();
00311 }
00312 }
00313
00314 return object.toString();
00315 }
00316
00317 public Image getImage( Object o ){
00318 if( GrxBaseItem.class.isAssignableFrom( o.getClass() ) ) {
00319 if( ((GrxBaseItem)o).getIcon() == null )
00320 return PlatformUI.getWorkbench().getSharedImages().getImage(
00321 ISharedImages.IMG_OBJ_FILE);
00322 return ((GrxBaseItem)o).getIcon();
00323 }
00324 return PlatformUI.getWorkbench().getSharedImages().getImage(
00325 ISharedImages.IMG_OBJ_FOLDER);
00326 }
00327
00328 public void updateLabel(ViewerLabel label, Object element) {
00329 label.setText( getText(element) );
00330 label.setImage( getImage(element) );
00331 if( GrxBaseItem.class.isAssignableFrom( element.getClass() ) ) {
00332
00333 if( ((GrxBaseItem)element).isSelected() ) {
00334 label.setForeground( Activator.getDefault().getColor("black") );
00335
00336 } else{
00337 label.setForeground( Activator.getDefault().getColor("gray") );
00338 label.setText( "("+getText(element)+")" );
00339 }
00340 }
00341 }
00342 }
00343
00347 public void updateTree() {
00348 tv.refresh();
00349 tv.expandToLevel(3);
00350 }
00351
00352 public void update(GrxBasePlugin plugin, Object... arg) {
00353 if((String)arg[0]!="PropertyChange")
00354 return;
00355 updateTree();
00356 }
00357
00358 public void registerItemChange(GrxBaseItem item, int event){
00359 switch(event){
00360 case GrxPluginManager.ADD_ITEM:
00361 if(!baseItems_.contains(item)){
00362 item.addObserver(this);
00363 baseItems_.add(item);
00364 }
00365 break;
00366 case GrxPluginManager.REMOVE_ITEM:
00367 if(baseItems_.contains(item)){
00368 item.deleteObserver(this);
00369 baseItems_.remove(item);
00370 }
00371 break;
00372 default:
00373 break;
00374 }
00375 updateTree();
00376 if(event==GrxPluginManager.FOCUSED_ITEM){
00377 List<GrxBasePlugin> l = new ArrayList<GrxBasePlugin>();
00378 l.add(item);
00379 tv.setSelection(new StructuredSelection(l), true);
00380 }
00381 }
00382
00383 public void shutdown(){
00384 manager_.removeItemChangeListener(this, GrxBaseItem.class);
00385 Iterator<GrxBasePlugin> it = baseItems_.iterator();
00386 while(it.hasNext()){
00387 it.next().deleteObserver(this);
00388 }
00389 manager_.getProject().deleteObserver(this);
00390 }
00391
00392 }