Package org.cfeclipse.cfml.frameworks.views

Source Code of org.cfeclipse.cfml.frameworks.views.FrameworksView$TreeFilter

/*
* Created on Mar 27, 2007 by markdrew
*
* The MIT License
* Copyright (c) 2007 CFEclipse Project
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the Software
* is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package org.cfeclipse.cfml.frameworks.views;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.cfeclipse.cfml.frameworks.FrameworkManager;
import org.cfeclipse.cfml.frameworks.actions.ActionManager;
import org.cfeclipse.cfml.frameworks.actions.IBaseAction;
import org.cfeclipse.cfml.frameworks.dialogs.CSAddBeanDialog;
import org.cfeclipse.cfml.frameworks.dialogs.ViewXMLDialog;
import org.cfeclipse.cfml.frameworks.preferences.ActionsPreferencePage;
import org.cfeclipse.cfml.frameworks.util.FWXImages;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.ide.ResourceUtil;
import org.eclipse.ui.part.*;
import org.eclipse.jface.preference.IPreferenceNode;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.jface.preference.PreferenceManager;
import org.eclipse.jface.preference.PreferenceNode;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.jface.action.*;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.ui.*;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.SWT;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.Path;
import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.output.XMLOutputter;
import org.jdom.xpath.XPath;


/**
* This sample class demonstrates how to plug-in a new
* workbench view. The view shows data obtained from the
* model. The sample creates a dummy model on the fly,
* but a real implementation would connect to the model
* available either in this or another plug-in (e.g. the workspace).
* The view is connected to the model using a content provider.
* <p>
* The view uses a label provider to define how model
* objects should be presented in the view. Each
* view can present the same model objects using
* different labels and icons, if needed. Alternatively,
* a single label provider can be shared between views
* in order to ensure that objects of the same type are
* presented in the same way everywhere.
* <p>
*/

public class FrameworksView extends ViewPart {


 

  private TreeViewer viewer;
  private DrillDownAdapter drillDownAdapter;
  private Action action1;
  private Action action2;
  private Text xmlTextEditor;
  private Action refreshAction;
  private Action viewXMLAction;
 
  //Coldspring actions
  private Action csAddBeanAction;
 
  public static String ID = "org.cfeclipse.cfml.frameworks.views.FrameworksView";
 
  private Action doubleClickAction;
  private ComboViewer comboViewer;
  private IProject currentProject;
  private String currentProjectName = "No Project Selected";
 
  private ActionManager actionManager = new ActionManager();
  Label projLabel;

  private Log viewlog = LogFactory.getLog(FrameworksView.class);
 
  private EditorEventListener eelistener;
 

  private IPartListener2 partListener2 = new IPartListener2() {
    private Log listenerlogger = LogFactory.getLog(IPartListener2.class);
   
      public void partActivated(IWorkbenchPartReference ref) {
     
                if (ref.getPart(true) instanceof IEditorPart) {
                    editorActivated(getViewSite().getPage().getActiveEditor());
                }  
                 
            }

            public void partBroughtToTop(IWorkbenchPartReference ref) {
                   // editorActivated(getViewSite().getPage().getActiveEditor());
            }

            public void partClosed(IWorkbenchPartReference ref) {
              editorActivated(getViewSite().getPage().getActiveEditor());
             
            }

            public void partDeactivated(IWorkbenchPartReference ref) {
              //if we close we want to recheck
             
            }

            public void partOpened(IWorkbenchPartReference ref) {
           //         editorActivated(getViewSite().getPage().getActiveEditor());
            }

            public void partHidden(IWorkbenchPartReference ref) {}

            public void partVisible(IWorkbenchPartReference ref) {
                  //  editorActivated(getViewSite().getPage().getActiveEditor());
            }

            public void partInputChanged(IWorkbenchPartReference ref) {}

    };
  private Text text;
  private TreeFilter treeFilter;
  protected static String fDefaultSearchText = "Type to search";
 
 
   
    public void refreshFrameworkTree(){
      IEditorInput input = getViewSite().getPage().getActiveEditor().getEditorInput();
        IFile file = ResourceUtil.getFile(input);
        if (file != null){
            currentProject = file.getProject();
            currentProjectName = currentProject.getName();
            projLabel.setText(currentProject.getName());
              viewer.setContentProvider(new FrameworksContentProvider(getViewSite(), currentProject, viewer));
              viewer.setLabelProvider( new ViewLabelProvider());
              viewer.expandToLevel(2);
           
       
        }
        BufferedInputStream bit = null;
        JarInputStream bi = null;
        JarEntry je = null;
       
    }

    private void editorActivated(IEditorPart editor) {
      
     
      //if (!getViewSite().getPage().isPartVisible(this))
        //  return;
       
     
     
        if(editor !=null){
         
          IEditorInput input = editor.getEditorInput();
          IFile file = ResourceUtil.getFile(input);
          if (file != null){
           
            if(!file.getProject().getName().equals(currentProjectName)){
             
              System.out.println("setting  the project");
  //            Check if we have changed projects
              currentProject = file.getProject();
              currentProjectName = currentProject.getName();
              projLabel.setText(currentProject.getName());
                viewer.setContentProvider(new FrameworksContentProvider(getViewSite(), currentProject, viewer));
                viewer.expandToLevel(2);
              // 
              // 
             
            }
          }
        }
    }
 
  class NameSorter extends ViewerSorter {
  }

  /**
   * The constructor.
   */
  public FrameworksView() {
   
  }
 
  public void setTreeFilter(String string){
    if(!string.equals(text.getText())) {     
      text.setText(string);
      text.setFocus();
    }
    treeFilter.setSearchText(string);
    viewer.refresh();
    if(string.length() == 0 || string.equals(fDefaultSearchText)){
      text.setText(fDefaultSearchText);
      text.selectAll();
      viewer.collapseAll();
      viewer.expandToLevel(2);
    } else {
      viewer.expandAll();
    }
  }
 
  // Startup and shutdown methods
  public void dispose() {
    getSite().getPage().removePartListener(partListener2);
  }

  private Boolean childrenContainString(TreeParentNode item, String searchStringRegex) {
    if(item.getName().matches(searchStringRegex)) {
      return true;
    }
    if(item.getElement() != null && item.getElement().getAttributes() != null) {     
      Iterator<?> attrs = item.getElement().getAttributes().iterator();
      while(attrs.hasNext()) {
        Attribute attr = (Attribute) attrs.next();
        if(attr.getName().matches(searchStringRegex)) {
          return true;
        }
        if(attr.getValue().matches(searchStringRegex)) {
          return true;
        }
      }
    }
    if(item.hasChildren()) {
      for(TreeParentNode child : item.getChildren()) {
        if(childrenContainString(child,searchStringRegex)) {
          return true;
        }
      }
    }
    return false;
  }
 
  public class TreeFilter extends ViewerFilter {

    private String searchStringRegex;
    private String searchString;

    public void setSearchText(String s) {
      // Search must be a substring of the existing value
      this.searchStringRegex = "(?i)" + s + ".*";
      this.searchString=s;
    }

    @Override
    public boolean select(Viewer viewer, Object parentElement, Object element) {
      if (searchStringRegex == null || searchStringRegex.length() == 0 || searchStringRegex.equals(".*.*")) {
        return true;
      }
      if(element instanceof TreeParentNode) {
        return childrenContainString((TreeParentNode) element, searchStringRegex);
      } else {
        System.err.println("wee");
      }
      return false;
    }
  }
    
   /**
   * This is a callback that will allow us
   * to create the viewer and initialize it.
   */
  public void createPartControl(Composite parent) {
   
    GridLayout layout = new GridLayout();
    layout.numColumns = 1;
    layout.verticalSpacing = 2;
    layout.marginWidth = 0;
    layout.marginHeight = 2;
    parent.setLayout(layout);
   
    //add a label here:
   
    //Create a "label" to display information in. I'm
    //using a text field instead of a lable so you can
    //copy-paste out of it.
    text = new Text(parent, SWT.SEARCH | SWT.ICON_CANCEL);
    // layout the text field above the treeviewer
    GridData layoutData = new GridData();
    layoutData.grabExcessHorizontalSpace = true;
    layoutData.horizontalAlignment = GridData.FILL;
    text.setLayoutData(layoutData);
    text.setText(fDefaultSearchText);
   
    layoutData = new GridData();
    layoutData.grabExcessHorizontalSpace = true;
    layoutData.horizontalAlignment = GridData.FILL;
//    layout the tree viewer below the text field
    projLabel = new Label(parent, SWT.NONE);
    projLabel.setText(currentProjectName);
    projLabel.setLayoutData(layoutData);
   
    layoutData = new GridData();
    layoutData.grabExcessHorizontalSpace = true;
    layoutData.grabExcessVerticalSpace = true;
    layoutData.horizontalAlignment = GridData.FILL;
    layoutData.verticalAlignment = GridData.FILL;   
   
    viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);

    drillDownAdapter = new DrillDownAdapter(viewer);
    viewer.setContentProvider(new FrameworksContentProvider(getViewSite(), currentProject, viewer));
   
    viewer.setLabelProvider( new ViewLabelProvider());
      
    //viewer.setSorter(new NameSorter());
    viewer.setInput(getViewSite());
    viewer.getControl().setLayoutData(layoutData);
    viewer.expandToLevel(2);
   
    treeFilter = new TreeFilter();
    viewer.addFilter(treeFilter);
    text.addSelectionListener(new SelectionAdapter() {
      public void widgetDefaultSelected(SelectionEvent e) {
        if (e.detail == SWT.CANCEL) {
          text.setText(fDefaultSearchText);
          setTreeFilter("");
        }
      }
    });

    text.addFocusListener(new FocusListener(){
      @Override
      public void focusGained(FocusEvent e) {
        if(text.getText().equals(fDefaultSearchText)){
          text.setText("");
        }
      }

      @Override
      public void focusLost(FocusEvent e) {
        if(text.getText().length() == 0){
          text.setText(fDefaultSearchText);
        }
      }
      });

    text.addKeyListener(new KeyAdapter() {
      public void keyReleased(KeyEvent ke) {
        if(ke.keyCode == SWT.ARROW_DOWN) {
          viewer.getTree().setFocus();
        }
        setTreeFilter(text.getText());
      }
    });

    //Add drop capabilities
    //http://www.eclipse.org/articles/Article-Workbench-DND/drag_drop.html
   
    int ops = DND.DROP_COPY | DND.DROP_MOVE;
       Transfer[] transfers = new Transfer[] { GenericTransfer.getInstance()};
       viewer.addDropSupport(ops, transfers, new GenericTreeDropAdapter(viewer));
   
   
   
    //Add a nice big textfield
    GridData layoutData2 = new GridData();
    layoutData2.grabExcessHorizontalSpace = true;
    layoutData2.horizontalAlignment = GridData.FILL;
    layoutData2.heightHint = 80;
    xmlTextEditor = new Text(parent, SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
    xmlTextEditor.setLayoutData(layoutData2);
   
    makeActions();
    hookContextMenu();
    hookDoubleClickAction();
    hookSingleClickAction();
    contributeToActionBars();
   
    //Add listener
    editorActivated(getViewSite().getPage().getActiveEditor());
    getSite().getPage().addPartListener(partListener2);
   
  }

  private void hookSingleClickAction() {
    viewer.addPostSelectionChangedListener(new ISelectionChangedListener(){

      public void selectionChanged(SelectionChangedEvent event) {
        ISelection selection = event.getSelection();
        TreeSelection sel = (TreeSelection)event.getSelection();
        if(sel.getFirstElement() != null){
          TreeNode firstElement = (TreeNode)sel.getFirstElement();
          Element element = firstElement.getElement();
          if(element != null){
           
            XMLOutputter outputter = new XMLOutputter();
            String string = outputter.outputString(element);
            xmlTextEditor.setText(string);
          }
        }
        else {
          xmlTextEditor.setText("");
        }
       
      }});
   
  }

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

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

  private void fillLocalPullDown(IMenuManager manager) {
    manager.add(action1);
    manager.add(new Separator());
    manager.add(action2);
  }

  private void fillContextMenu(IMenuManager manager) {
 
    TreeSelection sel = (TreeSelection)viewer.getSelection();
    if(sel.getFirstElement() instanceof TreeParentNode){
      TreeNode selNode = (TreeNode)sel.getFirstElement();
      //get the virtual XML document for this project
      FrameworksContentProvider contentProvider = (FrameworksContentProvider)viewer.getContentProvider();
      Object[] rightClickActions = actionManager.getRightClickActions(selNode, currentProject, contentProvider.getVirtualDocument());
     
      for (int i = 0; i < rightClickActions.length; i++) {
        manager.add((Action)rightClickActions[i]);
      }
    }
   
    //manager.add(action1);
    manager.add(new Separator());
    manager.add(action2);
   
    //drillDownAdapter.addNavigationActions(manager);
    // Other plug-ins can contribute there actions here
    //manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
  }
 
  private void fillLocalToolBar(IToolBarManager manager) {
    //manager.add(action1);
    //manager.add(action2);
    manager.add(refreshAction);
    manager.add(viewXMLAction);
    //manager.add(new Separator());
    //drillDownAdapter.addNavigationActions(manager);
  }

  private void makeActions() {
   
    csAddBeanAction = new Action(){
      public void run() {
        //showMessage("Executing Add Bean");
       
       
        //CUT
        //try the JDOM in-situ
       
       
        TreeSelection sel = (TreeSelection)viewer.getSelection();
        if(sel.getFirstElement() instanceof TreeParentNode){
          TreeParentNode selNode = (TreeParentNode)sel.getFirstElement();
          if(selNode.getType().equals(FrameworkManager.COLDSPRING)){
            CSAddBeanDialog addDialog = new  CSAddBeanDialog(viewer.getControl().getShell());
         
            if(addDialog.open() == IDialogConstants.OK_ID){
              String id = addDialog.getCfcName().getText();
              String className = addDialog.getCfcExtends().getText();
              System.out.println("Dialog says " + id + " " + className);
              Document document = selNode.getDocument();
              Element child = document.getRootElement();
             
              //Bean Element
              Element newBean = new Element("bean");
              newBean.setAttribute("id", addDialog.getCfcName().getText());
              newBean.setAttribute("class", addDialog.getCfcExtends().getText());
             
             
              child.addContent(newBean);
              XMLOutputter outputter = new XMLOutputter();
              try {
                outputter.output(child, System.out);
              } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
              }
             
             
            }
           
           
           
          }
         
         
        }
       
        //CUT
      }
    };
    csAddBeanAction.setText("Add bean from CFC");
    csAddBeanAction.setToolTipText("Adds a bean to coldspring from a CFC");
    csAddBeanAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
      getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
   
    action1 = new Action() {
      public void run() {
        showMessage("Action 1 executed");
      }
    };
   
    refreshAction = new Action(){
      public void run() {
       //showMessage("some refresh");
      
       
      refreshFrameworkTree();
      
      }
    };
    refreshAction.setImageDescriptor(FWXImages.getImageRegistry().getDescriptor(FWXImages.ICON_REFRESH));
   
   
    viewXMLAction = new Action(){
      public void run() {
       
        ViewXMLDialog vxd = new ViewXMLDialog(getSite().getShell()((FrameworksContentProvider)viewer.getContentProvider()).getVirtualDocument());
        vxd.open();
        // open dialog with just an XML thing
      }
    };
    viewXMLAction.setImageDescriptor(FWXImages.getImageRegistry().getDescriptor(FWXImages.ICON_XML_VIEW));
   
    action1.setText("Action 1");
    action1.setToolTipText("Action 1 tooltip");
    action1.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
      getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
   
    action2 = new Action() {
      public void run() {
       
        TreeSelection sel = (TreeSelection)viewer.getSelection();
        if(sel.getFirstElement() instanceof TreeParentNode){
          TreeParentNode selNode = (TreeParentNode)sel.getFirstElement();
          ActionsPreferencePage page = new ActionsPreferencePage();
          page.setFilter(selNode);
             PreferenceManager mgr = new PreferenceManager();
             IPreferenceNode node = new PreferenceNode("1", page);
             mgr.addToRoot(node);
             PreferenceDialog dialog = new PreferenceDialog(viewer.getControl().getShell(), mgr);
             dialog.create();
             dialog.setMessage(page.getTitle());
             dialog.open();
        }

      }
    };
    action2.setText("Configure...");
    action2.setToolTipText("Configure the actions for this node");
   
    doubleClickAction = new Action() {
      public void run() {
        ISelection selection = viewer.getSelection();
        Object obj = ((IStructuredSelection)selection).getFirstElement();
        showMessage("Double-click detected on "+obj.toString());
      }
    };
  }

  private void hookDoubleClickAction() {
    viewer.addDoubleClickListener(new IDoubleClickListener() {
     
      Log clickLogger = LogFactory.getLog(IDoubleClickListener.class);
     
      public void doubleClick(DoubleClickEvent event) {
        ISelection selection = event.getSelection();
        TreeSelection sel = (TreeSelection)event.getSelection();
       
       
        //loop through selections maybe?
       
        Iterator<?> nodeIterator = sel.iterator();
        while (nodeIterator.hasNext()) {
          Object element = (Object) nodeIterator.next();
          if (element instanceof TreeParentNode) {
            TreeParentNode selNodeItem = (TreeParentNode) element;
            FrameworksContentProvider contentProvider = (FrameworksContentProvider)viewer.getContentProvider();
            Object[] leftClickActions = actionManager.getLeftClickAction(selNodeItem, currentProject, contentProvider.getVirtualDocument());
            for (int i = 0; i < leftClickActions.length; i++) {
              clickLogger.debug("clicked on" + selNodeItem + " got action  "+ leftClickActions[i]);
              IBaseAction action = (IBaseAction)leftClickActions[i];
              action.run();
            }
           
          }
         
        }
       
       
         /*if (sel.getFirstElement() instanceof TreeParentNode){
          
          
          
           TreeParentNode parent = (TreeParentNode)sel.getFirstElement();
           showMessage(parent.getName() + " " + parent.getType());
          
           if(parent.getType().equalsIgnoreCase("framework_cs")){
             }
             else if(parent.getElement().getName().equalsIgnoreCase("include")){
              openIncludeTemplate(parent);
            }
            else if(parent.getElement().getName().equalsIgnoreCase("message")){
             
            }
            else{
              System.out.println(parent.getElement().getName());
            }
            
           
          }
         else if(sel.getFirstElement() instanceof TreeNode){
          TreeNode selNode = (TreeNode)sel.getFirstElement();
         
         
         
        } */
       
        //doubleClickAction.run();
      }

      private void openIncludeTemplate(TreeNode selNode) {
        FrameworksContentProvider contentProvider = (FrameworksContentProvider)viewer.getContentProvider();
        Document csDocument = contentProvider.getDocument(FrameworkManager.COLDSPRING);
         try {
          XPath x  = XPath.newInstance("//bean[@id='modelGlueConfiguration']/property[@name='viewMappings']/value");
          Element viewMapping    = (Element)x.selectSingleNode(csDocument);
       
          String templateFile = selNode.getElement().getAttributeValue("template")
          String pathToTemplateFile = viewMapping.getText().substring(currentProject.getName().length()+1) + "/" + templateFile;
         
         
          IWorkbenchPage page = getSite().getPage();
          IFile file = currentProject.getFile(new Path(pathToTemplateFile));
         
          //Set the path which is project - path;
           IEditorDescriptor desc = PlatformUI.getWorkbench().
              getEditorRegistry().getDefaultEditor(file.getName());
          
           //from http://wiki.eclipse.org/index.php/FAQ_How_do_I_open_an_editor_on_a_file_in_the_workspace%3F
           //to open an editor at a marker/line number
           //IDE.openEditor(page, marker);
          
           try {
            page.openEditor(new FileEditorInput(file),desc.getId());
          } catch (PartInitException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
         
         
         
        } catch (JDOMException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
      }
    });
  }
  private void showMessage(String message) {
    MessageDialog.openInformation(
      viewer.getControl().getShell(),
      "Model Glue",
      message);
  }

  /**
   * Passing the focus request to the viewer's control.
   */
  public void setFocus() {
    viewer.getControl().setFocus();
  }
}
TOP

Related Classes of org.cfeclipse.cfml.frameworks.views.FrameworksView$TreeFilter

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.