Query Panel

The Imagix 4D database for your project typically contains a very large amount of data. Across the entire code base you've loaded into the project, Imagix 4D collects information about a wide range of symbol types, a wide range of reltationships or dependencies among these symbol types, and a large number of of attributes about each symbol. The gui filters this to show you the specific portion of this information that you need for your current question. Focusing on the specific part of the information that you want to see is a primary aspect of using Imaghix 4D.

Sometimes this is done by navigating from what you are currently viewing. The individual Imagix 4D displays are optimized for this navigation, so that you can quickly move from what you are seeing to what you might like to see next. In the Graph window, there are some advanced way of manipulating the info in the window; the term we use to describe this is graphical querying.

But other times, the change in focus and content is more fundamental, refering back to the full database rather than just those portions of the data that are closely related to what you're currently viewing. The main tools for this type of query reside in the Query panel.

The Query panel also contains the Mapper tab. Mapper supplements Main panel displays, showing a wider view of the contents of a Graph window or File Editor, and supporting scrolling through those displays. From this usage standpoint, Mapper might be grouped with the Context panel tabs along the left side of the main window. However, because of its form factor, Mapper is placed here in the Query panel.

Database Lookup

The Database Lookup tab enables identification of symbols in your software based on their names, types and attributes.

Name matching includes the use of "*" as a wildcard character. So a symbol named SomeErrorHandler would be found via any of the following name searches: "SomeErrorHandler", "*ErrorHandler", "Some*Handler", *Error*". If a case insensitive name lookup is enabled through the Aa button, a name search on "*error*" would also return SomeErrorHandler.

The database lookup can be limited to symbols of certain types through the Any Symbol menubutton. The Options... dialog enables further filtering of the lookup, based on symbol attributes, such as scope, file location, and metrics value. For example, you could search for functions whose name ends in "handler", are of global scope, and have a cyclomatic complexity of over 10.

Because many of the attributes are symbol type specific, it is important to set the symbol type filter before setting the attribute filter.

Shortcut: A database lookup can be invoked directly from the File Editor. Control-B will initiate a lookup using the string currently selected in the editor.

Grep Search

The Grep Search tab searches for strings in the source code of your project. Left clicking on the reported matches provides navigation to the source code where the matches occur. Right clicking on the matches accesses further graphical analysis of the grep search results via the Analyzer functionality.

Through the Advanced button, you can access the Advanced Grep Search dialog for additional string search functionality. You're able to limit the scope of which lines of source code are searched, including further filtering of those lines that match your most recent search (current grep results). You can also control how the search is conducted with respect to case sensitivity, whole word matching, and the use of extended regular expressions.

Shortcut: A grep search can be invoked directly from the File Editor. Control-G will initiate a search using the string currently selected in the editor.


The Graph windows contain a series of controls for low-level, fine grained graphical analysis of your software. The Analyzer tab complements these. Analyzer provides a list of advanced, high level queries that generate graphs providing insight into many key aspects of the usage and dependencies of a symbol. The resulting graphs might be sufficient in themselves for your problem at hand, or might serve as the starting point for a new line of lower-level graphical queries.

The Analyzer queries are specific to the symbol type. For a class, you might study aspects of its public interface, its internal control flow, where its members are used, any dependencies it has, as well as such common things as class inheritance. For functions, you can see many aspect of its role in control flow and variable usage, such as functions or global variables that are only called or used through it.

For some analysis, you might want to examine multiple aspects of the symbol, side-by-side. The New Graph button on the Analyzer tab enables you to create an additional graph without replacing the current one.

In addition to these analyses focused on a single symbol, Analyzer provides dependency analysis of the relationships between two symbols. These include finding transitive relationships, such any paths by which one function calls or is called by another, one file includes another, or one variable gets indirectly set by a function. It also includes analysis of shared hierarchies, such as any functions that indirectly read two specific variables, or any variables that are set by two specific functions.

Invoke: Focusing Analyzer is done through the context sensitive menu by right clicking on a symbol in any display. Quicker still is to Alt-left click on the symbol.

Shortcut: For the two symbol relationship queries, a second symbol needs to be specified along with the primary focus of Analyzer. The relationship queries have a pop-up filed that allows the symbol to be selected. However, the default second symbol is the previous Analyzer focus. So the easiest way to specify a relationship query is to focus Analyzer on one of the two symbols, then focus it on the other.