1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.hierarchyviewerlib.ui; 18 19 import com.android.hierarchyviewerlib.HierarchyViewerDirector; 20 import com.android.hierarchyviewerlib.models.TreeViewModel; 21 import com.android.hierarchyviewerlib.models.TreeViewModel.ITreeChangeListener; 22 23 import org.eclipse.swt.SWT; 24 import org.eclipse.swt.events.DisposeEvent; 25 import org.eclipse.swt.events.DisposeListener; 26 import org.eclipse.swt.events.ModifyEvent; 27 import org.eclipse.swt.events.ModifyListener; 28 import org.eclipse.swt.events.SelectionEvent; 29 import org.eclipse.swt.events.SelectionListener; 30 import org.eclipse.swt.layout.GridData; 31 import org.eclipse.swt.layout.GridLayout; 32 import org.eclipse.swt.widgets.Composite; 33 import org.eclipse.swt.widgets.Display; 34 import org.eclipse.swt.widgets.Label; 35 import org.eclipse.swt.widgets.Slider; 36 import org.eclipse.swt.widgets.Text; 37 38 public class TreeViewControls extends Composite implements ITreeChangeListener { 39 40 private Text mFilterText; 41 42 private Slider mZoomSlider; 43 44 public TreeViewControls(Composite parent) { 45 super(parent, SWT.NONE); 46 GridLayout layout = new GridLayout(5, false); 47 layout.marginWidth = layout.marginHeight = 2; 48 layout.verticalSpacing = layout.horizontalSpacing = 4; 49 setLayout(layout); 50 51 Label filterLabel = new Label(this, SWT.NONE); 52 filterLabel.setText("Filter by class or id:"); 53 filterLabel.setLayoutData(new GridData(GridData.BEGINNING, GridData.CENTER, false, true)); 54 55 mFilterText = new Text(this, SWT.LEFT | SWT.SINGLE); 56 mFilterText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); 57 mFilterText.addModifyListener(mFilterTextModifyListener); 58 mFilterText.setText(HierarchyViewerDirector.getDirector().getFilterText()); 59 60 Label smallZoomLabel = new Label(this, SWT.NONE); 61 smallZoomLabel.setText(" 20%"); 62 smallZoomLabel 63 .setLayoutData(new GridData(GridData.BEGINNING, GridData.CENTER, false, true)); 64 65 mZoomSlider = new Slider(this, SWT.HORIZONTAL); 66 GridData zoomSliderGridData = new GridData(GridData.CENTER, GridData.CENTER, false, false); 67 zoomSliderGridData.widthHint = 190; 68 mZoomSlider.setLayoutData(zoomSliderGridData); 69 mZoomSlider.setMinimum((int) (TreeViewModel.MIN_ZOOM * 10)); 70 mZoomSlider.setMaximum((int) (TreeViewModel.MAX_ZOOM * 10 + 1)); 71 mZoomSlider.setThumb(1); 72 mZoomSlider.setSelection((int) Math.round(TreeViewModel.getModel().getZoom() * 10)); 73 74 mZoomSlider.addSelectionListener(mZoomSliderSelectionListener); 75 76 Label largeZoomLabel = new Label(this, SWT.NONE); 77 largeZoomLabel 78 .setLayoutData(new GridData(GridData.BEGINNING, GridData.CENTER, false, true)); 79 largeZoomLabel.setText("200%"); 80 81 addDisposeListener(mDisposeListener); 82 83 TreeViewModel.getModel().addTreeChangeListener(this); 84 } 85 86 private DisposeListener mDisposeListener = new DisposeListener() { 87 @Override 88 public void widgetDisposed(DisposeEvent e) { 89 TreeViewModel.getModel().removeTreeChangeListener(TreeViewControls.this); 90 } 91 }; 92 93 private SelectionListener mZoomSliderSelectionListener = new SelectionListener() { 94 private int oldValue; 95 96 @Override 97 public void widgetDefaultSelected(SelectionEvent e) { 98 // pass 99 } 100 101 @Override 102 public void widgetSelected(SelectionEvent e) { 103 int newValue = mZoomSlider.getSelection(); 104 if (oldValue != newValue) { 105 TreeViewModel.getModel().removeTreeChangeListener(TreeViewControls.this); 106 TreeViewModel.getModel().setZoom(newValue / 10.0); 107 TreeViewModel.getModel().addTreeChangeListener(TreeViewControls.this); 108 oldValue = newValue; 109 } 110 } 111 }; 112 113 private ModifyListener mFilterTextModifyListener = new ModifyListener() { 114 @Override 115 public void modifyText(ModifyEvent e) { 116 HierarchyViewerDirector.getDirector().filterNodes(mFilterText.getText()); 117 } 118 }; 119 120 @Override 121 public void selectionChanged() { 122 // pass 123 } 124 125 @Override 126 public void treeChanged() { 127 Display.getDefault().syncExec(new Runnable() { 128 @Override 129 public void run() { 130 if (TreeViewModel.getModel().getTree() != null) { 131 mZoomSlider.setSelection((int) Math 132 .round(TreeViewModel.getModel().getZoom() * 10)); 133 } 134 mFilterText.setText(""); //$NON-NLS-1$ 135 } 136 }); 137 } 138 139 @Override 140 public void viewportChanged() { 141 // pass 142 } 143 144 @Override 145 public void zoomChanged() { 146 Display.getDefault().syncExec(new Runnable() { 147 @Override 148 public void run() { 149 mZoomSlider.setSelection((int) Math.round(TreeViewModel.getModel().getZoom() * 10)); 150 } 151 }); 152 }; 153 } 154