package org.reldb.dbrowser.ui.content.rel; import java.util.HashMap; import java.util.Vector; import java.util.function.Predicate; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabFolder2Adapter; import org.eclipse.swt.custom.CTabFolderEvent; import org.eclipse.swt.events.MenuDetectEvent; import org.eclipse.swt.events.MenuDetectListener; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.reldb.dbrowser.ui.DbConnection; import org.reldb.dbrowser.ui.DbTab; import org.reldb.dbrowser.ui.IconLoader; import org.reldb.dbrowser.ui.RevDatabase; import org.reldb.dbrowser.ui.content.rel.constraint.ConstraintCreator; import org.reldb.dbrowser.ui.content.rel.constraint.ConstraintDesigner; import org.reldb.dbrowser.ui.content.rel.constraint.ConstraintDropper; import org.reldb.dbrowser.ui.content.rel.constraint.ConstraintPlayer; import org.reldb.dbrowser.ui.content.rel.operator.OperatorCreator; import org.reldb.dbrowser.ui.content.rel.operator.OperatorDesigner; import org.reldb.dbrowser.ui.content.rel.operator.OperatorDropper; import org.reldb.dbrowser.ui.content.rel.operator.OperatorPlayer; import org.reldb.dbrowser.ui.content.rel.query.QueryCreator; import org.reldb.dbrowser.ui.content.rel.query.QueryDesigner; import org.reldb.dbrowser.ui.content.rel.query.QueryDropper; import org.reldb.dbrowser.ui.content.rel.query.QueryPlayer; import org.reldb.dbrowser.ui.content.rel.script.ScriptCreator; import org.reldb.dbrowser.ui.content.rel.script.ScriptDesigner; import org.reldb.dbrowser.ui.content.rel.script.ScriptDropper; import org.reldb.dbrowser.ui.content.rel.script.ScriptPlayer; import org.reldb.dbrowser.ui.content.rel.script.ScriptRenamer; import org.reldb.dbrowser.ui.content.rel.type.TypeCreator; import org.reldb.dbrowser.ui.content.rel.type.TypeDropper; import org.reldb.dbrowser.ui.content.rel.type.TypePlayer; import org.reldb.dbrowser.ui.content.rel.var.VarCreator; import org.reldb.dbrowser.ui.content.rel.var.VarDesigner; import org.reldb.dbrowser.ui.content.rel.var.VarDropper; import org.reldb.dbrowser.ui.content.rel.var.VarExporter; import org.reldb.dbrowser.ui.content.rel.var.VarPlayer; import org.reldb.dbrowser.ui.content.rel.view.VarViewCreator; import org.reldb.dbrowser.ui.content.rel.view.VarViewDesigner; import org.reldb.dbrowser.ui.content.rel.view.VarViewDropper; import org.reldb.dbrowser.ui.content.rel.view.VarViewExporter; import org.reldb.dbrowser.ui.content.rel.view.VarViewPlayer; import org.reldb.dbrowser.ui.content.rel.welcome.WelcomeView; import org.reldb.rel.client.Tuple; import org.reldb.rel.client.Tuples; import org.reldb.rel.client.connection.CrashHandler; public class RelPanel extends Composite { public final static String CATEGORY_VARIABLE = "Variable"; public final static String CATEGORY_VIEW = "View"; public final static String CATEGORY_OPERATOR = "Operator"; public final static String CATEGORY_TYPE = "Type"; public final static String CATEGORY_CONSTRAINT = "Constraint"; public final static String CATEGORY_SCRIPT = "Script"; public final static String CATEGORY_QUERY = "Query"; public final static String CATEGORY_WELCOME = "Welcome"; private DbTab parentTab; private DbConnection connection; private CrashHandler crashHandler; private boolean showSystemObjects = false; private SashForm sashForm; private CTabFolder tabFolder; private CTabFolder treeFolder; private Tree tree; private HashMap<String, TreeItem> treeRoots; private CTabItem itemSelectedByMenu; private int itemSelectedByMenuIndex; /** * Create the composite. * @param parentTab * @param parent * @param style */ public RelPanel(DbTab parentTab, Composite parent, int style) { super(parent, style); this.parentTab = parentTab; setLayout(new FillLayout(SWT.HORIZONTAL)); connection = parentTab.getConnection(); crashHandler = parentTab.getCrashHandler(); sashForm = new SashForm(this, SWT.NONE); treeFolder = new CTabFolder(sashForm, SWT.BORDER); CTabItem treeTab = new CTabItem(treeFolder, SWT.NONE); treeTab.setText("Database"); treeTab.setImage(IconLoader.loadIcon("DatabaseIcon")); tree = new Tree(treeFolder, SWT.NONE); treeTab.setControl(tree); treeFolder.setSelection(0); tree.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent evt) { DbTreeItem selection = getSelection(); if (selection == null) fireDbTreeNoSelectionEvent(); else { fireDbTreeSelectionEvent(selection); String name = selection.getTabName(); CTabItem tab = getTab(name); if (tab != null) { getTabFolder().setSelection(tab); fireDbTreeTabchangeEvent(); } } } }); tree.addMouseListener(new MouseAdapter() { public void mouseDoubleClick(MouseEvent e) { DbTreeItem selection = getSelection(); if (selection != null && selection.canPlay()) playItem(); } }); Menu menu = new Menu(this); MenuItem showItem = new MenuItem(menu, SWT.POP_UP); showItem.setText("Show"); showItem.setImage(IconLoader.loadIcon("play")); showItem.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent evt) { playItem(); } }); MenuItem createItem = new MenuItem(menu, SWT.POP_UP); createItem.setText("Create"); createItem.setImage(IconLoader.loadIcon("item_add")); createItem.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent evt) { createItem(); } }); MenuItem dropItem = new MenuItem(menu, SWT.POP_UP); dropItem.setText("Drop"); dropItem.setImage(IconLoader.loadIcon("item_delete")); dropItem.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent evt) { dropItem(); } }); MenuItem designItem = new MenuItem(menu, SWT.POP_UP); designItem.setText("Design"); designItem.setImage(IconLoader.loadIcon("item_design")); designItem.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent evt) { designItem(); } }); MenuItem renameItem = new MenuItem(menu, SWT.POP_UP); renameItem.setText("Rename"); renameItem.setImage(IconLoader.loadIcon("rename")); renameItem.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent evt) { renameItem(); } }); MenuItem exportItem = new MenuItem(menu, SWT.POP_UP); exportItem.setText("Export"); exportItem.setImage(IconLoader.loadIcon("export")); exportItem.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent evt) { exportItem(); } }); tree.setMenu(menu); tree.addMenuDetectListener(new MenuDetectListener() { public void menuDetected(MenuDetectEvent e) { DbTreeItem selection = getSelection(); if (selection == null) { showItem.setEnabled(false); createItem.setEnabled(false); dropItem.setEnabled(false); designItem.setEnabled(false); renameItem.setEnabled(false); exportItem.setEnabled(false); } else { showItem.setEnabled(selection.canPlay()); createItem.setEnabled(selection.canCreate()); dropItem.setEnabled(selection.canDrop()); designItem.setEnabled(selection.canDesign()); renameItem.setEnabled(selection.canRename()); exportItem.setEnabled(selection.canExport()); } } }); treeRoots = new HashMap<String, TreeItem>(); tabFolder = new CTabFolder(sashForm, SWT.BORDER | SWT.CLOSE); tabFolder.setSelectionBackground(Display.getCurrent().getSystemColor(SWT.COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT)); tabFolder.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent evt) { fireDbTreeTabchangeEvent(); } }); tabFolder.addCTabFolder2Listener(new CTabFolder2Adapter() { @Override public void close(CTabFolderEvent event) { if (!((DbTreeTab)event.item).canClose()) { event.doit = false; return; } if (tabFolder.getItemCount() <= 1) unzoom(); } }); Menu tabControlMenu = new Menu(tabFolder); tabFolder.setMenu(tabControlMenu); MenuItem closer = new MenuItem(tabControlMenu, SWT.NONE); MenuItem closeOthers = new MenuItem(tabControlMenu, SWT.NONE); MenuItem closeLeft = new MenuItem(tabControlMenu, SWT.NONE); MenuItem closeRight = new MenuItem(tabControlMenu, SWT.NONE); new MenuItem(tabControlMenu, SWT.SEPARATOR); MenuItem closeAll = new MenuItem(tabControlMenu, SWT.NONE); closer.setText("Close"); closeOthers.setText("Close others"); closeLeft.setText("Close left tabs"); closeRight.setText("Close right tabs"); closeAll.setText("Close all"); tabFolder.addListener(SWT.MenuDetect, new Listener() { public void handleEvent(Event e) { Point clickPosition = Display.getDefault().map(null, tabFolder, new Point(e.x, e.y)); if (clickPosition.y > tabFolder.getTabHeight()) e.doit = false; else { itemSelectedByMenu = tabFolder.getItem(clickPosition); itemSelectedByMenuIndex = getTabIndex(tabFolder, itemSelectedByMenu); closer.setEnabled(itemSelectedByMenuIndex >= 0); closeOthers.setEnabled(tabFolder.getItemCount() > 1 && itemSelectedByMenuIndex >= 0); closeLeft.setEnabled(itemSelectedByMenuIndex > 0); closeRight.setEnabled(itemSelectedByMenuIndex >= 0 && itemSelectedByMenuIndex < tabFolder.getItemCount() - 1); closeAll.setEnabled(tabFolder.getItemCount() > 0); } } }); closer.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (itemSelectedByMenu != null) itemSelectedByMenu.dispose(); } }); closeOthers.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { tabFolder.setSelection(itemSelectedByMenuIndex); for (CTabItem tab: tabFolder.getItems()) if (tab != itemSelectedByMenu) tab.dispose(); } }); closeLeft.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (itemSelectedByMenuIndex > 0) { Vector<CTabItem> closers = new Vector<CTabItem>(); for (int i=0; i<itemSelectedByMenuIndex; i++) closers.add(tabFolder.getItem(i)); tabFolder.setSelection(itemSelectedByMenuIndex); for (CTabItem close: closers) close.dispose(); } } }); closeRight.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (itemSelectedByMenuIndex < tabFolder.getItemCount() - 1) { Vector<CTabItem> closers = new Vector<CTabItem>(); for (int i = itemSelectedByMenuIndex + 1; i<tabFolder.getItemCount(); i++) closers.add(tabFolder.getItem(i)); tabFolder.setSelection(itemSelectedByMenuIndex); for (CTabItem close: closers) close.dispose(); } } }); closeAll.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { while (tabFolder.getItemCount() > 0) tabFolder.getItem(0).dispose(); } }); ToolBar zoomer = new ToolBar(tabFolder, SWT.NONE); ToolItem zoomItem = new ToolItem(zoomer, SWT.NONE); zoomItem.setImage(IconLoader.loadIcon("view_fullscreen")); zoomItem.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent evt) { zoom(); } }); tabFolder.setTopRight(zoomer); sashForm.setWeights(new int[] {1, 4}); buildDbTree(); boolean displayWelcome = true; if (connection.hasRevExtensions() >= 0) { RevDatabase db = new RevDatabase(connection); if (db.getSetting(getClass().getName() + "-showWelcome").equals("no")) displayWelcome = false; } if (displayWelcome) { TreeItem lastItem = tree.getItem(tree.getItemCount() - 1); lastItem.setExpanded(true); if (lastItem.getItemCount() > 0) { lastItem = lastItem.getItem(lastItem.getItemCount() - 1); tree.setSelection(lastItem); playItem(); fireDbTreeTabchangeEvent(); } } } public DbTab getDbTab() { return parentTab; } /** Invoke to force reload of toolbar. */ public void changeToolbar() {} private static int getTabIndex(CTabFolder tabFolder, CTabItem item) { if (item == null) return -1; for (int index = 0; index < tabFolder.getItemCount(); index++) if (tabFolder.getItem(index) == item) return index; return -1; } public void notifyTabCreated() { fireDbTreeTabchangeEvent(); } public DbConnection getConnection() { return connection; } public CrashHandler getCrashHandler() { return crashHandler; } public CTabFolder getTabFolder() { return tabFolder; } public CTabItem getTab(String name) { for (CTabItem tab: tabFolder.getItems()) if (tab.getText().equals(name)) return tab; return null; } public CTabItem getTab(DbTreeItem item) { return getTab(item.getTabName()); } private TreeItem getTreeSelection() { TreeItem items[] = tree.getSelection(); if (items == null || items.length == 0) return null; return items[0]; } private DbTreeItem getSelection() { TreeItem treeItem = getTreeSelection(); if (treeItem == null) return null; return (DbTreeItem)treeItem.getData(); } private Vector<DbTreeListener> listeners = new Vector<DbTreeListener>(); public void addDbTreeListener(DbTreeListener listener) { listeners.add(listener); } public void removeDbTreeListener(DbTreeListener listener) { listeners.remove(listener); } protected void fireDbTreeTabchangeEvent() { for (DbTreeListener listener: listeners) listener.tabChangeNotify(); } protected void fireDbTreeSelectionEvent(DbTreeItem item) { for (DbTreeListener listener: listeners) listener.select(item); } private void fireDbTreeNoSelectionEvent() { fireDbTreeSelectionEvent(new DbTreeItem()); } // Invoked to force refresh of this panel. Required by GTK (apparently...) due to // failure to display widgets correctly without it. private void nudge() { this.setSize(getSize().x + 1, getSize().y); this.setSize(getSize().x - 1, getSize().y); } private DbTreeTab getTab(String category, String text) { CTabItem tab = getTab(category + ": " + text); if (tab instanceof DbTreeTab) return (DbTreeTab)tab; return null; } private TreeItem getTreeItemRecursive(TreeItem item, String text) { if (item == null) return null; if (item.getText().equals(text)) return item; for (TreeItem subtreeItem: item.getItems()) { TreeItem result = getTreeItemRecursive(subtreeItem, text); if (result != null) return result; } return null; } private TreeItem getTreeItem(String category, String text) { DbTreeTab tab = getTab(category, text); if (tab != null) tab.reload(); TreeItem item = treeRoots.get(category); return getTreeItemRecursive(item, text); } private boolean selectItem(String category, String text) { TreeItem item = getTreeItem(category, text); if (item != null) { tree.setSelection(item); return true; } return false; } private void setTopItem(String category, String text) { TreeItem item = getTreeItem(category, text); if (item != null) tree.setTopItem(item); } public void openTabForDesign(String category, String text) { if (selectItem(category, text)) designItem(); } public void playItem() { TreeItem treeSelection = getTreeSelection(); getSelection().play(treeSelection.getImage()); nudge(); } public void createItem() { getSelection().create(IconLoader.loadIcon("item_add")); nudge(); } public void dropItem() { getSelection().drop(IconLoader.loadIcon("item_delete")); nudge(); } public void designItem() { getSelection().design(IconLoader.loadIcon("item_design")); nudge(); } protected void renameItem() { getSelection().rename(IconLoader.loadIcon("rename")); nudge(); } protected void exportItem() { getSelection().export(IconLoader.loadIcon("export")); nudge(); } public boolean getShowSystemObjects() { return showSystemObjects; } public void setShowSystemObjects(boolean selection) { showSystemObjects = selection; buildDbTree(); } private TreeItem getRoot(String section, Image image, DbTreeAction creator) { TreeItem root = treeRoots.get(section); if (root == null) { root = new TreeItem(tree, SWT.NONE); root.setImage(image); root.setText(section); treeRoots.put(section, root); root.setData(new DbTreeItem(section, null, creator, null, null, null, null)); } return root; } private void buildSubtree(String section, Image image, String query, String displayAttributeName, Predicate<String> filter, DbTreeAction player, DbTreeAction creator, DbTreeAction dropper, DbTreeAction designer, DbTreeAction renamer, DbTreeAction exporter) { TreeItem root = getRoot(section, image, creator); if (query != null) { Tuples names = connection.getTuples(query); if (names != null) for (Tuple tuple: names) { String name = tuple.getAttributeValue(displayAttributeName).toString(); if (filter.test(name)) { TreeItem item = new TreeItem(root, SWT.NONE); item.setImage(image); item.setText(name); item.setData(new DbTreeItem(section, player, creator, dropper, designer, renamer, exporter, name)); } } } } private void buildSubtreeVar(String andSysStr, Predicate<String> filter) { String section = CATEGORY_VARIABLE; Image imageInternal = IconLoader.loadIcon("table"); Image imageExternal = IconLoader.loadIcon("table_external"); String query = "(sys.Catalog WHERE NOT isVirtual" + andSysStr + ") {Name, isExternal} ORDER (ASC Name)"; String displayAttributeName = "Name"; VarPlayer player = new VarPlayer(this); VarCreator creator = new VarCreator(this); VarDropper dropper = new VarDropper(this); VarDesigner designer = new VarDesigner(this); VarExporter exporter = new VarExporter(this); TreeItem root = getRoot(section, imageInternal, creator); if (query != null) { Tuples names = connection.getTuples(query); if (names != null) for (Tuple tuple: names) { String name = tuple.getAttributeValue(displayAttributeName).toString(); if (filter.test(name)) { TreeItem item = new TreeItem(root, SWT.NONE); if (tuple.getAttributeValue("isExternal").toBoolean()) item.setImage(imageExternal); else item.setImage(imageInternal); item.setText(name); item.setData(new DbTreeItem(section, player, creator, dropper, designer, null, exporter, name)); } } } } private void buildSubtreeOperator(String whereSysStr, Predicate<String> filter) { String query = "EXTEND " + " UNION {" + " ((sys.Operators UNGROUP Implementations) " + whereSysStr + ") {Name, Signature, ReturnsType, Definition}," + " ((EXTEND sys.OperatorsBuiltin: {Owner := 'Rel'}) " + whereSysStr + ") {ALL BUT Owner}" + " }" + ": {SigReturn := Signature || IF ReturnsType <> '' THEN ' RETURNS ' || ReturnsType ELSE '' END IF}" + "GROUP {ALL BUT Name} AS Impl " + "ORDER (ASC Name)"; OperatorCreator creator = new OperatorCreator(this); String section = CATEGORY_OPERATOR; Image image = IconLoader.loadIcon("flow_chart"); TreeItem root = getRoot(section, image, creator); if (query != null) { Tuples names = connection.getTuples(query); if (names != null) for (Tuple tuple: names) { String name = tuple.getAttributeValue("Name").toString(); if (filter.test(name)) { TreeItem itemHeading = new TreeItem(root, SWT.NONE); itemHeading.setImage(image); itemHeading.setText(name); itemHeading.setData(new DbTreeItem(section, null, creator, null, null, null, null, name)); int implementationCount = 0; String lastSignatureWithReturns = ""; DbTreeItem lastitem = null; for (Tuple detailTuple: (Tuples)tuple.get("Impl")) { TreeItem item = new TreeItem(itemHeading, SWT.NONE); item.setImage(image); lastSignatureWithReturns = detailTuple.getAttributeValue("SigReturn").toString(); lastitem = new DbTreeItem(section, new OperatorPlayer(this), creator, new OperatorDropper(this), new OperatorDesigner(this), null, null, detailTuple.getAttributeValue("Signature").toString()); item.setText(lastSignatureWithReturns); item.setData(lastitem); implementationCount++; } if (implementationCount == 0) itemHeading.dispose(); else if (implementationCount == 1) { itemHeading.removeAll(); itemHeading.setText(lastSignatureWithReturns); itemHeading.setData(lastitem); } } } } } private void removeSubtree(String section) { TreeItem root = treeRoots.get(section); if (root != null) treeRoots.remove(section); root.dispose(); } private void buildSubtree(String section, Image image, String query, String displayAttributeName, DbTreeAction player, DbTreeAction creator, DbTreeAction dropper, DbTreeAction designer, DbTreeAction renamer, DbTreeAction exporter) { buildSubtree(section, image, query, displayAttributeName, (String attributeName) -> true, player, creator, dropper, designer, renamer, exporter); } private void buildDbTree() { for (TreeItem root: treeRoots.values()) root.removeAll(); String sysStr = (showSystemObjects) ? null : "Owner <> 'Rel'"; String andSysStr = ((sysStr != null) ? (" AND " + sysStr) : ""); String whereSysStr = ((sysStr != null) ? (" WHERE " + sysStr) : ""); Predicate<String> revSysNamesFilter = (String attributeName) -> attributeName.startsWith("sys.rev") ? showSystemObjects : true; buildSubtreeVar(andSysStr, revSysNamesFilter); buildSubtree(CATEGORY_VIEW, IconLoader.loadIcon("view"), "(sys.Catalog WHERE isVirtual" + andSysStr + ") {Name} ORDER (ASC Name)", "Name", revSysNamesFilter, new VarViewPlayer(this), new VarViewCreator(this), new VarViewDropper(this), new VarViewDesigner(this), null, new VarViewExporter(this)); buildSubtreeOperator(whereSysStr, revSysNamesFilter); buildSubtree(CATEGORY_TYPE, IconLoader.loadIcon("tau"), "(sys.Types" + whereSysStr + ") {Name} ORDER (ASC Name)", "Name", new TypePlayer(this), new TypeCreator(this), new TypeDropper(this), null, null, null); buildSubtree(CATEGORY_CONSTRAINT, IconLoader.loadIcon("constraint"), "(sys.Constraints" + whereSysStr + ") {Name} ORDER (ASC Name)", "Name", new ConstraintPlayer(this), new ConstraintCreator(this), new ConstraintDropper(this), new ConstraintDesigner(this), null, null); if (connection.hasRevExtensions() >= 0) handleRevAddition(); buildSubtree(CATEGORY_WELCOME, IconLoader.loadIcon("smile"), "REL {TUP {Name 'Introduction'}}", "Name", new WelcomeView(this), null, null, null, null, null); fireDbTreeNoSelectionEvent(); } public void redisplayed() { TreeItem[] selections = tree.getSelection(); String selectedSection = null; String selectedText = null; if (selections != null && selections.length > 0) { DbTreeItem item = (DbTreeItem)selections[0].getData(); if (item != null) { selectedSection = item.getSection(); selectedText = selections[0].getText(); } } TreeItem topItem = tree.getTopItem(); String topSection = null; String topText = null; if (topItem != null) { DbTreeItem item = (DbTreeItem)topItem.getData(); if (item != null) { topSection = item.getSection(); topText = topItem.getText(); } } buildDbTree(); if (selectedSection != null) selectItem(selectedSection, selectedText); if (topSection != null) setTopItem(topSection, topText); } public void handleRevAddition() { parentTab.refresh(); buildSubtree(CATEGORY_QUERY, IconLoader.loadIcon("query"), "UNION {sys.rev.Query {model}, sys.rev.Relvar {model}}", "model", new QueryPlayer(this), new QueryCreator(this), new QueryDropper(this), new QueryDesigner(this), null, null); // buildSubtree("Forms", null, null, null, null, null, null); // buildSubtree("Reports", null, null, null, null, null, null); buildSubtree(CATEGORY_SCRIPT, IconLoader.loadIcon("script"), "sys.rev.Script {Name} ORDER (ASC Name)", "Name", new ScriptPlayer(this), new ScriptCreator(this), new ScriptDropper(this), new ScriptDesigner(this), new ScriptRenamer(this), null); } public void handleRevRemoval() { parentTab.refresh(); removeSubtree(CATEGORY_QUERY); // removeSubtree("Forms"); // removeSubtree("Reports"); removeSubtree(CATEGORY_SCRIPT); } private void unzoom() { sashForm.setMaximizedControl(null); } private void zoomMain() { if (sashForm.getMaximizedControl() == null) sashForm.setMaximizedControl(tabFolder); else sashForm.setMaximizedControl(null); } public void zoom() { if (tabFolder.getItemCount() == 0) return; CTabItem tabItem = tabFolder.getSelection(); if (tabItem != null && tabItem instanceof DbTreeTab) { DbTreeTab currentTab = (DbTreeTab)tabItem; if (currentTab.isSelfZoomable()) { currentTab.zoom(); return; } } zoomMain(); } public void switchToCmdMode() { parentTab.switchToCmdMode(); } }