Esempio n. 1
0
 def __init__(self,
              name="",
              node_prefix="",
              graph_attr=dict(splines="true", 
                              #ordering="out",
                              ranksep=0.25,
                              nodesep=0.1,
                              # size of margin depends on particular version of dot...
                              #margin=-0.25
                              ),
              node_attr=dict(fontname="sans",
                             fontsize="9",
                             #style="bold",
                             height=".1",
                             shape="plaintext"),
              edge_attr=dict(fontname="sans",
                             color="limegreen", 
                             fontsize="8",
                             weight="0",
                             constraint="false",
                             #arrowhead="none",
                             #style="dashed,bold"
                             #headclip="false",
                             #tailclip="false"
                             ),
              from_graph_attr=dict(color="white", 
                                   #ordering="out"
                                   ),
              from_node_attr=dict(fontcolor="blue"),
              from_edge_attr=dict(weight="100",
                                  style="solid",
                                  color="gray",
                                  arrowhead="none",
                                  constraint="true",
                                  #headclip="true",
                                  #tailclip="true",                               
                                  ),
              to_graph_attr=dict(color="white",
                                 #ordering="out"
                                 ),
              to_node_attr=dict(fontcolor="red"),
              to_edge_attr=dict(weight="100",
                                style="solid",
                                color="gray",
                                arrowhead="none",
                                constraint="true",
                                #headclip="true",
                                #tailclip="true",                                
                                ),
                                subgraph_class=AlpinoDotSubGraph):
     
     BasicDotGraphPair.__init__(self, name, node_prefix, 
                                graph_attr, node_attr, edge_attr, 
                                from_graph_attr, from_node_attr, from_edge_attr,
                                to_graph_attr, to_node_attr, to_edge_attr, 
                                subgraph_class)
     
     
Esempio n. 2
0
 def initDotGraphPair(self):
     self.dotGraphPair = BasicDotGraphPair()
Esempio n. 3
0
class BasicGraphView(GraphView):
    """
    Basic class for viewing graphs
    """
    
    def initDotGraphPair(self):
        self.dotGraphPair = BasicDotGraphPair()

    
    def initViewMenu(self):
        self.viewMenu = BasicViewMenu(self, self.aligner, self.algraephFrame)
        
        
    def subscribe_stage_1(self):
        GraphView.subscribe_stage_1(self)
        
        # newGraphPair
        subscribe(self.updateEdgeFocus, "newGraphPair.viz")
        subscribe(self.updateNodeFocus, "newGraphPair.viz")
        subscribe(self.unfoldAllNodes, "newGraphPair.viz")
        
        # newRelation
        subscribe(self.updateEdgeFocus, "newRelation.viz")
        
        # newNodeSelect
        subscribe(self.updateNodeFocus, "newNodeSelect.viz")
        subscribe(self.updateEdgeFocus, "newNodeSelect.viz")
        
        # newNodeSelect
        # ********* FIXME: following updates may be superfluous
        subscribe(self.updateAlignment, "newNodeSelect.viz")

        
    def subscribe_stage_3(self):
        GraphView.subscribe_stage_3(self)
        
        # newNodeSelect
        # ********* FIXME: following updates may be superfluous
        subscribe(self.updateImageFile, "newNodeSelect.gui")
        subscribe(self.updateHtmlPage, "newNodeSelect.gui")
        
        # foldNodeChanged
        subscribe(self.updateFromGraph, "foldNodeChanged")
        subscribe(self.updateToGraph, "foldNodeChanged")
        # hidden nodes may be focused or aligned, so we need to refresh
        # node focus, edge focus and aligment as well, which check themselves 
        # if any nodes have now become hidden   
        subscribe(self.updateNodeFocus, "foldNodeChanged")
        subscribe(self.updateEdgeFocus, "foldNodeChanged")
        subscribe(self.updateAlignment, "foldNodeChanged")
        subscribe(self.updateFolded, "foldNodeChanged")
        subscribe(self.updateImageFile, "foldNodeChanged")
        subscribe(self.updateImageMap, "foldNodeChanged")
        subscribe(self.updateHtmlPage, "foldNodeChanged")
        
        # unfoldAllNodes
        subscribe(self.unfoldAllNodes, "unfoldAllNodes")
        subscribe(self.updateFromGraph, "unfoldAllNodes")        
        subscribe(self.updateToGraph, "unfoldAllNodes")      
        subscribe(self.updateAlignment, "unfoldAllNodes")      
        subscribe(self.updateImageFile, "unfoldAllNodes")      
        subscribe(self.updateImageMap, "unfoldAllNodes")      
        subscribe(self.updateHtmlPage, "unfoldAllNodes")
        
        # markSelectedNodesChanged
        subscribe(self.updateNodeFocus, "markSelectedNodesChanged")
        subscribe(self.updateFromGraph, "markSelectedNodesChanged")
        subscribe(self.updateToGraph, "markSelectedNodesChanged")
        subscribe(self.updateImageFile, "markSelectedNodesChanged")
        subscribe(self.updateHtmlPage, "markSelectedNodesChanged")
        
        # markAlignedNodesChanged
        subscribe(self.updateAlignment, "markAlignedNodesChanged")
        subscribe(self.updateImageFile, "markAlignedNodesChanged")
        subscribe(self.updateHtmlPage, "markAlignedNodesChanged")
        
        # labelEdgesChanged
        subscribe(self.updateFromGraph, "labelEdgesChanged")
        subscribe(self.updateToGraph, "labelEdgesChanged")
        subscribe(self.updateImageFile, "labelEdgesChanged")
        subscribe(self.updateImageMap, "labelEdgesChanged")
        subscribe(self.updateHtmlPage, "labelEdgesChanged")
        
        # markSelectedAlignmentsChanged
        subscribe(self.updateEdgeFocus ,"markSelectedAlignmentsChanged")
        subscribe(self.updateAlignment ,"markSelectedAlignmentsChanged")
        subscribe(self.updateImageFile ,"markSelectedAlignmentsChanged")
        subscribe(self.updateHtmlPage ,"markSelectedAlignmentsChanged")
        
        # hideAlignmentsChanged
        subscribe(self.updateAlignment, "hideAlignmentsChanged")
        subscribe(self.updateImageFile, "hideAlignmentsChanged")
        subscribe(self.updateImageMap, "hideAlignmentsChanged")
        subscribe(self.updateHtmlPage, "hideAlignmentsChanged")
        
        # coSelectAlignedNodeChanged
        subscribe(self.updateCoSelectedNode, "coSelectAlignedNodeChanged")
        # self.updateCoSelectedNode() will trigger a "newNodeSelect",
        # so there is no need to subscribe others
        
        
        
    def unsubscribe(self):
        GraphView.unsubscribe(self)
        unsubscribe(self.unfoldAllNodes)
        unsubscribe(self.updateNodeFocus)
        unsubscribe(self.updateEdgeFocus)
        unsubscribe(self.updateCoSelectedNode)
        unsubscribe(self.updateFolded)
        
    # ------------------------------------------------------------------------------    
    # Event handlers
    # ------------------------------------------------------------------------------    
    
    def OnCellClicked(self, cell, x, y, event):
        linkinfo = cell.GetLink(x, y)
        
        # store node for possible use by onToggleFold        
        if linkinfo:
            self.node = linkinfo.GetHref()
        else:
            self.node = ""
        
        if event.ShiftDown():
            self.onToggleFold()
        else:
            GraphView.OnCellClicked(self, cell, x, y, event)
    
            
    def onViewPopupMenu(self, linkinfo, event):
        self.setFoldNodeItem(linkinfo)
        GraphView.onViewPopupMenu(self, linkinfo, event)
        self.resetFoldNodeItem()        

        
    def setFoldNodeItem(self, linkinfo):
        # enable and/or check the "Fold Node" menu item

        if self.node.startswith(self.from_node_prefix):
            node = self.node[len(self.from_node_prefix):]
            graph = self.aligner.get_from_graph()
            
            if graph.node_is_non_terminal(node):
                self.viewMenu.enableFoldNodeItem()
            
            if self.dotGraphPair.from_subgraph.is_folded(node):
                self.viewMenu.checkFoldNodeItem()
                
        elif self.node.startswith(self.to_node_prefix):
            node = self.node[len(self.to_node_prefix):]
            graph = self.aligner.get_to_graph()
            
            if graph.node_is_non_terminal(node):
                self.viewMenu.enableFoldNodeItem()
            
            if self.dotGraphPair.to_subgraph.is_folded(node):
                self.viewMenu.checkFoldNodeItem()
        
    
    def resetFoldNodeItem(self):
        # return to the default state, i.e.
        # disable and uncheck the "Fold Node" menu item
        self.viewMenu.disableFoldNodeItem()
        self.viewMenu.uncheckFoldNodeItem()

        
    def onToggleFold(self, evt=None):    
        if self.node.startswith(self.from_node_prefix):
            node = self.node[len(self.from_node_prefix):]
            graph = self.aligner.get_from_graph()
            
            if graph.node_is_terminal(node):
                return
            
            self.dotGraphPair.from_subgraph.toggle_node_fold(graph, node)
        elif self.node.startswith(self.to_node_prefix):
            node = self.node[len(self.to_node_prefix):]
            graph = self.aligner.get_to_graph()
            
            if graph.node_is_terminal(node):
                return
            
            self.dotGraphPair.to_subgraph.toggle_node_fold(graph, node)
        else:
            # Mouse not on a node. Should not happen, because in that case the
            # "Fold Node" menu item is disabled.
            return
        
        send(self.onToggleFold, "foldNodeChanged")
        
        
    def onUnfoldAllNodes(self, evt):
        """
        handler for the 'Unfold All Nodes' option in GraphmlViewMenu 
        """
        send(self.onUnfoldAllNodes, "unfoldAllNodes")
        
    # ------------------------------------------------------------------------------                
    # ViewMenu handlers
    # ------------------------------------------------------------------------------    
    
    def onMarkAlignedNodes(self, evt):
        """
        handler for the 'Mark Aligned Nodes" in the View menu
        """
        self.dotGraphPair.mark_aligned_nodes_option(evt.Checked())
        send(self.onMarkAlignedNodes, "markAlignedNodesChanged")
        send(self.onMarkAlignedNodes, "statusDescription", 
             "Mark Aligned Nodes option is %s" % evt.Checked())


    def onMarkSelectedNodes(self, evt):
        """
        handler for the 'Mark Selected Nodes" in the View menu
        """
        self.dotGraphPair.from_subgraph.mark_selected_nodes_option(evt.Checked())
        self.dotGraphPair.to_subgraph.mark_selected_nodes_option(evt.Checked())
        send(self.onMarkSelectedNodes, "markSelectedNodesChanged")
        send(self.onMarkSelectedNodes, "statusDescription", 
             "Mark Selected Nodes option is %s" % evt.Checked())
        
        
    def onCoSelectAlignedNode(self, evt):
        """
        handler for the 'Co-select Aligned Node' option in the View menu 
        """
        self.aligner.co_node_selection_mode(evt.Checked())
        send(self.onCoSelectAlignedNode, "coSelectAlignedNodeChanged")
        send(self.onCoSelectAlignedNode, "statusDescription", 
             "Co-select Aligned Node option is %s" % evt.Checked())
            

    def onLabelEdges(self, evt):
        """
        handler for the 'Label Edges' option in the View menu 
        """
        self.dotGraphPair.from_subgraph.label_edges_option(evt.Checked())
        self.dotGraphPair.to_subgraph.label_edges_option(evt.Checked())
        send(self.onLabelEdges, "labelEdgesChanged")
        send(self.onLabelEdges, "statusDescription", 
             "Label Edges option is %s" % evt.Checked())
        
        
    def onMarkSelectedAlignments(self, evt):
        """
        handler for the 'Mark Selected Alignments' option in View menu 
        """
        self.dotGraphPair.mark_selected_alignments_option(evt.Checked())
        send(self.onLabelEdges, "markSelectedAlignmentsChanged")
        send(self.onMarkSelectedAlignments, "statusDescription", 
             "Mark Selected Alignments option is %s" % evt.Checked())
        
    
    def onHideAlignments(self, evt):
        """
        handler for the 'Hide Alignments' option in View menu 
        """
        self.dotGraphPair.hide_alignments_option(evt.Checked())
        send(self.onHideAlignments, "hideAlignmentsChanged")
        send(self.onHideAlignments, "statusDescription", 
             "Hide Alignments option is %s" % evt.Checked())
        
        
    def onSaveImage(self, evt):
        """
        handler for the 'Save Image' option in View menu 
        """
        formats = get_output_formats()
        
        if "png" in formats:
            formats.remove("png")
            formats = ["png"] + formats
        else:
            formats.remove("dot")
            formats = ["dot"] + formats
            
        wildcard = ""
        
        for s in formats:
            wildcard += s + " (*." + s + ")|" + "*." + s + "|"
            
        wildcard = wildcard[:-1]
        
        filename = self.aligner.get_corpus_filename()
        filename = splitext(basename(filename))[0]
        filename += "_%d" % self.aligner.get_graph_pair_counter()[0]
        filename += "." + formats[0]
        
        dlg = wx.FileDialog(self, "Save image...", 
                            defaultFile=filename,
                            defaultDir=self.aligner.get_corpus_dir() or getcwd(),
                            style=wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT,
                            wildcard =wildcard)
        
        if dlg.ShowModal() == wx.ID_OK:
            file = dlg.GetPath()
            if " " in file:
                file = '"' + file + '"'
            form = formats[dlg.GetFilterIndex()]
            
            send(self.onSaveImage, "statusDescription", "Saving image to file %s ..." % file)
            draw(self.dotGraphPair.to_string(), img_file=file, img_format=form)
            send(self.onSaveImage, "statusDescription", "Saved image to file %s" % file)
            
        dlg.Destroy()

            
    ## Some experimental code to draw on the screen
    ##def OnCellMouseHover(self, cell, x, y):
        ##try:
            ##print cell.GetLink(x,y).GetHref()
            ##print cell.GetLink(x,y).GetTarget()
            
            ##dc = wx.ClientDC(self)
            ##dc.DrawCircle(100,100,25)
            
        ##except:
            ##pass
            
                    
    # ------------------------------------------------------------------------------    
    # Dotgraph updates
    # ------------------------------------------------------------------------------    
    
    def unfoldAllNodes(self, msg=None):
        receive(self.unfoldAllNodes, msg)
        
        self.dotGraphPair.from_subgraph.unfold_all()
        self.dotGraphPair.to_subgraph.unfold_all()
        
        
    def updateFolded(self, msg):
        receive(self.updateFolded, msg)
        
        self.dotGraphPair.from_subgraph.update_folded()
        self.dotGraphPair.to_subgraph.update_folded()
        
        
    def updateCoSelectedNode(self, msg=None):
        receive(self.updateCoSelectedNode, msg)
        
        from_node = self.aligner.get_from_node()
        
        if from_node:
            self.aligner.set_from_node(from_node)
        else:
            to_node = self.aligner.get_to_node()
        
            if to_node:
                self.aligner.set_to_node(to_node)

         
    def updateNodeFocus(self, msg=None): 
        receive(self.updateNodeFocus, msg)

        from_graph = self.aligner.get_from_graph()
        to_graph = self.aligner.get_to_graph()
        
        from_node = self.aligner.get_from_node()
        self.dotGraphPair.from_subgraph.update_node_focus(from_node)
        
        to_node = self.aligner.get_to_node()
        self.dotGraphPair.to_subgraph.update_node_focus(to_node)
        
        
    def updateEdgeFocus(self, msg=None): 
        receive(self.updateEdgeFocus, msg)
        
        self.dotGraphPair.clear_edge_focus()  
        
        from_node = self.aligner.get_from_node()
        to_node = self.aligner.get_aligned_to_node()
        self.dotGraphPair.update_edge_focus(from_node, to_node) 
        
        to_node= self.aligner.get_to_node()
        from_node = self.aligner.get_aligned_from_node()
        self.dotGraphPair.update_edge_focus(from_node, to_node) 
Esempio n. 4
0
 def initDotGraphPair(self):
     self.dotGraphPair = BasicDotGraphPair()
Esempio n. 5
0
class BasicGraphView(GraphView):
    """
    Basic class for viewing graphs
    """
    def initDotGraphPair(self):
        self.dotGraphPair = BasicDotGraphPair()

    def initViewMenu(self):
        self.viewMenu = BasicViewMenu(self, self.aligner, self.algraephFrame)

    def subscribe_stage_1(self):
        GraphView.subscribe_stage_1(self)

        # newGraphPair
        subscribe(self.updateEdgeFocus, "newGraphPair.viz")
        subscribe(self.updateNodeFocus, "newGraphPair.viz")
        subscribe(self.unfoldAllNodes, "newGraphPair.viz")

        # newRelation
        subscribe(self.updateEdgeFocus, "newRelation.viz")

        # newNodeSelect
        subscribe(self.updateNodeFocus, "newNodeSelect.viz")
        subscribe(self.updateEdgeFocus, "newNodeSelect.viz")

        # newNodeSelect
        # ********* FIXME: following updates may be superfluous
        subscribe(self.updateAlignment, "newNodeSelect.viz")

    def subscribe_stage_3(self):
        GraphView.subscribe_stage_3(self)

        # newNodeSelect
        # ********* FIXME: following updates may be superfluous
        subscribe(self.updateImageFile, "newNodeSelect.gui")
        subscribe(self.updateHtmlPage, "newNodeSelect.gui")

        # foldNodeChanged
        subscribe(self.updateFromGraph, "foldNodeChanged")
        subscribe(self.updateToGraph, "foldNodeChanged")
        # hidden nodes may be focused or aligned, so we need to refresh
        # node focus, edge focus and aligment as well, which check themselves
        # if any nodes have now become hidden
        subscribe(self.updateNodeFocus, "foldNodeChanged")
        subscribe(self.updateEdgeFocus, "foldNodeChanged")
        subscribe(self.updateAlignment, "foldNodeChanged")
        subscribe(self.updateFolded, "foldNodeChanged")
        subscribe(self.updateImageFile, "foldNodeChanged")
        subscribe(self.updateImageMap, "foldNodeChanged")
        subscribe(self.updateHtmlPage, "foldNodeChanged")

        # unfoldAllNodes
        subscribe(self.unfoldAllNodes, "unfoldAllNodes")
        subscribe(self.updateFromGraph, "unfoldAllNodes")
        subscribe(self.updateToGraph, "unfoldAllNodes")
        subscribe(self.updateAlignment, "unfoldAllNodes")
        subscribe(self.updateImageFile, "unfoldAllNodes")
        subscribe(self.updateImageMap, "unfoldAllNodes")
        subscribe(self.updateHtmlPage, "unfoldAllNodes")

        # markSelectedNodesChanged
        subscribe(self.updateNodeFocus, "markSelectedNodesChanged")
        subscribe(self.updateFromGraph, "markSelectedNodesChanged")
        subscribe(self.updateToGraph, "markSelectedNodesChanged")
        subscribe(self.updateImageFile, "markSelectedNodesChanged")
        subscribe(self.updateHtmlPage, "markSelectedNodesChanged")

        # markAlignedNodesChanged
        subscribe(self.updateAlignment, "markAlignedNodesChanged")
        subscribe(self.updateImageFile, "markAlignedNodesChanged")
        subscribe(self.updateHtmlPage, "markAlignedNodesChanged")

        # labelEdgesChanged
        subscribe(self.updateFromGraph, "labelEdgesChanged")
        subscribe(self.updateToGraph, "labelEdgesChanged")
        subscribe(self.updateImageFile, "labelEdgesChanged")
        subscribe(self.updateImageMap, "labelEdgesChanged")
        subscribe(self.updateHtmlPage, "labelEdgesChanged")

        # markSelectedAlignmentsChanged
        subscribe(self.updateEdgeFocus, "markSelectedAlignmentsChanged")
        subscribe(self.updateAlignment, "markSelectedAlignmentsChanged")
        subscribe(self.updateImageFile, "markSelectedAlignmentsChanged")
        subscribe(self.updateHtmlPage, "markSelectedAlignmentsChanged")

        # hideAlignmentsChanged
        subscribe(self.updateAlignment, "hideAlignmentsChanged")
        subscribe(self.updateImageFile, "hideAlignmentsChanged")
        subscribe(self.updateImageMap, "hideAlignmentsChanged")
        subscribe(self.updateHtmlPage, "hideAlignmentsChanged")

        # coSelectAlignedNodeChanged
        subscribe(self.updateCoSelectedNode, "coSelectAlignedNodeChanged")
        # self.updateCoSelectedNode() will trigger a "newNodeSelect",
        # so there is no need to subscribe others

    def unsubscribe(self):
        GraphView.unsubscribe(self)
        unsubscribe(self.unfoldAllNodes)
        unsubscribe(self.updateNodeFocus)
        unsubscribe(self.updateEdgeFocus)
        unsubscribe(self.updateCoSelectedNode)
        unsubscribe(self.updateFolded)

    # ------------------------------------------------------------------------------
    # Event handlers
    # ------------------------------------------------------------------------------

    def OnCellClicked(self, cell, x, y, event):
        linkinfo = cell.GetLink(x, y)

        # store node for possible use by onToggleFold
        if linkinfo:
            self.node = linkinfo.GetHref()
        else:
            self.node = ""

        if event.ShiftDown():
            self.onToggleFold()
        else:
            GraphView.OnCellClicked(self, cell, x, y, event)

    def onViewPopupMenu(self, linkinfo, event):
        self.setFoldNodeItem(linkinfo)
        GraphView.onViewPopupMenu(self, linkinfo, event)
        self.resetFoldNodeItem()

    def setFoldNodeItem(self, linkinfo):
        # enable and/or check the "Fold Node" menu item

        if self.node.startswith(self.from_node_prefix):
            node = self.node[len(self.from_node_prefix):]
            graph = self.aligner.get_from_graph()

            if graph.node_is_non_terminal(node):
                self.viewMenu.enableFoldNodeItem()

            if self.dotGraphPair.from_subgraph.is_folded(node):
                self.viewMenu.checkFoldNodeItem()

        elif self.node.startswith(self.to_node_prefix):
            node = self.node[len(self.to_node_prefix):]
            graph = self.aligner.get_to_graph()

            if graph.node_is_non_terminal(node):
                self.viewMenu.enableFoldNodeItem()

            if self.dotGraphPair.to_subgraph.is_folded(node):
                self.viewMenu.checkFoldNodeItem()

    def resetFoldNodeItem(self):
        # return to the default state, i.e.
        # disable and uncheck the "Fold Node" menu item
        self.viewMenu.disableFoldNodeItem()
        self.viewMenu.uncheckFoldNodeItem()

    def onToggleFold(self, evt=None):
        if self.node.startswith(self.from_node_prefix):
            node = self.node[len(self.from_node_prefix):]
            graph = self.aligner.get_from_graph()

            if graph.node_is_terminal(node):
                return

            self.dotGraphPair.from_subgraph.toggle_node_fold(graph, node)
        elif self.node.startswith(self.to_node_prefix):
            node = self.node[len(self.to_node_prefix):]
            graph = self.aligner.get_to_graph()

            if graph.node_is_terminal(node):
                return

            self.dotGraphPair.to_subgraph.toggle_node_fold(graph, node)
        else:
            # Mouse not on a node. Should not happen, because in that case the
            # "Fold Node" menu item is disabled.
            return

        send(self.onToggleFold, "foldNodeChanged")

    def onUnfoldAllNodes(self, evt):
        """
        handler for the 'Unfold All Nodes' option in GraphmlViewMenu 
        """
        send(self.onUnfoldAllNodes, "unfoldAllNodes")

    # ------------------------------------------------------------------------------
    # ViewMenu handlers
    # ------------------------------------------------------------------------------

    def onMarkAlignedNodes(self, evt):
        """
        handler for the 'Mark Aligned Nodes" in the View menu
        """
        self.dotGraphPair.mark_aligned_nodes_option(evt.Checked())
        send(self.onMarkAlignedNodes, "markAlignedNodesChanged")
        send(self.onMarkAlignedNodes, "statusDescription",
             "Mark Aligned Nodes option is %s" % evt.Checked())

    def onMarkSelectedNodes(self, evt):
        """
        handler for the 'Mark Selected Nodes" in the View menu
        """
        self.dotGraphPair.from_subgraph.mark_selected_nodes_option(
            evt.Checked())
        self.dotGraphPair.to_subgraph.mark_selected_nodes_option(evt.Checked())
        send(self.onMarkSelectedNodes, "markSelectedNodesChanged")
        send(self.onMarkSelectedNodes, "statusDescription",
             "Mark Selected Nodes option is %s" % evt.Checked())

    def onCoSelectAlignedNode(self, evt):
        """
        handler for the 'Co-select Aligned Node' option in the View menu 
        """
        self.aligner.co_node_selection_mode(evt.Checked())
        send(self.onCoSelectAlignedNode, "coSelectAlignedNodeChanged")
        send(self.onCoSelectAlignedNode, "statusDescription",
             "Co-select Aligned Node option is %s" % evt.Checked())

    def onLabelEdges(self, evt):
        """
        handler for the 'Label Edges' option in the View menu 
        """
        self.dotGraphPair.from_subgraph.label_edges_option(evt.Checked())
        self.dotGraphPair.to_subgraph.label_edges_option(evt.Checked())
        send(self.onLabelEdges, "labelEdgesChanged")
        send(self.onLabelEdges, "statusDescription",
             "Label Edges option is %s" % evt.Checked())

    def onMarkSelectedAlignments(self, evt):
        """
        handler for the 'Mark Selected Alignments' option in View menu 
        """
        self.dotGraphPair.mark_selected_alignments_option(evt.Checked())
        send(self.onLabelEdges, "markSelectedAlignmentsChanged")
        send(self.onMarkSelectedAlignments, "statusDescription",
             "Mark Selected Alignments option is %s" % evt.Checked())

    def onHideAlignments(self, evt):
        """
        handler for the 'Hide Alignments' option in View menu 
        """
        self.dotGraphPair.hide_alignments_option(evt.Checked())
        send(self.onHideAlignments, "hideAlignmentsChanged")
        send(self.onHideAlignments, "statusDescription",
             "Hide Alignments option is %s" % evt.Checked())

    def onSaveImage(self, evt):
        """
        handler for the 'Save Image' option in View menu 
        """
        formats = get_output_formats()

        if "png" in formats:
            formats.remove("png")
            formats = ["png"] + formats
        else:
            formats.remove("dot")
            formats = ["dot"] + formats

        wildcard = ""

        for s in formats:
            wildcard += s + " (*." + s + ")|" + "*." + s + "|"

        wildcard = wildcard[:-1]

        filename = self.aligner.get_corpus_filename()
        filename = splitext(basename(filename))[0]
        filename += "_%d" % self.aligner.get_graph_pair_counter()[0]
        filename += "." + formats[0]

        dlg = wx.FileDialog(self,
                            "Save image...",
                            defaultFile=filename,
                            defaultDir=self.aligner.get_corpus_dir()
                            or getcwd(),
                            style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT,
                            wildcard=wildcard)

        if dlg.ShowModal() == wx.ID_OK:
            file = dlg.GetPath()
            if " " in file:
                file = '"' + file + '"'
            form = formats[dlg.GetFilterIndex()]

            send(self.onSaveImage, "statusDescription",
                 "Saving image to file %s ..." % file)
            draw(self.dotGraphPair.to_string(), img_file=file, img_format=form)
            send(self.onSaveImage, "statusDescription",
                 "Saved image to file %s" % file)

        dlg.Destroy()

    ## Some experimental code to draw on the screen
    ##def OnCellMouseHover(self, cell, x, y):
    ##try:
    ##print cell.GetLink(x,y).GetHref()
    ##print cell.GetLink(x,y).GetTarget()

    ##dc = wx.ClientDC(self)
    ##dc.DrawCircle(100,100,25)

    ##except:
    ##pass

    # ------------------------------------------------------------------------------
    # Dotgraph updates
    # ------------------------------------------------------------------------------

    def unfoldAllNodes(self, msg=None):
        receive(self.unfoldAllNodes, msg)

        self.dotGraphPair.from_subgraph.unfold_all()
        self.dotGraphPair.to_subgraph.unfold_all()

    def updateFolded(self, msg):
        receive(self.updateFolded, msg)

        self.dotGraphPair.from_subgraph.update_folded()
        self.dotGraphPair.to_subgraph.update_folded()

    def updateCoSelectedNode(self, msg=None):
        receive(self.updateCoSelectedNode, msg)

        from_node = self.aligner.get_from_node()

        if from_node:
            self.aligner.set_from_node(from_node)
        else:
            to_node = self.aligner.get_to_node()

            if to_node:
                self.aligner.set_to_node(to_node)

    def updateNodeFocus(self, msg=None):
        receive(self.updateNodeFocus, msg)

        from_graph = self.aligner.get_from_graph()
        to_graph = self.aligner.get_to_graph()

        from_node = self.aligner.get_from_node()
        self.dotGraphPair.from_subgraph.update_node_focus(from_node)

        to_node = self.aligner.get_to_node()
        self.dotGraphPair.to_subgraph.update_node_focus(to_node)

    def updateEdgeFocus(self, msg=None):
        receive(self.updateEdgeFocus, msg)

        self.dotGraphPair.clear_edge_focus()

        from_node = self.aligner.get_from_node()
        to_node = self.aligner.get_aligned_to_node()
        self.dotGraphPair.update_edge_focus(from_node, to_node)

        to_node = self.aligner.get_to_node()
        from_node = self.aligner.get_aligned_from_node()
        self.dotGraphPair.update_edge_focus(from_node, to_node)
Esempio n. 6
0
    def __init__(
            self,
            name="",
            node_prefix="",
            graph_attr=dict(
                splines="true",
                #ordering="out",
                ranksep=0.25,
                nodesep=0.1,
                # size of margin depends on particular version of dot...
                #margin=-0.25
            ),
            node_attr=dict(
                fontname="sans",
                fontsize="9",
                #style="bold",
                height=".1",
                shape="plaintext"),
            edge_attr=dict(
                fontname="sans",
                color="limegreen",
                fontsize="8",
                weight="0",
                constraint="false",
                #arrowhead="none",
                #style="dashed,bold"
                #headclip="false",
                #tailclip="false"
            ),
            from_graph_attr=dict(color="white",
                                 #ordering="out"
                                 ),
            from_node_attr=dict(fontcolor="blue"),
            from_edge_attr=dict(
                weight="100",
                style="solid",
                color="gray",
                arrowhead="none",
                constraint="true",
                #headclip="true",
                #tailclip="true",
            ),
            to_graph_attr=dict(color="white",
                               #ordering="out"
                               ),
            to_node_attr=dict(fontcolor="red"),
            to_edge_attr=dict(
                weight="100",
                style="solid",
                color="gray",
                arrowhead="none",
                constraint="true",
                #headclip="true",
                #tailclip="true",
            ),
            subgraph_class=AlpinoDotSubGraph):

        BasicDotGraphPair.__init__(self, name, node_prefix, graph_attr,
                                   node_attr, edge_attr, from_graph_attr,
                                   from_node_attr, from_edge_attr,
                                   to_graph_attr, to_node_attr, to_edge_attr,
                                   subgraph_class)