Package com.puppetlabs.geppetto.puppetdb.ui.views

Source Code of com.puppetlabs.geppetto.puppetdb.ui.views.PuppetResourceEventsView

/**
* Copyright (c) 2013 Puppet Labs, Inc. and other contributors, as listed below.
* 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:
*   Puppet Labs
*/
package com.puppetlabs.geppetto.puppetdb.ui.views;

import static com.puppetlabs.geppetto.puppetdb.ui.views.Util.getPuppetDBConnections;
import static org.eclipse.swt.SWT.LEFT;
import static org.eclipse.swt.SWT.RIGHT;

import java.util.concurrent.Callable;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
import org.eclipse.jface.action.Action;
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.dialogs.MessageDialog;
import org.eclipse.jface.layout.TreeColumnLayout;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.util.OpenStrategy;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.window.ToolTip;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.*;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.texteditor.ITextEditor;

import com.google.inject.Inject;
import com.puppetlabs.geppetto.puppetdb.PuppetDBConnectionPreferences;
import com.puppetlabs.geppetto.puppetdb.PuppetDBManager;
import com.puppetlabs.geppetto.puppetdb.ui.UIPlugin;
import com.puppetlabs.geppetto.puppetdb.ui.treenode.TreeNodeContentProvider;
import com.puppetlabs.geppetto.puppetdb.ui.treenode.TreeNodeLabelProvider;
import com.puppetlabs.puppetdb.javaclient.model.Resource;

public class PuppetResourceEventsView extends ViewPart implements ISelectionChangedListener, IDoubleClickListener, KeyListener {
  @Inject
  private PuppetDBManager puppetDBManager;

  private TreeViewer viewer;

  private Action gotoAction;

  private Action removeAction;

  // @fmtOff
  public static RegexpSubstitution[] DEFAULT_WORKSPACE_MAPPINGS = new RegexpSubstitution[] {
    new RegexpSubstitution(".*/modules/(.+)$", "$1"),
    new RegexpSubstitution(".*/([^/]+/manifests/.+)$""$1"),
  };
  // @fmtOn

  /**
   * Creates the actions for the viewsite action bars
   */
  private void createActions(Tree tree) {
    IActionBars bars = getViewSite().getActionBars();
    IToolBarManager toolbarManager = bars.getToolBarManager();

    final Action newAction = createNewAction();
    toolbarManager.add(createNewAction());

    removeAction = createRemoveAction();
    toolbarManager.add(removeAction);

    final Action refreshAction = createRefreshAction();
    toolbarManager.add(refreshAction);

    gotoAction = createGoToAction();

    MenuManager popupMenuManager = new MenuManager("#PopupMenu"); //$NON-NLS-1$
    IMenuListener listener = new IMenuListener() {
      @Override
      public void menuAboutToShow(IMenuManager manager) {
        manager.add(gotoAction);
        manager.add(new Separator());
        manager.add(newAction);
        manager.add(removeAction);
        manager.add(new Separator());
        manager.add(refreshAction);
        manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
      }
    };
    popupMenuManager.addMenuListener(listener);
    popupMenuManager.setRemoveAllWhenShown(true);
    getSite().registerContextMenu(popupMenuManager, getSite().getSelectionProvider());
    Menu menu = popupMenuManager.createContextMenu(tree);
    tree.setMenu(menu);
  }

  private TreeViewerColumn createColumn(String key, TreeColumnLayout layout, int weight, CellLabelProvider provider, boolean resizable,
      int style) {
    TreeViewerColumn viewerCol = new TreeViewerColumn(viewer, style);
    viewerCol.setLabelProvider(provider);
    TreeColumn col = viewerCol.getColumn();
    col.setText(UIPlugin.getLocalString(key));
    col.setWidth(weight);
    col.setResizable(false); // Prevent user from resizing and moving as it doesn't play well with auto layout
    col.setMoveable(false);
    layout.setColumnData(col, new ColumnWeightData(weight, 50, resizable));
    return viewerCol;
  }

  private Action createGoToAction() {
    Action action = new Action(UIPlugin.getLocalString("_UI_Go_to_file")) {
      @Override
      public void run() {
        handleOpen(viewer.getSelection());
      }
    };
    action.setEnabled(false);
    return action;
  }

  private Action createNewAction() {
    Action action = new Action(UIPlugin.getLocalString("_UI_New_PuppetDB_Connection")) {
      @Override
      public void run() {

        Shell shell = getSite().getShell();
        NewPuppetDBClientWizard wizard = new NewPuppetDBClientWizard(puppetDBManager);
        wizard.init(getSite().getWorkbenchWindow().getWorkbench(), null);
        WizardDialog dialog = new WizardDialog(shell, wizard);
        dialog.create();
        if(dialog.open() == Window.OK)
          viewer.setInput(getPuppetDBConnections(viewer, puppetDBManager));
      }
    };
    action.setToolTipText(UIPlugin.getLocalString("_UI_New_PuppetDB_Connection_tooltip"));
    action.setImageDescriptor(ExtendedImageRegistry.INSTANCE.getImageDescriptor(UIPlugin.getInstance().getImage("database_add.png")));
    action.setEnabled(true);
    return action;
  }

  @Override
  public void createPartControl(Composite parent) {
    Composite treeComp = new Composite(parent, SWT.NONE);
    viewer = new TreeViewer(treeComp, SWT.VIRTUAL | SWT.V_SCROLL);
    viewer.setContentProvider(new TreeNodeContentProvider(viewer));
    viewer.addDoubleClickListener(this);
    viewer.getTree().addKeyListener(this);
    ColumnViewerToolTipSupport.enableFor(viewer, ToolTip.NO_RECREATE);

    new OpenAndLinkWithEditorHelper(viewer) {

      @Override
      protected void activate(ISelection selection) {
        final int currentMode = OpenStrategy.getOpenMethod();
        try {
          OpenStrategy.setOpenMethod(OpenStrategy.DOUBLE_CLICK);
          handleOpen(selection);
        }
        finally {
          OpenStrategy.setOpenMethod(currentMode);
        }
      }

      @Override
      protected void linkToEditor(ISelection selection) {
        // not supported by this part
      }

      @Override
      protected void open(ISelection selection, boolean activate) {
        handleOpen(selection);
      }

    };
    viewer.addSelectionChangedListener(this);

    Tree tree = viewer.getTree();

    TreeColumnLayout layout = new TreeColumnLayout();
    treeComp.setLayout(layout);

    tree.setLinesVisible(true);
    tree.setHeaderVisible(true);
    createColumn("_UI_Description_title", layout, 600, new TreeNodeLabelProvider(0), true, LEFT);
    createColumn("_UI_Type_title", layout, 100, new TreeNodeLabelProvider(1), false, LEFT);
    createColumn("_UI_Title_title", layout, 150, new TreeNodeLabelProvider(2), true, LEFT);
    createColumn("_UI_Path_title", layout, 300, new TreeNodeLabelProvider(3), true, LEFT);
    createColumn("_UI_Line_title", layout, 50, new TreeNodeLabelProvider(4), false, RIGHT);
    createColumn("_UI_Timestamp_title", layout, 130, new TreeNodeLabelProvider(5), false, LEFT);
    createActions(tree);
    viewer.setInput(getPuppetDBConnections(viewer, puppetDBManager));
  }

  private Action createRefreshAction() {
    Action action = new Action(UIPlugin.getLocalString("_UI_Refresh_Connections")) {
      @Override
      public void run() {
        viewer.setInput(getPuppetDBConnections(viewer, puppetDBManager));
      }
    };
    action.setToolTipText(UIPlugin.getLocalString("_UI_Refresh_Connections_tooltip"));
    action.setImageDescriptor(ExtendedImageRegistry.INSTANCE.getImageDescriptor(UIPlugin.getInstance().getImage("database_refresh.png")));
    return action;
  }

  private Action createRemoveAction() {
    Action action = new Action(UIPlugin.getLocalString("_UI_Remove_PuppetDB_Connection")) {
      @Override
      public void run() {
        Object first = ((IStructuredSelection) viewer.getSelection()).getFirstElement();
        if(first instanceof PuppetDBConnection) {
          removeClient((PuppetDBConnection) first);
        }
      }
    };
    action.setToolTipText(UIPlugin.getLocalString("_UI_Remove_PuppetDB_Connection_tooltip"));
    action.setImageDescriptor(ExtendedImageRegistry.INSTANCE.getImageDescriptor(UIPlugin.getInstance().getImage("database_delete.png")));
    action.setEnabled(false);
    return action;
  }

  @Override
  public void dispose() {
    viewer.removeDoubleClickListener(this);
    viewer.removeSelectionChangedListener(this);
    super.dispose();
  }

  @Override
  public void doubleClick(DoubleClickEvent event) {
    TreeViewer viewer = (TreeViewer) event.getViewer();
    Object selectedNode = ((IStructuredSelection) event.getSelection()).getFirstElement();
    viewer.setExpandedState(selectedNode, !viewer.getExpandedState(selectedNode));
  }

  private IFile getExistingWorkspaceFile(ISelection selection) {
    if(!(selection instanceof IStructuredSelection))
      return null;
    IStructuredSelection ss = (IStructuredSelection) selection;
    Object elem = ss.getFirstElement();
    if(!(elem instanceof ResourceEvent))
      return null;

    Resource resource = ((ResourceEvent) elem).getResource();
    if(resource == null)
      return null;

    return getExistingWorkspaceFile(resource.getFile());
  }

  private IFile getExistingWorkspaceFile(String pathStr) {
    if(pathStr == null)
      return null;

    // External path might be windows so convert backslash to forward slash
    if(pathStr.indexOf('\\') >= 0)
      pathStr = pathStr.replace('\\', '/');

    for(RegexpSubstitution rxSubst : DEFAULT_WORKSPACE_MAPPINGS) {
      String path = rxSubst.replaceOrNull(pathStr);
      if(path != null) {
        IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(Path.fromPortableString(path));
        if(file.isAccessible())
          return file;
      }
    }
    return null;
  }

  private void handleOpen(ISelection selection) {
    IFile file = getExistingWorkspaceFile(selection);
    if(file == null)
      return;

    IWorkbench wb = PlatformUI.getWorkbench();
    IWorkbenchPage page = wb.getActiveWorkbenchWindow().getActivePage();
    IEditorDescriptor desc = wb.getEditorRegistry().getDefaultEditor(file.getName());
    try {
      IEditorPart part = page.openEditor(new FileEditorInput(file), desc.getId());
      ITextEditor editor = (ITextEditor) part.getAdapter(ITextEditor.class);
      if(editor != null) {
        Resource resource = ((ResourceEvent) ((IStructuredSelection) selection).getFirstElement()).getResource();
        IDocumentProvider documentProvider = editor.getDocumentProvider();
        IDocument document = documentProvider.getDocument(editor.getEditorInput());
        int line = resource.getLine() - 1;
        if(line < 0)
          line = 0;
        editor.selectAndReveal(document.getLineOffset(line), document.getLineLength(line));
      }
    }
    catch(Exception e) {
      UIPlugin.logException("Unable to open editor", e);
    }
  }

  @Override
  public void keyPressed(KeyEvent e) {
  }

  @Override
  public void keyReleased(KeyEvent e) {
    if(e.keyCode == SWT.DEL) {
      Object first = ((IStructuredSelection) viewer.getSelection()).getFirstElement();
      if(first instanceof PuppetDBConnection) {
        removeClient((PuppetDBConnection) first);
      }
    }
  }

  private void removeClient(PuppetDBConnection client) {
    final PuppetDBConnectionPreferences prefs = client.getPreferences();
    Shell shell = viewer.getControl().getShell();
    if(MessageDialog.openConfirm(
      shell, UIPlugin.getLocalString("_UI_Confirm_Removal"),
      UIPlugin.getLocalString("_UI_Is_remove_of_client_ok", prefs.getIdentifier()))) {
      Util.alterPreferences(shell, puppetDBManager, new Callable<Void>() {
        @Override
        public Void call() throws Exception {
          prefs.remove();
          return null;
        }
      });
      viewer.setInput(getPuppetDBConnections(viewer, puppetDBManager));
    }
  }

  @Override
  public void selectionChanged(SelectionChangedEvent event) {
    ISelection selection = event.getSelection();
    if(selection instanceof IStructuredSelection) {
      IStructuredSelection ss = (IStructuredSelection) selection;
      removeAction.setEnabled(ss.getFirstElement() instanceof PuppetDBConnection);
      gotoAction.setEnabled(getExistingWorkspaceFile(selection) != null);
    }
    else {
      removeAction.setEnabled(false);
      gotoAction.setEnabled(false);
    }
  }

  @Override
  public void setFocus() {
    viewer.getControl().setFocus();
  }
}
TOP

Related Classes of com.puppetlabs.geppetto.puppetdb.ui.views.PuppetResourceEventsView

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.