Package org.apache.sling.ide.eclipse.ui.views

Source Code of org.apache.sling.ide.eclipse.ui.views.JcrPropertiesView

/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License.  You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.sling.ide.eclipse.ui.views;

import java.util.Map;
import java.util.Map.Entry;

import org.apache.sling.ide.eclipse.core.internal.Activator;
import org.apache.sling.ide.eclipse.ui.nav.model.JcrNode;
import org.apache.sling.ide.eclipse.ui.nav.model.SyncDir;
import org.apache.sling.ide.eclipse.ui.nav.model.SyncDirManager;
import org.apache.sling.ide.eclipse.ui.nav.model.UpdateHandler;
import org.apache.sling.ide.eclipse.ui.views.JcrEditingSupport.ColumnId;
import org.eclipse.core.resources.IFile;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.CellNavigationStrategy;
import org.eclipse.jface.viewers.ColumnViewerEditor;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.FocusCellOwnerDrawHighlighter;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TableViewerEditor;
import org.eclipse.jface.viewers.TableViewerFocusCellManager;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.internal.IWorkbenchGraphicConstants;
import org.eclipse.ui.internal.WorkbenchImages;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.views.properties.IPropertyDescriptor;

public class JcrPropertiesView extends ViewPart {

    private static final String TITLE_FONT = "org.eclipse.ui.internal.views.properties.tabbed.view.TabbedPropertyTitle"; //$NON-NLS-1$

    private TableViewer viewer;
  private Action insertAction;
  private Action deleteAction;
  private Action doubleClickAction;

    private Label titleLabel;

    private ISelectionListener listener;

    private Action showInEditorAction;

    private Action pinAction;

    private JcrNode lastInput;

    private Action synchedAction;

    private String lastEditedOldPropertyName;

    private String lastEditedNewPropertyName;

    private ColumnId lastEditedColumnId;

    private Composite mainControl;

    private IWorkbenchPage page;

  class ViewContentProvider implements IStructuredContentProvider {
    public void inputChanged(Viewer v, Object oldInput, Object newInput) {
    }
    public void dispose() {
    }
    public Object[] getElements(Object parent) {
        if (parent instanceof JcrNode) {
            JcrNode node = (JcrNode)parent;
            final IPropertyDescriptor[] pds = node.getProperties().getPropertyDescriptors();
                return pds;
        } else {
            return new String[] {};
        }
    }
  }
  /**
   * The constructor.
   */
  public JcrPropertiesView() {
  }

  public Control getMainControl() {
      return mainControl;
  }
 
  /**
   * This is a callback that will allow us
   * to create the viewer and initialize it.
   */
  public void createPartControl(Composite parent) {
      SyncDirManager.registerUpdateListener(new UpdateHandler() {
           
            @Override
            public void syncDirUpdated(SyncDir syncDir) {
                refreshContent();
            }
        });
     
      mainControl = new Composite(parent, SWT.NONE);
      final GridLayout gridLayout = new GridLayout(1, true);
        mainControl.setLayout(gridLayout);
     
        if (getViewSite()!=null) {
            titleLabel = new Label(mainControl, SWT.WRAP);
            titleLabel.setText("");
            GridData data = new GridData(GridData.FILL_HORIZONTAL);
            titleLabel.setLayoutData(data);
            Label horizontalLine = new Label(mainControl, SWT.SEPARATOR | SWT.HORIZONTAL);
            data = new GridData(GridData.FILL_HORIZONTAL);
            horizontalLine.setLayoutData(data);
        }
       
        Font font;
        if (! JFaceResources.getFontRegistry().hasValueFor(TITLE_FONT)) {
            FontData[] fontData = JFaceResources.getFontRegistry().getBold(
                    JFaceResources.DEFAULT_FONT).getFontData();
            /* title font is 2pt larger than that used in the tabs. */ 
            fontData[0].setHeight(fontData[0].getHeight() + 2);
            JFaceResources.getFontRegistry().put(TITLE_FONT, fontData);
        }
        font = JFaceResources.getFont(TITLE_FONT);
        if (titleLabel!=null) {
            titleLabel.setFont(font);
        }

        Composite tableParent = new Composite(mainControl, SWT.NONE);
//        tableParent.setBackground(new Color(Display.getDefault(), 100,20,180));
        GridData tableLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
        tableLayoutData.widthHint = 1; // shrink to min - table settings will resize to correct ratios
        tableLayoutData.heightHint = SWT.DEFAULT;
        tableParent.setLayoutData(tableLayoutData);
        TableColumnLayout tableLayout = new TableColumnLayout() {
            @Override
            protected Point computeSize(Composite composite, int wHint,
                    int hHint, boolean flushCache) {
                Point p = super.computeSize(composite, wHint, hHint, flushCache);
                return new Point(p.x, p.y);
            }
        };
        tableParent.setLayout(tableLayout);
       
        viewer = new TableViewer(tableParent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.HIDE_SELECTION | SWT.FULL_SELECTION);
        TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(
                viewer, new FocusCellOwnerDrawHighlighter(viewer), new CellNavigationStrategy());
        ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(
                viewer){

            @Override
            protected boolean isEditorActivationEvent(
                    ColumnViewerEditorActivationEvent event) {
                resetLastValueEdited();
                return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
                        || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
                        || (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR)
                        || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
            }
        };
        int features = ColumnViewerEditor.TABBING_HORIZONTAL
                | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
                | ColumnViewerEditor.TABBING_VERTICAL
                | ColumnViewerEditor.KEYBOARD_ACTIVATION
                | ColumnViewerEditor.KEEP_EDITOR_ON_DOUBLE_CLICK;
        TableViewerEditor.create(viewer, focusCellManager, actSupport, features);
        viewer.getTable().setLinesVisible(true);
        viewer.getTable().setHeaderVisible(true);
        viewer.setContentProvider(new ViewContentProvider());
    viewer.addSelectionChangedListener(new ISelectionChangedListener() {
           
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                final ISelection selection = event.getSelection();
                if (selection instanceof IStructuredSelection) {
                    IStructuredSelection iss = (IStructuredSelection)selection;
                    if (iss.isEmpty()) {
                        deleteAction.setEnabled(false);
                    } else {
                        deleteAction.setEnabled(true);
                    }
                } else {
                    deleteAction.setEnabled(false);
                }
            }
        });
   
    CellLabelProvider clp = new JcrCellLabelProvider(viewer);

    TableViewerColumn column0 = new TableViewerColumn(viewer, SWT.NONE);
    column0.getColumn().setText("Name");
    column0.getColumn().setResizable(true);
    column0.getColumn().setWidth(200);
        tableLayout.setColumnData(column0.getColumn(), new ColumnWeightData(30, 140));

        final TableViewerColumn column1 = new TableViewerColumn(viewer, SWT.NONE);
        column1.getColumn().setText("Type");
        column1.getColumn().setResizable(true);
        column1.getColumn().setWidth(300);
        column1.setLabelProvider(clp);
        tableLayout.setColumnData(column1.getColumn(), new ColumnWeightData(10, 80));
       
        final TableViewerColumn column2 = new TableViewerColumn(viewer, SWT.NONE);
        column2.getColumn().setText("Value");
        column2.getColumn().setResizable(true);
        column2.getColumn().setWidth(300);
        tableLayout.setColumnData(column2.getColumn(), new ColumnWeightData(70, 220));
       
        final TableViewerColumn column3 = new TableViewerColumn(viewer, SWT.NONE);
        column3.getColumn().setText("Protected");
        column3.getColumn().setResizable(true);
        column3.getColumn().setWidth(300);
        column3.setLabelProvider(clp);
        tableLayout.setColumnData(column3.getColumn(), new ColumnWeightData(5, 57));

        final TableViewerColumn column4 = new TableViewerColumn(viewer, SWT.NONE);
        column4.getColumn().setText("Mandatory");
        column4.getColumn().setResizable(true);
        column4.getColumn().setWidth(300);
        column4.setLabelProvider(clp);
        tableLayout.setColumnData(column4.getColumn(), new ColumnWeightData(5, 62));

        final TableViewerColumn column5 = new TableViewerColumn(viewer, SWT.NONE);
        column5.getColumn().setText("Multiple");
        column5.getColumn().setResizable(true);
        column5.getColumn().setWidth(300);
        column5.setLabelProvider(clp);
        tableLayout.setColumnData(column5.getColumn(), new ColumnWeightData(5, 82));

        final TableViewerColumn column6 = new TableViewerColumn(viewer, SWT.NONE);
        column6.getColumn().setText("Auto Created");
        column6.getColumn().setResizable(true);
        column6.getColumn().setWidth(300);
        column6.setLabelProvider(clp);
        tableLayout.setColumnData(column6.getColumn(), new ColumnWeightData(5, 77));

        column0.setLabelProvider(clp);
        column0.setEditingSupport(new JcrEditingSupport(this, viewer, ColumnId.NAME));

        column1.setLabelProvider(clp);
        column1.setEditingSupport(new JcrEditingSupport(this, viewer, ColumnId.TYPE));

        column2.setLabelProvider(clp);
    column2.setEditingSupport(new JcrEditingSupport(this, viewer, ColumnId.VALUE));
 
        column5.setEditingSupport(new JcrEditingSupport(this, viewer, ColumnId.MULTIPLE));
   
    // Create the help context id for the viewer's control
    PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(), "org.apache.sling.ide.eclipse-ui.viewer");
    makeActions();
    hookContextMenu();
    hookDoubleClickAction();
    contributeToActionBars();
   
    listener = new ISelectionListener() {
           
            @Override
            public void selectionChanged(IWorkbenchPart part, ISelection selection) {
                if (selection instanceof IStructuredSelection) {
                    IStructuredSelection iss = (IStructuredSelection)selection;
                    Object firstElem = iss.getFirstElement();
                    if (firstElem instanceof JcrNode) {
                        JcrNode jcrNode = (JcrNode)firstElem;
                        setInput(jcrNode);
                        return;
                    }
                }
            }
        };
        if (getViewSite()!=null) {
            getViewSite().getPage().addSelectionListener(listener);
            final ISelection selection = getViewSite().getPage().getSelection();
            Display.getCurrent().asyncExec(new Runnable() {
   
                @Override
                public void run() {
                    listener.selectionChanged(null, selection);
                }
               
            });
        }
  }
 
    void resetLastValueEdited() {
        this.lastEditedOldPropertyName = null;
        this.lastEditedNewPropertyName = null;
        this.lastEditedColumnId = null;
    }
 
  void setLastValueEdited(String oldPropertyName, String newPropertyName, ColumnId columnId) {
      this.lastEditedOldPropertyName = oldPropertyName;
      this.lastEditedNewPropertyName = newPropertyName;
      this.lastEditedColumnId = columnId;
  }
 
  @Override
  public void dispose() {
      super.dispose();
      if (listener!=null) {
          getViewSite().getPage().removeSelectionListener(listener);
          listener = null;
      }
  }

  private void hookContextMenu() {
    MenuManager menuMgr = new MenuManager("#PopupMenu");
    menuMgr.setRemoveAllWhenShown(true);
    menuMgr.addMenuListener(new IMenuListener() {
      public void menuAboutToShow(IMenuManager manager) {
        JcrPropertiesView.this.fillContextMenu(manager);
      }
    });
    Menu menu = menuMgr.createContextMenu(viewer.getControl());
    viewer.getControl().setMenu(menu);
    IWorkbenchPartSite site = getSite();
    if (site!=null) {
        site.registerContextMenu(menuMgr, viewer);
    }
  }

  private void contributeToActionBars() {
      if (getViewSite()!=null) {
        IActionBars bars = getViewSite().getActionBars();
        fillLocalPullDown(bars.getMenuManager());
        fillLocalToolBar(bars.getToolBarManager());
      }
  }

  private void fillLocalPullDown(IMenuManager manager) {
    manager.add(insertAction);
//    manager.add(new Separator());
    manager.add(deleteAction);
        manager.add(showInEditorAction);
        if (pinAction!=null) {
            manager.add(pinAction);
        }
        if (synchedAction!=null) {
            manager.add(synchedAction);
        }
  }

  private void fillContextMenu(IMenuManager manager) {
    manager.add(insertAction);
        manager.add(deleteAction);
        manager.add(showInEditorAction);
        if (pinAction!=null) {
            manager.add(pinAction);
        }
        if (synchedAction!=null) {
            manager.add(synchedAction);
        }
    // Other plug-ins can contribute there actions here
    manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
  }
 
  private void fillLocalToolBar(IToolBarManager manager) {
    manager.add(insertAction);
    manager.add(deleteAction);
        manager.add(showInEditorAction);
        if (pinAction!=null) {
            manager.add(pinAction);
        }
        if (synchedAction!=null) {
            manager.add(synchedAction);
        }
  }

  private void makeActions() {
    insertAction = new Action() {
      public void run() {
          NewRow newRow = new NewRow();
          viewer.add(newRow);
          viewer.getTable().setTopIndex(viewer.getTable().getItemCount());
          viewer.getTable().select(viewer.getTable().getItemCount()-1);
          viewer.editElement(newRow, 0);
      }
    };
    insertAction.setText("Insert");
    insertAction.setToolTipText("Insert a property");
    insertAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
      getImageDescriptor(ISharedImages.IMG_OBJ_ADD));
   
    deleteAction = new Action() {
      public void run() {
          if (viewer.getSelection().isEmpty()) {
              return;
          }
          ISelection sel = viewer.getSelection();
          if (sel instanceof IStructuredSelection) {
              IStructuredSelection iss = (IStructuredSelection)sel;
              Object elem = iss.getFirstElement();
              if (elem instanceof IPropertyDescriptor) {
                  IPropertyDescriptor pd = (IPropertyDescriptor)elem;
                  JcrNode jcrnode = (JcrNode)viewer.getInput();
                  jcrnode.deleteProperty(pd.getDisplayName());
                  refreshContent();
              }
          }
      }
    };
    deleteAction.setText("Delete");
    deleteAction.setToolTipText("Delete a proeprty");
    deleteAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
        getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
    doubleClickAction = new Action() {
      public void run() {
          //TODO doesn't do anything currently..
        ISelection selection = viewer.getSelection();
//        Object obj = ((IStructuredSelection)selection).getFirstElement();
//        showMessage("Double-click detected on "+obj.toString());
      }
    };
   
    showInEditorAction = new Action() {
        public void run() {
           
            JcrNode node = (JcrNode)viewer.getInput();
                final IFile file = node.getFileForEditor();
                if (file!=null) {
                    try {
                        IDE.openEditor(getPage(), file, true);
                    } catch (PartInitException e) {
                        e.printStackTrace(System.out);
                    }
                }
        }
    };
    showInEditorAction.setText("Show in editor");
    showInEditorAction.setToolTipText("Show underlying vault file in editor");
    showInEditorAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
                getImageDescriptor(ISharedImages.IMG_OBJ_FILE));
   
    if (getViewSite()!=null) {
        pinAction = new Action("pin to selection", IAction.AS_CHECK_BOX) {
            public void run() {
                if (!pinAction.isChecked()) {
                    // unpin
                    setContentDescription("");
                    setInput(lastInput);
                } else {
                    setContentDescription("[pinned]");
                }
                // toggle state of syncedAction accordingly
                if (synchedAction!=null) {
                    synchedAction.setEnabled(!pinAction.isChecked());
                }
            }
        };
        pinAction.setText("Pin to selection");
        pinAction.setToolTipText("Pin this property view to the current selection");
        pinAction.setImageDescriptor(WorkbenchImages
                    .getImageDescriptor(IWorkbenchGraphicConstants.IMG_ETOOL_PIN_EDITOR));
        pinAction.setDisabledImageDescriptor(WorkbenchImages
                    .getImageDescriptor(IWorkbenchGraphicConstants.IMG_ETOOL_PIN_EDITOR_DISABLED));
        pinAction.setChecked(false);
   
        synchedAction = new Action("Link with Editor and selection", IAction.AS_CHECK_BOX) {
                public void run() {
                    // toggle state of pinAction accordingly
                    pinAction.setEnabled(!synchedAction.isChecked());
                }
            };
            synchedAction.setText("Link with Editor and selection");
            synchedAction.setToolTipText("Link with Editor and selection");
            synchedAction.setImageDescriptor(WorkbenchImages
                    .getImageDescriptor(ISharedImages.IMG_ELCL_SYNCED));
            synchedAction.setDisabledImageDescriptor(WorkbenchImages
                    .getImageDescriptor(ISharedImages.IMG_ELCL_SYNCED_DISABLED));
            synchedAction.setChecked(true);
    }
  }

  private void hookDoubleClickAction() {
    viewer.addDoubleClickListener(new IDoubleClickListener() {
      public void doubleClick(DoubleClickEvent event) {
        doubleClickAction.run();
      }
    });
  }
 
  /**
   * Passing the focus request to the viewer's control.
   */
  public void setFocus() {
    viewer.getControl().setFocus();
  }

    void refreshContent() {
        final Object input = viewer.getInput();
        if (input!=null && input instanceof JcrNode) {
            JcrNode jcrnode = (JcrNode)input;
            SyncDir syncDir = jcrnode.getSyncDir();
            JcrNode newnode = syncDir.getNode(jcrnode.getJcrPath());
            if (newnode!=null) {
                viewer.setInput(newnode);
                if (lastEditedNewPropertyName!=null) {
                    // set the selection/focus accordingly
                   
                    for(int i=0;;i++) {
                        Object element = viewer.getElementAt(i);
                        if (element==null) {
                            break;
                        }
                        final IPropertyDescriptor pd = (IPropertyDescriptor) element;
                        Map.Entry<String,Object> me = (Entry<String, Object>) pd.getId();
                        String key = me.getKey();
                        if (lastEditedNewPropertyName.equals(key)) {
                            // set the selection to this one
                            final int column;
                            if (lastEditedColumnId==ColumnId.NAME) {
                                column = 0;
                            } else if (lastEditedColumnId==ColumnId.TYPE) {
                                column = 1;
                            } else if (lastEditedColumnId==ColumnId.VALUE) {
                                column = 2;
                            } else if (lastEditedColumnId==ColumnId.MULTIPLE) {
                                column = 5;
                            } else {
                                throw new IllegalStateException("Unknown columnId="+lastEditedColumnId);
                            }
                            Display.getDefault().asyncExec(new Runnable() {

                                @Override
                                public void run() {
                                    try{
                                        // edit
                                        viewer.editElement(pd, column);
                                        // and cancel immediately - to get the selection right
                                        viewer.cancelEditing();
                                    } catch(Exception e) {
                                        Activator.getDefault().getPluginLogger().error("Exception occured on edit/cancel: "+e, e);
                                    }
                                }
                               
                            });
                            break;
                        }
                    }
                   
                }
            }
        }
    }

    public void setInput(JcrNode jcrNode) {
        // reset the last edited values..:
        resetLastValueEdited();

        if (pinAction!=null && pinAction.isChecked()) {
            lastInput = jcrNode;
        } else {
            if (getViewSite()!=null && synchedAction!=null && synchedAction.isChecked()) {
                getViewSite().getPage().bringToTop(this);
            }
            viewer.setInput(jcrNode);
            if (titleLabel!=null) {
                titleLabel.setText(jcrNode.getJcrPath());
            }
            insertAction.setEnabled(!jcrNode.getPrimaryType().equals("nt:folder"));
            deleteAction.setEnabled(false);
            showInEditorAction.setEnabled(jcrNode.getFileForEditor()!=null);
        }
    }
   
    private IWorkbenchPage getPage() {
        if (page!=null) {
            return page;
        } else if (getViewSite()!=null) {
            return getViewSite().getPage();
        } else {
            return null;
        }
    }

    public void setPage(IWorkbenchPage page) {
        this.page = page;
    }

}
TOP

Related Classes of org.apache.sling.ide.eclipse.ui.views.JcrPropertiesView

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.