1 package org.simantics.modeling.adapters;
\r
3 import org.eclipse.jface.dialogs.IDialogConstants;
\r
4 import org.eclipse.jface.dialogs.MessageDialog;
\r
5 import org.eclipse.jface.layout.GridDataFactory;
\r
6 import org.eclipse.jface.layout.GridLayoutFactory;
\r
7 import org.eclipse.jface.layout.TableColumnLayout;
\r
8 import org.eclipse.jface.resource.ImageDescriptor;
\r
9 import org.eclipse.jface.resource.JFaceResources;
\r
10 import org.eclipse.jface.resource.LocalResourceManager;
\r
11 import org.eclipse.jface.viewers.ColumnLabelProvider;
\r
12 import org.eclipse.jface.viewers.ColumnWeightData;
\r
13 import org.eclipse.jface.viewers.ISelectionChangedListener;
\r
14 import org.eclipse.jface.viewers.IStructuredContentProvider;
\r
15 import org.eclipse.jface.viewers.IStructuredSelection;
\r
16 import org.eclipse.jface.viewers.SelectionChangedEvent;
\r
17 import org.eclipse.jface.viewers.TableViewer;
\r
18 import org.eclipse.jface.viewers.TableViewerColumn;
\r
19 import org.eclipse.jface.viewers.Viewer;
\r
20 import org.eclipse.swt.SWT;
\r
21 import org.eclipse.swt.dnd.Clipboard;
\r
22 import org.eclipse.swt.dnd.TextTransfer;
\r
23 import org.eclipse.swt.dnd.Transfer;
\r
24 import org.eclipse.swt.events.SelectionAdapter;
\r
25 import org.eclipse.swt.events.SelectionEvent;
\r
26 import org.eclipse.swt.graphics.Color;
\r
27 import org.eclipse.swt.graphics.Image;
\r
28 import org.eclipse.swt.layout.GridData;
\r
29 import org.eclipse.swt.widgets.Button;
\r
30 import org.eclipse.swt.widgets.Composite;
\r
31 import org.eclipse.swt.widgets.Control;
\r
32 import org.eclipse.swt.widgets.Label;
\r
33 import org.eclipse.swt.widgets.Shell;
\r
34 import org.eclipse.swt.widgets.Text;
\r
35 import org.simantics.utils.strings.EString;
\r
38 * @author Tuukka Lehtonen
\r
40 public class RemoveInstancesDialog extends MessageDialog {
\r
42 public static class Content {
\r
43 public String label;
\r
44 public ImageDescriptor image;
\r
45 public String details;
\r
47 public Content(String label) {
\r
48 assert label != null;
\r
53 public String toString() {
\r
54 if (details == null)
\r
56 return label + "\nDetails: " + details;
\r
60 protected String message;
\r
61 protected boolean hasDetails;
\r
63 protected Content[] content;
\r
65 protected LocalResourceManager resourceManager;
\r
66 protected Composite tableAndButtons;
\r
67 protected Text messageText;
\r
68 protected Text detailsText;
\r
69 private GridData detailsGridData;
\r
71 public RemoveInstancesDialog(Shell parentShell, String dialogTitle, String dialogMessage, Content[] content) {
\r
75 MessageDialog.QUESTION,
\r
77 IDialogConstants.PROCEED_LABEL,
\r
78 IDialogConstants.CANCEL_LABEL
\r
84 public RemoveInstancesDialog(Shell parentShell, String dialogTitle, String dialogMessage, int dialogType, String[] buttons, int defaultIndex, Content[] content) {
\r
93 this.message = dialogMessage;
\r
94 this.content = content;
\r
95 this.hasDetails = contentHasDetails(content);
\r
98 private boolean contentHasDetails(Content[] content) {
\r
99 for (Content c : content) {
\r
100 if (c.details != null && !c.details.trim().isEmpty())
\r
107 protected int getShellStyle() {
\r
108 return super.getShellStyle() | SWT.RESIZE;
\r
112 protected Control createDialogArea(Composite parent) {
\r
113 resourceManager = new LocalResourceManager(JFaceResources.getResources(), parent);
\r
114 Composite composite = (Composite) super.createDialogArea(parent);
\r
119 protected Control createMessageArea(Composite composite) {
\r
120 super.createMessageArea(composite);
\r
122 if (message != null) {
\r
123 messageText = new Text(composite, getMessageLabelStyle());
\r
124 messageText.setText(message);
\r
125 messageText.setEditable(false);
\r
128 .align(SWT.FILL, SWT.BEGINNING)
\r
131 convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH),
\r
132 SWT.DEFAULT).applyTo(messageText);
\r
138 protected Control createCustomArea(Composite parent) {
\r
139 tableAndButtons = new Composite(parent, 0);
\r
140 GridDataFactory.fillDefaults().grab(true, true).applyTo(tableAndButtons);
\r
141 GridLayoutFactory.fillDefaults().numColumns(2).applyTo(tableAndButtons);
\r
143 Label uses = new Label(tableAndButtons, 0);
\r
144 uses.setText("Instances:");
\r
145 GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo(uses);
\r
147 TableColumnLayout ad = new TableColumnLayout();
\r
148 Composite tableComposite = new Composite(tableAndButtons, SWT.NONE);
\r
149 GridDataFactory.fillDefaults().grab(true, true).minSize(300, 300).applyTo(tableComposite);
\r
150 tableComposite.setLayout(ad);
\r
151 TableViewer viewer = new TableViewer(tableComposite, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER | SWT.FULL_SELECTION);
\r
152 viewer.setContentProvider(new CP());
\r
153 TableViewerColumn c1 = new TableViewerColumn(viewer, SWT.LEFT);
\r
154 c1.setLabelProvider(new LP());
\r
155 ad.setColumnData(c1.getColumn(), new ColumnWeightData(100, 100, true));
\r
157 Composite buttons = new Composite(tableAndButtons, 0);
\r
158 GridDataFactory.fillDefaults().grab(false, true).applyTo(buttons);
\r
159 GridLayoutFactory.fillDefaults().numColumns(1).applyTo(buttons);
\r
161 Button copyButton = new Button(buttons, SWT.PUSH);
\r
162 copyButton.setText("&Copy to Clipboard");
\r
163 copyButton.setToolTipText("Copy List Contents to Clipboard");
\r
164 copyButton.addSelectionListener(new SelectionAdapter() {
\r
166 public void widgetSelected(SelectionEvent e) {
\r
167 String text = EString.implode(content, String.format("%n"));
\r
168 Clipboard cp = new Clipboard(e.display);
\r
169 cp.setContents(new Object[] { text }, new Transfer[] { TextTransfer.getInstance() });
\r
174 // Button navigateButton = new Button(buttons, SWT.PUSH);
\r
175 // navigateButton.setText("Go To");
\r
176 // navigateButton.setToolTipText("Go To Selected Instances");
\r
178 detailsText = new Text(tableAndButtons, SWT.BORDER | SWT.WRAP | SWT.MULTI | SWT.V_SCROLL);
\r
179 Color bg = detailsText.getBackground();
\r
180 detailsText.setEditable(false);
\r
181 detailsText.setBackground(bg);
\r
182 detailsGridData = GridDataFactory.fillDefaults().grab(true, false).hint(SWT.DEFAULT, 100).span(2, 1).create();
\r
183 detailsText.setLayoutData(detailsGridData);
\r
185 viewer.addSelectionChangedListener(new ISelectionChangedListener() {
\r
187 public void selectionChanged(SelectionChangedEvent event) {
\r
188 IStructuredSelection sel = (IStructuredSelection) event.getSelection();
\r
189 Content content = (Content)(sel.getFirstElement());
\r
190 showDetails(content);
\r
193 viewer.setInput(content);
\r
195 detailsText.getDisplay().asyncExec(new Runnable() {
\r
197 public void run() {
\r
201 return tableAndButtons;
\r
204 protected void showDetails(Content content) {
\r
205 if (detailsText == null || detailsText.isDisposed())
\r
207 if (content != null && content.details != null) {
\r
208 detailsText.setText(content.details);
\r
209 if (detailsGridData.exclude) {
\r
210 detailsGridData.exclude = false;
\r
211 detailsGridData.heightHint = 100;
\r
212 tableAndButtons.layout(true, true);
\r
215 detailsText.setText("");
\r
216 if (!detailsGridData.exclude) {
\r
217 detailsGridData.exclude = true;
\r
218 detailsGridData.heightHint = 0;
\r
219 detailsText.setSize(0, 0);
\r
220 tableAndButtons.layout(true, true);
\r
225 protected class CP implements IStructuredContentProvider {
\r
228 public void dispose() {
\r
232 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
\r
236 public Object[] getElements(Object inputElement) {
\r
242 protected class LP extends ColumnLabelProvider {
\r
244 public Image getImage(Object element) {
\r
245 Content content = (Content) element;
\r
246 return content.image != null ? (Image) resourceManager.get(content.image) : null;
\r
249 public String getText(Object element) {
\r
250 Content content = (Content) element;
\r
251 return content.label;
\r