Changeset 846


Ignore:
Timestamp:
09/21/12 11:06:24 (12 years ago)
Author:
sherbold
Message:
  • added interface to the GUIModel to merge nodes from the outside
  • added functionality to the SWT GUI to merge nodes of the GUI model manually
Location:
trunk
Files:
1 deleted
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/quest-core-events/src/main/java/de/ugoe/cs/quest/eventcore/guimodel/GUIModel.java

    r831 r846  
    227227        mergeSubTree(root); 
    228228    } 
     229     
     230    /** 
     231     * <p> 
     232     * Merges the tree nodes of two GUI elements. The GUI elements need to have the same parent. 
     233     * </p> 
     234     *  
     235     * @param guiElement1 
     236     *            the first merge GUI element 
     237     * @param guiElement2 
     238     *            the second merge GUI element 
     239     * @throws IllegalArgumentException 
     240     *             thrown if the two GUI elements do not have the same parent 
     241     */ 
     242    public void mergeGUIElements(IGUIElement guiElement1, IGUIElement guiElement2) 
     243        throws IllegalArgumentException 
     244    { 
     245        // check if both nodes have the same parent 
     246        IGUIElement parentElement = guiElement1.getParent(); 
     247        if (parentElement != null && !parentElement.equals(guiElement2.getParent())) { 
     248            throw new IllegalArgumentException("can only merge nodes with the same parent"); 
     249        } 
     250 
     251        // get the TreeNode of the parent of the GUI elements 
     252        TreeNode parent = findNode(parentElement); 
     253 
     254        // get the TreeNodes for both GUI elements 
     255        TreeNode node1 = findNode(guiElement1); 
     256        TreeNode node2 = findNode(guiElement2); 
     257 
     258        if (node1 == null || node2 == null) { 
     259            throw new IllegalArgumentException( 
     260                                               "Error while merging nodes: one element is not part of the GUI model!"); 
     261        } 
     262 
     263        TreeNode replacement = mergeTreeNodes(node1, node2); 
     264 
     265        if (parent != null) { 
     266            // remove node1 and node2 from the parent's children and add the replacement instead 
     267            // assumes that there are no duplicates of node1 and node2 
     268            if (parent.children != null) { 
     269                parent.children.set(parent.children.indexOf(node1), replacement); 
     270                parent.children.remove(node2); 
     271            } 
     272        } 
     273 
     274    } 
    229275 
    230276    /** 
     
    428474 
    429475        out.println(); 
     476    } 
     477     
     478    /** 
     479     * <p> 
     480     * Retrieves the TreeNode associated with a GUI element. Returns null if no such TreeNode is 
     481     * found. 
     482     * </p> 
     483     *  
     484     * @param element 
     485     *            the GUI element 
     486     * @return associated TreeNode; null if no such node exists 
     487     */ 
     488    private TreeNode findNode(IGUIElement element) { 
     489        if (element == null) { 
     490            return null; 
     491        } 
     492 
     493        TreeNode result = null; 
     494        for (TreeNode node : allNodes) { 
     495            if (node.guiElement.equals(element)) { 
     496                if (result == null) { 
     497                    result = node; 
     498                } 
     499                else { 
     500                    Console 
     501                        .traceln(Level.SEVERE, 
     502                                 "Multiple nodes in the internal GUI model match the same GUI element. " 
     503                                     + "This should not be the case and the GUI model is probably invalid."); 
     504                } 
     505            } 
     506        } 
     507        return result; 
    430508    } 
    431509 
  • trunk/quest-ui-swt/src/main/java/de/ugoe/cs/quest/ui/swt/ShowGuiModelDialog.java

    r777 r846  
    1212import org.eclipse.swt.widgets.Dialog; 
    1313import org.eclipse.swt.widgets.Display; 
     14import org.eclipse.swt.widgets.MessageBox; 
    1415import org.eclipse.swt.widgets.Shell; 
    1516import org.eclipse.swt.widgets.Tree; 
     
    1819import de.ugoe.cs.quest.eventcore.guimodel.GUIModel; 
    1920import de.ugoe.cs.quest.eventcore.guimodel.IGUIElement; 
     21import de.ugoe.cs.util.console.Console; 
     22 
    2023import org.eclipse.swt.widgets.Label; 
    2124 
     
    7275        shell.setText(getText()); 
    7376 
    74         shell.setLayout(new GridLayout(2, false)); 
     77        shell.setLayout(new GridLayout(3, false)); 
    7578 
    76         guiTree = new Tree(shell, SWT.BORDER); 
    77         guiTree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1)); 
     79        guiTree = new Tree(shell, SWT.BORDER | SWT.MULTI); 
     80        guiTree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1)); 
    7881 
    7982        buildGuiTree(); 
     
    9699        }); 
    97100        btnCollapseAll.setText("Collapse all"); 
     101         
     102        Button btnMerge = new Button(shell, SWT.NONE); 
     103        btnMerge.addSelectionListener(new SelectionAdapter() { 
     104            @Override 
     105            public void widgetSelected(SelectionEvent e) { 
     106                mergeSelectedNode(guiTree); 
     107            } 
     108        }); 
     109        btnMerge.setText("Merge"); 
     110         
     111        //new Label(shell, SWT.NONE); 
     112        new Label(shell, SWT.NONE); 
    98113        new Label(shell, SWT.NONE); 
    99114        new Label(shell, SWT.NONE); 
     
    105120            TreeItem child = new TreeItem(guiTree, SWT.NULL); 
    106121            child.setText(element.toString()); 
     122            child.setData(element); 
    107123            buildGuiTree(child, model.getChildren(element)); 
    108124        } 
     
    113129            TreeItem child = new TreeItem(currentParent, SWT.NULL); 
    114130            child.setText(element.toString()); 
     131            child.setData(element); 
    115132            buildGuiTree(child, model.getChildren(element)); 
    116133        } 
     
    129146        } 
    130147    } 
     148     
     149    private void mergeSelectedNode(Tree tree) { 
     150        TreeItem[] selectedNodes = tree.getSelection(); 
     151        if( selectedNodes.length<2 ) { 
     152            MessageBox messageBox = new MessageBox(shell, SWT.ERROR); 
     153            messageBox.setMessage("Must select at least two nodes to merge!"); 
     154            messageBox.setText("Error"); 
     155            messageBox.open(); 
     156            return; 
     157        } 
     158         
     159        TreeItem firstParent = selectedNodes[0].getParentItem(); 
     160        for( int i=1 ; i<selectedNodes.length ; i++ ) { 
     161            if( firstParent!=selectedNodes[i].getParentItem() ) { 
     162                MessageBox messageBox = new MessageBox(shell, SWT.ERROR); 
     163                messageBox.setMessage("All selected nodes must have the same parent!"); 
     164                messageBox.setText("Error"); 
     165                messageBox.open(); 
     166                return; 
     167            } 
     168        } 
     169         
     170        try { 
     171            // try to merge the elements 
     172            IGUIElement firstElement = (IGUIElement) selectedNodes[0].getData(); 
     173            for( int i=1 ; i<selectedNodes.length ; i++ ) { 
     174                model.mergeGUIElements(firstElement, (IGUIElement) selectedNodes[i].getData()); 
     175            } 
     176        } catch( IllegalArgumentException e) { 
     177            Console.logException(e); 
     178        } 
     179         
     180        // update visualization of the model 
     181        firstParent.removeAll(); 
     182        buildGuiTree(firstParent, model.getChildren((IGUIElement) firstParent.getData())); 
     183        firstParent.setExpanded(true); 
     184    } 
    131185 
    132186} 
Note: See TracChangeset for help on using the changeset viewer.