View Javadoc
1   /*
2    * Copyright (C) 2007-2012 Argeo GmbH
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  package org.argeo.people.ui.dialogs;
17  
18  import org.eclipse.jface.dialogs.TrayDialog;
19  import org.eclipse.jface.viewers.ColumnLabelProvider;
20  import org.eclipse.jface.viewers.DoubleClickEvent;
21  import org.eclipse.jface.viewers.IDoubleClickListener;
22  import org.eclipse.jface.viewers.ISelectionChangedListener;
23  import org.eclipse.jface.viewers.IStructuredContentProvider;
24  import org.eclipse.jface.viewers.IStructuredSelection;
25  import org.eclipse.jface.viewers.SelectionChangedEvent;
26  import org.eclipse.jface.viewers.TableViewer;
27  import org.eclipse.jface.viewers.TableViewerColumn;
28  import org.eclipse.jface.viewers.Viewer;
29  import org.eclipse.jface.viewers.ViewerFilter;
30  import org.eclipse.swt.SWT;
31  import org.eclipse.swt.events.ModifyEvent;
32  import org.eclipse.swt.events.ModifyListener;
33  import org.eclipse.swt.graphics.Point;
34  import org.eclipse.swt.layout.GridData;
35  import org.eclipse.swt.layout.GridLayout;
36  import org.eclipse.swt.widgets.Composite;
37  import org.eclipse.swt.widgets.Control;
38  import org.eclipse.swt.widgets.Shell;
39  import org.eclipse.swt.widgets.TableColumn;
40  import org.eclipse.swt.widgets.Text;
41  
42  /** Simple dialog to pick up a string value from a list */
43  public class PickUpFromListDialog extends TrayDialog {
44  	private static final long serialVersionUID = 1L;
45  
46  	// this page widgets and UI objects
47  	private TableViewer viewer;
48  	private final MyFilter viewerFilter;
49  	private final String title;
50  
51  	// the displayed strings
52  	private final String[] elements;
53  
54  	private String selectedValue;
55  
56  	public PickUpFromListDialog(Shell parentShell, String title,
57  			String[] elements) {
58  		super(parentShell);
59  		this.title = title;
60  		this.elements = elements;
61  		viewerFilter = new MyFilter();
62  	}
63  
64  	protected Point getInitialSize() {
65  		return new Point(250, 400);
66  	}
67  
68  	protected Control createDialogArea(Composite parent) {
69  		Composite dialogArea = (Composite) super.createDialogArea(parent);
70  		dialogArea.setLayout(new GridLayout());
71  
72  		Text txtFilter = new Text(dialogArea, SWT.BORDER | SWT.SEARCH
73  				| SWT.ICON_SEARCH | SWT.ICON_CANCEL);
74  		txtFilter
75  				.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
76  		txtFilter.addModifyListener(new ModifyListener() {
77  			private static final long serialVersionUID = 1L;
78  
79  			public void modifyText(ModifyEvent event) {
80  				Text text = (Text) event.widget;
81  				viewerFilter.setText(text.getText());
82  				viewer.refresh();
83  			}
84  		});
85  
86  		createViewer(dialogArea);
87  
88  		viewer.setInput("init");
89  
90  		// Add listeners
91  		viewer.addDoubleClickListener(new MyDoubleClickListener());
92  		viewer.addSelectionChangedListener(new MySelectionChangedListener());
93  
94  		parent.pack();
95  		return dialogArea;
96  	}
97  
98  	private void createViewer(Composite parent) {
99  		int style = SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL;
100 		viewer = new TableViewer(parent, style);
101 		viewer.setContentProvider(new MyProvider());
102 		createColumn();
103 		viewer.addFilter(viewerFilter);
104 		viewer.getTable().setHeaderVisible(false);
105 		GridData tableData = new GridData(SWT.FILL, SWT.FILL, true, true);
106 		viewer.getTable().setLayoutData(tableData);
107 	}
108 
109 	private TableViewerColumn createColumn() {
110 		TableViewerColumn result = new TableViewerColumn(viewer, SWT.NONE);
111 		result.setLabelProvider(new ColumnLabelProvider());
112 		TableColumn column = result.getColumn();
113 		column.setWidth(170);
114 		column.setMoveable(true);
115 		return result;
116 	}
117 
118 	private class MyProvider implements IStructuredContentProvider {
119 		private static final long serialVersionUID = 1L;
120 
121 		public Object[] getElements(Object inputElement) {
122 			return PickUpFromListDialog.this.elements;
123 		}
124 
125 		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
126 		}
127 
128 		public void dispose() {
129 			// do nothing
130 		}
131 	}
132 
133 	public String getSelected() {
134 		return selectedValue;
135 	}
136 
137 	protected void configureShell(Shell shell) {
138 		super.configureShell(shell);
139 		shell.setText(title);
140 	}
141 
142 	private static final class MyFilter extends ViewerFilter {
143 		private static final long serialVersionUID = 1L;
144 		private String text;
145 
146 		public void setText(final String string) {
147 			text = string;
148 		}
149 
150 		@Override
151 		public boolean select(Viewer viewer, Object parentElement,
152 				Object element) {
153 			boolean result = true;
154 			String person = (String) element;
155 			if (text != null && text.length() > 0) {
156 				String personText = person.toLowerCase();
157 				result = personText.indexOf(text.toLowerCase()) != -1;
158 			}
159 			return result;
160 		}
161 
162 		@Override
163 		public boolean isFilterProperty(Object element, String prop) {
164 			return true;
165 		}
166 	}
167 
168 	class MySelectionChangedListener implements ISelectionChangedListener {
169 		@Override
170 		public void selectionChanged(SelectionChangedEvent event) {
171 			if (event.getSelection().isEmpty()) {
172 				selectedValue = "";
173 				return;
174 			}
175 
176 			Object obj = ((IStructuredSelection) event.getSelection())
177 					.getFirstElement();
178 			if (obj instanceof String) {
179 				selectedValue = (String) obj;
180 			}
181 		}
182 	}
183 
184 	class MyDoubleClickListener implements IDoubleClickListener {
185 		public void doubleClick(DoubleClickEvent evt) {
186 			if (evt.getSelection().isEmpty()) {
187 				selectedValue = "";
188 				return;
189 			}
190 
191 			Object obj = ((IStructuredSelection) evt.getSelection())
192 					.getFirstElement();
193 			if (obj instanceof String) {
194 				selectedValue = (String) obj;
195 			}
196 			okPressed();
197 		}
198 	}
199 }