public GAGenerationTreePanel(GAObjectMonitor monitor, String parentNodeTitle) { super(); selectedChildrenPaths = new Vector(); generationNumber = 1; saveNumber = 0; generations = new DefaultMutableTreeNode(parentNodeTitle); gaMonitor = monitor; setLayout(new BorderLayout()); tree = new JTree(generations); tree.setShowsRootHandles(true); tree.setRootVisible(true); tree.putClientProperty("JTree.lineStyle", "Angled"); // Add Action Listeners MyTreeSelectionListener listener = new MyTreeSelectionListener(monitor.getSelectionInfoPanel()); MyTreeClickListener mlistener = new MyTreeClickListener(); tree.addTreeSelectionListener(listener); tree.addMouseListener(mlistener); // Add Scroll Plane scrollPane = new JScrollPane(tree); add(scrollPane, BorderLayout.CENTER); // Add Menu Bar Functionality createMenuBar(); add(menuBar, BorderLayout.NORTH); }
private void initTree() { myTree.setRootVisible(false); myTree.setShowsRootHandles(true); SmartExpander.installOn(myTree); TreeUtil.installActions(myTree); EditSourceOnDoubleClickHandler.install(myTree); myTree.addKeyListener( new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { if (KeyEvent.VK_ENTER == e.getKeyCode()) { TreePath leadSelectionPath = myTree.getLeadSelectionPath(); if (leadSelectionPath == null) return; DefaultMutableTreeNode node = (DefaultMutableTreeNode) leadSelectionPath.getLastPathComponent(); if (node instanceof UsageNode) { final Usage usage = ((UsageNode) node).getUsage(); usage.navigate(false); usage.highlightInEditor(); } else if (node.isLeaf()) { Navigatable navigatable = getNavigatableForNode(node); if (navigatable != null && navigatable.canNavigate()) { navigatable.navigate(false); } } } } }); TreeUtil.selectFirstNode(myTree); PopupHandler.installPopupHandler( myTree, IdeActions.GROUP_USAGE_VIEW_POPUP, ActionPlaces.USAGE_VIEW_POPUP); // TODO: install speed search. Not in openapi though. It makes sense to create a common // TreeEnchancer service. }
protected TreeTable createOptionsTree(CodeStyleSettings settings) { DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(); Map<String, DefaultMutableTreeNode> groupsMap = new THashMap<String, DefaultMutableTreeNode>(); List<Option> sorted = sortOptions(ContainerUtil.concat(myOptions, myCustomOptions)); for (Option each : sorted) { if (!(myCustomOptions.contains(each) || myAllowedOptions.contains(each.field.getName()) || myShowAllStandardOptions)) continue; String group = each.groupName; MyTreeNode newNode = new MyTreeNode(each, each.title, settings); DefaultMutableTreeNode groupNode = groupsMap.get(group); if (groupNode != null) { groupNode.add(newNode); } else { String groupName; if (group == null) { groupName = each.title; groupNode = newNode; } else { groupName = group; groupNode = new DefaultMutableTreeNode(groupName); groupNode.add(newNode); } groupsMap.put(groupName, groupNode); rootNode.add(groupNode); } } ListTreeTableModel model = new ListTreeTableModel(rootNode, COLUMNS); TreeTable treeTable = new TreeTable(model) { @Override public TreeTableCellRenderer createTableRenderer(TreeTableModel treeTableModel) { TreeTableCellRenderer tableRenderer = super.createTableRenderer(treeTableModel); UIUtil.setLineStyleAngled(tableRenderer); tableRenderer.setRootVisible(false); tableRenderer.setShowsRootHandles(true); return tableRenderer; } @Override public TableCellRenderer getCellRenderer(int row, int column) { TreePath treePath = getTree().getPathForRow(row); if (treePath == null) return super.getCellRenderer(row, column); Object node = treePath.getLastPathComponent(); @SuppressWarnings("unchecked") TableCellRenderer renderer = COLUMNS[column].getRenderer(node); return renderer == null ? super.getCellRenderer(row, column) : renderer; } @Override public TableCellEditor getCellEditor(int row, int column) { TreePath treePath = getTree().getPathForRow(row); if (treePath == null) return super.getCellEditor(row, column); Object node = treePath.getLastPathComponent(); @SuppressWarnings("unchecked") TableCellEditor editor = COLUMNS[column].getEditor(node); return editor == null ? super.getCellEditor(row, column) : editor; } }; new TreeTableSpeedSearch(treeTable).setComparator(new SpeedSearchComparator(false)); treeTable.setRootVisible(false); final JTree tree = treeTable.getTree(); tree.setCellRenderer(myTitleRenderer); tree.setShowsRootHandles(true); // myTreeTable.setRowHeight(new JComboBox(new String[]{"Sample // Text"}).getPreferredSize().height); treeTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); treeTable.setTableHeader(null); expandTree(tree); treeTable.getColumnModel().getSelectionModel().setAnchorSelectionIndex(1); treeTable.getColumnModel().getSelectionModel().setLeadSelectionIndex(1); int maxWidth = tree.getPreferredScrollableViewportSize().width + 10; final TableColumn titleColumn = treeTable.getColumnModel().getColumn(0); titleColumn.setPreferredWidth(maxWidth); titleColumn.setMinWidth(maxWidth); titleColumn.setMaxWidth(maxWidth); titleColumn.setResizable(false); // final TableColumn levelColumn = treeTable.getColumnModel().getColumn(1); // TODO[max]: better preffered size... // TODO[kb]: Did I fixed it by making the last column floating? // levelColumn.setPreferredWidth(valueSize.width); // levelColumn.setMaxWidth(valueSize.width); // levelColumn.setMinWidth(valueSize.width); // levelColumn.setResizable(false); final Dimension valueSize = new JLabel(ApplicationBundle.message("option.table.sizing.text")).getPreferredSize(); treeTable.setPreferredScrollableViewportSize( new Dimension(maxWidth + valueSize.width + 10, 20)); return treeTable; }
/** * Helper function to display a Swing window with a tree representation of the specified list of * joins. See {@link #orderJoins}, which may want to call this when the analyze flag is true. * * @param js the join plan to visualize * @param pc the PlanCache accumulated whild building the optimal plan * @param stats table statistics for base tables * @param selectivities the selectivities of the filters over each of the tables (where tables are * indentified by their alias or name if no alias is given) */ private void printJoins( Vector<LogicalJoinNode> js, PlanCache pc, HashMap<String, TableStats> stats, HashMap<String, Double> selectivities) { JFrame f = new JFrame("Join Plan for " + p.getQuery()); // Set the default close operation for the window, // or else the program won't exit when clicking close button f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); f.setVisible(true); f.setSize(300, 500); HashMap<String, DefaultMutableTreeNode> m = new HashMap<String, DefaultMutableTreeNode>(); // int numTabs = 0; // int k; DefaultMutableTreeNode root = null, treetop = null; HashSet<LogicalJoinNode> pathSoFar = new HashSet<LogicalJoinNode>(); boolean neither; System.out.println(js); for (LogicalJoinNode j : js) { pathSoFar.add(j); System.out.println("PATH SO FAR = " + pathSoFar); String table1Name = Database.getCatalog().getTableName(this.p.getTableId(j.t1Alias)); String table2Name = Database.getCatalog().getTableName(this.p.getTableId(j.t2Alias)); // Double c = pc.getCost(pathSoFar); neither = true; root = new DefaultMutableTreeNode( "Join " + j + " (Cost =" + pc.getCost(pathSoFar) + ", card = " + pc.getCard(pathSoFar) + ")"); DefaultMutableTreeNode n = m.get(j.t1Alias); if (n == null) { // never seen this table before n = new DefaultMutableTreeNode( j.t1Alias + " (Cost = " + stats.get(table1Name).estimateScanCost() + ", card = " + stats.get(table1Name).estimateTableCardinality(selectivities.get(j.t1Alias)) + ")"); root.add(n); } else { // make left child root n root.add(n); neither = false; } m.put(j.t1Alias, root); n = m.get(j.t2Alias); if (n == null) { // never seen this table before n = new DefaultMutableTreeNode( j.t2Alias == null ? "Subplan" : (j.t2Alias + " (Cost = " + stats.get(table2Name).estimateScanCost() + ", card = " + stats .get(table2Name) .estimateTableCardinality(selectivities.get(j.t2Alias)) + ")")); root.add(n); } else { // make right child root n root.add(n); neither = false; } m.put(j.t2Alias, root); // unless this table doesn't join with other tables, // all tables are accessed from root if (!neither) { for (String key : m.keySet()) { m.put(key, root); } } treetop = root; } JTree tree = new JTree(treetop); JScrollPane treeView = new JScrollPane(tree); tree.setShowsRootHandles(true); // Set the icon for leaf nodes. ImageIcon leafIcon = new ImageIcon("join.jpg"); DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer(); renderer.setOpenIcon(leafIcon); renderer.setClosedIcon(leafIcon); tree.setCellRenderer(renderer); f.setSize(300, 500); f.add(treeView); for (int i = 0; i < tree.getRowCount(); i++) { tree.expandRow(i); } if (js.size() == 0) { f.add(new JLabel("No joins in plan.")); } f.pack(); }
public CustomizableActionsPanel() { //noinspection HardCodedStringLiteral Group rootGroup = new Group("root", null, null); final DefaultMutableTreeNode root = new DefaultMutableTreeNode(rootGroup); DefaultTreeModel model = new DefaultTreeModel(root); myActionsTree.setModel(model); myActionsTree.setRootVisible(false); myActionsTree.setShowsRootHandles(true); UIUtil.setLineStyleAngled(myActionsTree); myActionsTree.setCellRenderer(new MyTreeCellRenderer()); setButtonsDisabled(); final ActionManager actionManager = ActionManager.getInstance(); myActionsTree .getSelectionModel() .addTreeSelectionListener( new TreeSelectionListener() { public void valueChanged(TreeSelectionEvent e) { final TreePath[] selectionPaths = myActionsTree.getSelectionPaths(); final boolean isSingleSelection = selectionPaths != null && selectionPaths.length == 1; myAddActionButton.setEnabled(isSingleSelection); if (isSingleSelection) { final DefaultMutableTreeNode node = (DefaultMutableTreeNode) selectionPaths[0].getLastPathComponent(); String actionId = getActionId(node); if (actionId != null) { final AnAction action = actionManager.getAction(actionId); myEditIconButton.setEnabled( action != null && action.getTemplatePresentation() != null); } else { myEditIconButton.setEnabled(false); } } else { myEditIconButton.setEnabled(false); } myAddSeparatorButton.setEnabled(isSingleSelection); myRemoveActionButton.setEnabled(selectionPaths != null); if (selectionPaths != null) { for (TreePath selectionPath : selectionPaths) { if (selectionPath.getPath() != null && selectionPath.getPath().length <= 2) { setButtonsDisabled(); return; } } } myMoveActionUpButton.setEnabled(isMoveSupported(myActionsTree, -1)); myMoveActionDownButton.setEnabled(isMoveSupported(myActionsTree, 1)); myRestoreDefaultButton.setEnabled(!findActionsUnderSelection().isEmpty()); } }); myAddActionButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { final List<TreePath> expandedPaths = TreeUtil.collectExpandedPaths(myActionsTree); final TreePath selectionPath = myActionsTree.getLeadSelectionPath(); if (selectionPath != null) { DefaultMutableTreeNode node = (DefaultMutableTreeNode) selectionPath.getLastPathComponent(); final FindAvailableActionsDialog dlg = new FindAvailableActionsDialog(); dlg.show(); if (dlg.isOK()) { final Set<Object> toAdd = dlg.getTreeSelectedActionIds(); if (toAdd == null) return; for (final Object o : toAdd) { final ActionUrl url = new ActionUrl( ActionUrl.getGroupPath(new TreePath(node.getPath())), o, ActionUrl.ADDED, node.getParent().getIndex(node) + 1); addCustomizedAction(url); ActionUrl.changePathInActionsTree(myActionsTree, url); if (o instanceof String) { DefaultMutableTreeNode current = new DefaultMutableTreeNode(url.getComponent()); current.setParent((DefaultMutableTreeNode) node.getParent()); editToolbarIcon((String) o, current); } } ((DefaultTreeModel) myActionsTree.getModel()).reload(); } } TreeUtil.restoreExpandedPaths(myActionsTree, expandedPaths); } }); myEditIconButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { myRestoreAllDefaultButton.setEnabled(true); final List<TreePath> expandedPaths = TreeUtil.collectExpandedPaths(myActionsTree); final TreePath selectionPath = myActionsTree.getLeadSelectionPath(); if (selectionPath != null) { EditIconDialog dlg = new EditIconDialog((DefaultMutableTreeNode) selectionPath.getLastPathComponent()); dlg.show(); if (dlg.isOK()) { myActionsTree.repaint(); } } TreeUtil.restoreExpandedPaths(myActionsTree, expandedPaths); } }); myAddSeparatorButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { final List<TreePath> expandedPaths = TreeUtil.collectExpandedPaths(myActionsTree); final TreePath selectionPath = myActionsTree.getLeadSelectionPath(); if (selectionPath != null) { DefaultMutableTreeNode node = (DefaultMutableTreeNode) selectionPath.getLastPathComponent(); final ActionUrl url = new ActionUrl( ActionUrl.getGroupPath(selectionPath), Separator.getInstance(), ActionUrl.ADDED, node.getParent().getIndex(node) + 1); ActionUrl.changePathInActionsTree(myActionsTree, url); addCustomizedAction(url); ((DefaultTreeModel) myActionsTree.getModel()).reload(); } TreeUtil.restoreExpandedPaths(myActionsTree, expandedPaths); } }); myRemoveActionButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { final List<TreePath> expandedPaths = TreeUtil.collectExpandedPaths(myActionsTree); final TreePath[] selectionPath = myActionsTree.getSelectionPaths(); if (selectionPath != null) { for (TreePath treePath : selectionPath) { final ActionUrl url = CustomizationUtil.getActionUrl(treePath, ActionUrl.DELETED); ActionUrl.changePathInActionsTree(myActionsTree, url); addCustomizedAction(url); } ((DefaultTreeModel) myActionsTree.getModel()).reload(); } TreeUtil.restoreExpandedPaths(myActionsTree, expandedPaths); } }); myMoveActionUpButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { final List<TreePath> expandedPaths = TreeUtil.collectExpandedPaths(myActionsTree); final TreePath[] selectionPath = myActionsTree.getSelectionPaths(); if (selectionPath != null) { for (TreePath treePath : selectionPath) { final ActionUrl url = CustomizationUtil.getActionUrl(treePath, ActionUrl.MOVE); final int absolutePosition = url.getAbsolutePosition(); url.setInitialPosition(absolutePosition); url.setAbsolutePosition(absolutePosition - 1); ActionUrl.changePathInActionsTree(myActionsTree, url); addCustomizedAction(url); } ((DefaultTreeModel) myActionsTree.getModel()).reload(); TreeUtil.restoreExpandedPaths(myActionsTree, expandedPaths); for (TreePath path : selectionPath) { myActionsTree.addSelectionPath(path); } } } }); myMoveActionDownButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { final List<TreePath> expandedPaths = TreeUtil.collectExpandedPaths(myActionsTree); final TreePath[] selectionPath = myActionsTree.getSelectionPaths(); if (selectionPath != null) { for (int i = selectionPath.length - 1; i >= 0; i--) { TreePath treePath = selectionPath[i]; final ActionUrl url = CustomizationUtil.getActionUrl(treePath, ActionUrl.MOVE); final int absolutePosition = url.getAbsolutePosition(); url.setInitialPosition(absolutePosition); url.setAbsolutePosition(absolutePosition + 1); ActionUrl.changePathInActionsTree(myActionsTree, url); addCustomizedAction(url); } ((DefaultTreeModel) myActionsTree.getModel()).reload(); TreeUtil.restoreExpandedPaths(myActionsTree, expandedPaths); for (TreePath path : selectionPath) { myActionsTree.addSelectionPath(path); } } } }); myRestoreAllDefaultButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { mySelectedSchema.copyFrom(new CustomActionsSchema()); patchActionsTreeCorrespondingToSchema(root); myRestoreAllDefaultButton.setEnabled(false); } }); myRestoreDefaultButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { final List<ActionUrl> otherActions = new ArrayList<ActionUrl>(mySelectedSchema.getActions()); otherActions.removeAll(findActionsUnderSelection()); mySelectedSchema.copyFrom(new CustomActionsSchema()); for (ActionUrl otherAction : otherActions) { mySelectedSchema.addAction(otherAction); } final List<TreePath> treePaths = TreeUtil.collectExpandedPaths(myActionsTree); patchActionsTreeCorrespondingToSchema(root); restorePathsAfterTreeOptimization(treePaths); myRestoreDefaultButton.setEnabled(false); } }); patchActionsTreeCorrespondingToSchema(root); myTreeExpansionMonitor = TreeExpansionMonitor.install(myActionsTree); }