package org.insightech.er.editor; import org.eclipse.gef.ui.parts.TreeViewer; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.text.AbstractInformationControl; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusAdapter; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Point; 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.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.IEditorPart; import org.insightech.er.editor.model.ERDiagram; import org.insightech.er.editor.model.ERModelUtil; import org.insightech.er.editor.view.outline.ERDiagramOutlinePage; public class ErDiagramInformationControl extends AbstractInformationControl { private ERDiagramOutlinePage outline; private Text search; private ERDiagram diagram; public ErDiagramInformationControl(ERDiagram diagram, Shell shell, Control composite) { super(shell, true); this.diagram = diagram; create(); int width = 300; int height = 300; Point loc = composite.toDisplay(0, 0); Point size = composite.getSize(); int x = (size.x - width) / 2 + loc.x; int y = (size.y - height) / 2 + loc.y; setSize(width, height); setLocation(new Point(x, y)); addFocusListener(new FocusAdapter() { @Override public void focusLost(FocusEvent e) { dispose(); } }); } @Override protected void createContent(Composite parent) { Color foreground = parent.getShell().getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND); Color background = parent.getShell().getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND); Composite composite = new Composite(parent, SWT.NULL); composite.setLayout(new GridLayout(1, false)); composite.setForeground(foreground); composite.setBackground(background); search = new Text(composite, SWT.NONE); search.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); search.setForeground(foreground); search.setBackground(background); new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL) .setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Dialog.applyDialogFont(search); search.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); search.addModifyListener(new ModifyListener(){ public void modifyText(ModifyEvent e) { String filterText = search.getText(); outline.setFilterText(filterText); } }); search.addKeyListener(new KeyAdapter(){ @Override public void keyReleased(KeyEvent e) { if(e.keyCode == SWT.CR){ selectAndDispose(); } if(e.keyCode == SWT.ARROW_UP){ outline.getControl().setFocus(); } if(e.keyCode == SWT.ARROW_DOWN){ outline.getControl().setFocus(); } } }); Composite treeArea = new Composite(composite, SWT.NULL); treeArea.setLayout(new FillLayout()); treeArea.setLayoutData(new GridData(GridData.FILL_BOTH)); outline = new ERDiagramOutlinePage(diagram); outline.setQuickMode(true); IEditorPart activeEditor = ((ERDiagramMultiPageEditor) ERModelUtil.getActiveEditor()).getActiveEditor(); if (activeEditor instanceof EROneDiagramEditor) { EROneDiagramEditor editor = (EROneDiagramEditor) activeEditor; outline.setCategory(editor.getDefaultEditDomain(), editor.getGraphicalViewer(), null, editor.getDefaultActionRegistry()); } else { ERDiagramEditor editor = (ERDiagramEditor) activeEditor; outline.setCategory(editor.getDefaultEditDomain(), editor.getGraphicalViewer(), null, editor.getDefaultActionRegistry()); } outline.createControl(treeArea); outline.update(); // treeViewer.getControl() // outline.getViewer().expandAll(); // outline.setSelect(false); outline.getViewer().getControl().setForeground(foreground); outline.getViewer().getControl().setBackground(background); outline.getViewer().getControl().addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { if(e.keyCode == SWT.CR){ selectAndDispose(); } } }); TreeViewer treeViewer = (TreeViewer) outline.getViewer(); Tree tree = (Tree) treeViewer.getControl(); expand(tree.getItems()); // outline.getViewer().addDoubleClickListener(new IDoubleClickListener() { // public void doubleClick(DoubleClickEvent event) { // selectAndDispose(); // } // }); } private void selectAndDispose(){ outline.selectSelection(); dispose(); } private void expand(TreeItem[] items) { for (int i = 0; i < items.length; i++) { expand(items[i].getItems()); items[i].setExpanded(true); } } @Override public void setVisible(boolean visible){ super.setVisible(visible); search.setFocus(); } public boolean hasContents() { return true; } }