package net.sf.colorer.eclipse.view; import java.util.Enumeration; import java.util.Hashtable; import java.util.Vector; import net.sf.colorer.FileType; import net.sf.colorer.HRCParser; import net.sf.colorer.Region; import net.sf.colorer.eclipse.ColorerPlugin; import net.sf.colorer.eclipse.ImageStore; import net.sf.colorer.eclipse.Messages; import net.sf.colorer.eclipse.PreferencePage; import net.sf.colorer.eclipse.jface.TextColorer; import net.sf.colorer.handlers.LineRegion; import net.sf.colorer.handlers.RegionMapper; import net.sf.colorer.handlers.StyledRegion; import net.sf.colorer.impl.Logger; import net.sf.colorer.swt.dialog.ResourceManager; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.BusyIndicator; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.ui.IActionBars; import org.eclipse.ui.ISelectionListener; import org.eclipse.ui.part.ViewPart; /** * This view represents all HRC regions in a tree-like form, * allowing to navigate them and discover their relation. */ public class HRCRegionsTreeView extends ViewPart implements IPropertyChangeListener { private Composite composite; private TreeViewer treeViewer; private HRCParser hrcParser; private Action refreshAction, loadAllAction, linkToEditorAction; private IPreferenceStore prefStore; RegionMapper regionMapper; StyledRegion def_Text; Label fg_label, bg_label; Color foreColor, backColor; ISelectionListener thisSelectionListener = new ISelectionListener (){ public void selectionChanged(org.eclipse.ui.IWorkbenchPart part,ISelection selection){ TextColorer activeEditor = null; if (Logger.TRACE){ Logger.trace("RegionsTree", "selection changed:"+part); } activeEditor = (TextColorer)part.getAdapter(TextColorer.class); if (activeEditor != null && linkToEditorAction.isChecked()){ LineRegion lr = activeEditor.getCaretRegion(); if (lr == null || lr.region == null) return; treeViewer.expandToLevel(lr.region, 0); treeViewer.setSelection(new StructuredSelection(lr.region), true); if (Logger.TRACE){ Logger.trace("RegionsTree", "selected:"+lr.region); } } } }; /** * The view constructor. */ public HRCRegionsTreeView() { } /** * This is a callback that will allow us * to create the viewer and initialize it. */ public void createPartControl(Composite parent) { prefStore = ColorerPlugin.getDefault().getPreferenceStore(); prefStore.addPropertyChangeListener(this); composite = createComposite(parent); makeActions(); contributeToActionBars(); getSite().getWorkbenchWindow().getSelectionService().addPostSelectionListener(thisSelectionListener); propertyChange(null); } public void propertyChange(PropertyChangeEvent event) { if (regionMapper != null){ regionMapper.dispose(); regionMapper = null; } try{ regionMapper = ColorerPlugin.getDefaultPF(). createStyledMapper(StyledRegion.HRD_RGB_CLASS, prefStore.getString(PreferencePage.HRD_SET)); }catch(Exception e){ if (Logger.ERROR){ Logger.error("HRCRegionsTreeView", "createStyledMapper:", e); } } def_Text = (StyledRegion)regionMapper.getRegionDefine("def:Text"); } Composite createComposite(Composite parent){ Composite composite = new Composite(parent, SWT.NONE); composite.setLayout(new GridLayout(1, true)); { final Composite composite_1 = new Composite(composite, SWT.NONE); composite_1.setLayout(new FillLayout()); composite_1.setLayoutData(new GridData(GridData.FILL_BOTH)); treeViewer = new TreeViewer(composite_1, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); treeViewer.setContentProvider(new RegionContentProvider()); treeViewer.setLabelProvider(new RegionTreeLabelProvider()); hrcParser = ColorerPlugin.getDefaultPF().getHRCParser(); treeViewer.setInput(hrcParser); treeViewer.addDoubleClickListener(new IDoubleClickListener(){ public void doubleClick(DoubleClickEvent event) { Region sel = getSelectedRegion(event.getSelection()); if (sel == null){ return; } Logger.trace("doubleClick", sel); if (treeViewer.getExpandedState(sel)){ treeViewer.collapseToLevel(sel, 1); }else{ treeViewer.expandToLevel(sel, 1); } } }); treeViewer.addPostSelectionChangedListener(new ISelectionChangedListener(){ public void selectionChanged(SelectionChangedEvent event) { Region sel = getSelectedRegion(event.getSelection()); if (sel == null){ return; } StyledRegion sr = (StyledRegion)regionMapper.getRegionDefine(sel); foreColor = ResourceManager.newColor(def_Text.fore); backColor = ResourceManager.newColor(def_Text.back); if (sr != null){ if (sr.bfore){ foreColor.dispose(); foreColor = ResourceManager.newColor(sr.fore); } if (sr.bback){ backColor.dispose(); backColor = ResourceManager.newColor(sr.back); } } fg_label.setForeground(backColor); fg_label.setBackground(foreColor); bg_label.setForeground(foreColor); bg_label.setBackground(backColor); } }); } { final Composite composite_1 = new Composite(composite, SWT.BORDER); composite_1.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); final GridLayout gridLayout = new GridLayout(); gridLayout.numColumns = 3; composite_1.setLayout(gridLayout); { fg_label = new Label(composite_1, SWT.BORDER | SWT.CENTER | SWT.VERTICAL); final GridData gridData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_CENTER | GridData.VERTICAL_ALIGN_FILL); gridData.verticalSpan = 2; gridData.heightHint = 30; fg_label.setLayoutData(gridData); fg_label.setBackground(ResourceManager.getColor(SWT.COLOR_WHITE)); fg_label.setText("Foreground"); } { bg_label = new Label(composite_1, SWT.BORDER | SWT.CENTER | SWT.VERTICAL); bg_label.setBackground(ResourceManager.getColor(SWT.COLOR_WHITE)); final GridData gridData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_CENTER | GridData.VERTICAL_ALIGN_FILL); gridData.verticalSpan = 2; gridData.heightHint = 30; bg_label.setLayoutData(gridData); bg_label.setText("Background"); } /* { final Button button = new Button(composite_1, SWT.NONE); button.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); final GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL); gridData.verticalSpan = 2; button.setLayoutData(gridData); button.setText("<- restore"); } { final Label label = new Label(composite_1, SWT.BORDER); label.setBackground(ResourceManager.getColor(SWT.COLOR_WHITE)); final GridData gridData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_CENTER | GridData.VERTICAL_ALIGN_FILL); gridData.verticalSpan = 2; label.setLayoutData(gridData); label.setText("stored color"); } */ } /* { final Button button = new Button(composite, SWT.NONE); button.setText("Save HRD As..."); button.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_END)); } */ return composite; } Region getSelectedRegion(ISelection selection){ if (selection instanceof StructuredSelection){ StructuredSelection sel = (StructuredSelection)selection; if (sel.isEmpty()){ return null; } Region region = (Region)sel.getFirstElement(); return region; } return null; } private void contributeToActionBars() { IActionBars bars = getViewSite().getActionBars(); //fillLocalPullDown(bars.getMenuManager()); fillLocalToolBar(bars.getToolBarManager()); } private void fillLocalToolBar(IToolBarManager manager) { manager.add(refreshAction); manager.add(loadAllAction); manager.add(linkToEditorAction); } private void makeActions() { refreshAction = new Action("Refresh", ImageStore.getID("regions-tree-refresh")) { public void run() { hrcParser = ColorerPlugin.getDefaultPF().getHRCParser(); treeViewer.setInput(hrcParser); } }; refreshAction.setToolTipText(Messages.get("regions-tree.refresh")); loadAllAction = new Action("Load All", ImageStore.getID("regions-tree-loadall")) { public void run() { BusyIndicator.showWhile(treeViewer.getTree().getDisplay(), new Runnable(){ public void run() { for(Enumeration e = hrcParser.enumerateFileTypes(); e.hasMoreElements();){ FileType ft = (FileType)e.nextElement(); ft.getBaseScheme(); } refreshAction.run(); } }); } }; loadAllAction.setToolTipText(Messages.get("regions-tree.loadall")); linkToEditorAction = new Action("Link", Action.AS_CHECK_BOX){ public void run() { prefStore.setValue("RegionsTree.Link", isChecked()); } }; linkToEditorAction.setImageDescriptor(ImageStore.getID("regions-tree-link")); linkToEditorAction.setToolTipText(Messages.get("regions-tree.link")); linkToEditorAction.setChecked(prefStore.getBoolean("RegionsTree.Link")); } /** * Passing the focus request to the viewer's control. */ public void setFocus() { composite.setFocus(); } public void dispose() { if (foreColor != null){ foreColor.dispose(); } if (backColor != null){ backColor.dispose(); } regionMapper.dispose(); getSite().getWorkbenchWindow().getSelectionService().removePostSelectionListener(thisSelectionListener); prefStore.removePropertyChangeListener(this); super.dispose(); } } class RegionContentProvider implements ITreeContentProvider { HRCParser hp; Hashtable children = new Hashtable(); public void dispose() { children = null; } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { hp = (HRCParser)newInput; children.clear(); } public Object[] getElements(Object inputElement) { children.clear(); HRCParser hp = (HRCParser)inputElement; if (inputElement instanceof HRCParser){ Vector list = new Vector(); int idx = 1; while(true){ Region region = hp.getRegion(idx); Logger.trace("RegionsTree", "Region: "+region); if (region == null){ break; } if (region.getParent() == null){ list.add(region); }else{ addChild(region.getParent(), region); } idx++; } return list.toArray(); }else{ return null; } } void addChild(Region parent, Region child){ Vector list = (Vector)children.get(parent); if (list == null){ list = new Vector(); children.put(parent, list); } list.add(child); } public Object[] getChildren(Object parentElement) { Vector list = (Vector)children.get(parentElement); if (list == null){ return null; }else{ return list.toArray(); } } public Object getParent(Object element) { return ((Region)element).getParent(); } public boolean hasChildren(Object element) { Vector list = (Vector)children.get(element); return list != null; } } class RegionTreeLabelProvider extends LabelProvider { public String getText(Object element) { if (element instanceof Region){ Region reg = (Region)element; if (reg.getDescription() == null){ return reg.getName(); }else{ return reg.getName() + " - " + reg.getDescription(); } }else{ return super.getText(element); } } } /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (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.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is the Colorer Library * * The Initial Developer of the Original Code is * Igor Russkih <irusskih at gmail dot com>. * Portions created by the Initial Developer are Copyright (C) 1999-2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */