summaryrefslogtreecommitdiff
path: root/TAO/utils/wxNamingViewer/wxNamingTree.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/utils/wxNamingViewer/wxNamingTree.cpp')
-rw-r--r--TAO/utils/wxNamingViewer/wxNamingTree.cpp566
1 files changed, 566 insertions, 0 deletions
diff --git a/TAO/utils/wxNamingViewer/wxNamingTree.cpp b/TAO/utils/wxNamingViewer/wxNamingTree.cpp
new file mode 100644
index 00000000000..c8e617d475e
--- /dev/null
+++ b/TAO/utils/wxNamingViewer/wxNamingTree.cpp
@@ -0,0 +1,566 @@
+// @file wxNamingTree.cpp
+//
+// @author Charlie Frasch <cfrasch@atdesk.com>
+//
+// $Id$
+
+#include "pch.h"
+#include "wxNamingTree.h"
+
+#include "wx/clipbrd.h"
+#include "wxAutoDialog.h"
+#include "wxBindNewContext.h"
+#include "wxNamingObject.h"
+#include "wxBindDialog.h"
+#include "wxViewIORDialog.h"
+
+
+BEGIN_EVENT_TABLE( WxNamingTree, wxTreeCtrl)
+ EVT_MENU(
+ contextPopupBindContext,
+ WxNamingTree::onContextPopupBindContext)
+ EVT_MENU(
+ contextPopupBindNewContext,
+ WxNamingTree::onContextPopupBindNewContext)
+ EVT_MENU(
+ contextPopupBindObject,
+ WxNamingTree::onContextPopupBindObject)
+ EVT_MENU(
+ contextPopupDestroy,
+ WxNamingTree::onContextPopupDestroy)
+ EVT_MENU(
+ contextPopupRefresh,
+ WxNamingTree::onContextPopupRefresh)
+ EVT_MENU(
+ contextPopupUnbind,
+ WxNamingTree::onContextPopupUnbind)
+ EVT_MENU(
+ contextPopupViewReference,
+ WxNamingTree::onPopupViewReference)
+ EVT_MENU(
+ objectPopupUnbind,
+ WxNamingTree::onObjectPopupUnbind)
+ EVT_MENU(
+ objectPopupViewReference,
+ WxNamingTree::onPopupViewReference)
+ EVT_TREE_ITEM_EXPANDING(
+ WxNamingTree::treeCtrl,
+ WxNamingTree::onItemExpanding)
+ // For some reason RIGHT_UP doesn't work
+ EVT_RIGHT_DOWN( WxNamingTree::onRMouseUClick)
+ EVT_LEFT_DCLICK( WxNamingTree::onLeftDClick)
+END_EVENT_TABLE()
+
+
+WxNamingTree::WxNamingTree(
+ wxWindow* parent,
+ const wxWindowID id):
+ wxTreeCtrl(
+ parent,
+ id,
+ wxDefaultPosition,
+ wxSize( 234, 149)),
+ orb( 0)
+{
+ contextPopup = new wxMenu();
+ contextPopup->Append( contextPopupBindContext, "Bind context");
+ contextPopup->Append( contextPopupBindNewContext, "Bind new context");
+ contextPopup->Append( contextPopupBindObject, "Bind object");
+ contextPopup->Append( contextPopupUnbind, "Unbind");
+ contextPopup->Append( contextPopupDestroy, "Destroy");
+ contextPopup->Append( contextPopupViewReference, "View reference");
+ contextPopup->Append( contextPopupRefresh, "Refresh");
+
+ objectPopup = new wxMenu();
+ objectPopup->Append( objectPopupUnbind, "Unbind");
+ objectPopup->Append( objectPopupViewReference, "View reference");
+}
+
+
+WxNamingTree::~WxNamingTree()
+{
+ clearChildren();
+}
+
+void WxNamingTree::clearChildren( void)
+{
+ wxTreeItemId item = GetRootItem();
+ if (item) {
+
+ clearChildren( item);
+ Delete( item);
+
+ }
+}
+
+void WxNamingTree::clearChildren( wxTreeItemId& item)
+{
+ long cookie;
+ wxTreeItemId child = GetFirstChild( item, cookie);
+ while( child) {
+
+ clearChildren( child);
+ Delete( child);
+ child = GetFirstChild( item, cookie);
+
+ }
+}
+
+
+void WxNamingTree::copySelectedToClipboard()
+{
+ WxNamingObject* object = getTreeObject();
+ try {
+
+ wxString ior = orb->object_to_string( object->Object());
+ if (wxTheClipboard->Open()) {
+
+ wxTheClipboard->SetData( new wxTextDataObject( ior));
+ wxTheClipboard->Close();
+
+ }
+
+ } catch( CORBA::Exception& ex) {
+
+ wxMessageBox( ex._rep_id(), "CORBA::Exception");
+
+ }
+}
+
+
+WxNamingObject* WxNamingTree::getTreeObject( void) const
+{
+ wxTreeItemId item = GetSelection();
+ if (item == wxTreeItemId( (wxGenericTreeItem*)0)) {
+ return 0;
+ }
+ return getTreeObject (item);
+}
+
+WxNamingObject* WxNamingTree::getTreeObject( wxTreeItemId& item) const
+{
+ WxNamingObject* object = static_cast<WxNamingObject*>(
+ GetItemData( item));
+ return object;
+}
+
+
+void WxNamingTree::listBindingList(
+ wxTreeItemId& item,
+ CosNaming::NamingContext_ptr context,
+ CosNaming::BindingList_var& bl)
+{
+ try {
+
+ for( unsigned int i=0; i < bl->length(); i++) {
+
+ // Add each entry into the tree control
+ CORBA::Object_var object = context->resolve( bl[i].binding_name);
+ bool isContext =(bl[i].binding_type == CosNaming::ncontext);
+ WxNamingObject* newObject = new WxNamingObject(
+ bl[i].binding_name,
+ object.in(),
+ isContext);
+ wxString name = static_cast<const char*>( (bl[i].binding_name[0]).id);
+ const wxString kind = static_cast<const char*>( (bl[i].binding_name[0]).kind);
+ if (!kind.IsNull()) {
+
+ name << " | " << kind;
+
+ }
+ wxTreeItemId contextItem = AppendItem( item, name);
+ SetItemData( contextItem, newObject);
+ switch( bl[i].binding_type) {
+
+ case CosNaming::ncontext: {
+
+ // TODO: set a different icon for contexts
+ // TODO: set only if there are children
+ SetItemHasChildren( contextItem);
+
+ }
+ break;
+
+ case CosNaming::nobject:
+ break;
+
+ }
+
+ }
+
+ } catch( CORBA::Exception& ex) {
+
+ wxMessageBox( ex._rep_id(), "CORBA::Exception");
+
+ }
+}
+
+
+void WxNamingTree::listContext( wxTreeItemId& item)
+{
+// TODO: use hourglass
+// SetCursor( *wxHOURGLASS_CURSOR);
+ try {
+
+ // Get the item's object and make sure we have a context
+ WxNamingObject* namingObject = getTreeObject( item);
+ CosNaming::NamingContext_var context = namingObject->NamingContext();
+ if (CORBA::is_nil( context.in ())) {
+
+ return;
+
+ }
+
+ // List the context's entries
+ CosNaming::BindingList_var bl;
+ CosNaming::BindingIterator_var bi;
+ context->list( listQuantum, bl, bi);
+ listBindingList( item, context.in(), bl);
+ if (!CORBA::is_nil( bi.in ())) {
+
+ while( bl->length()) {
+
+ wxString text;
+ text << "This context contains more than " << listQuantum <<
+ " entries, list the next " << listQuantum << "?";
+ if (wxMessageBox(
+ text,
+ "Question",
+ wxYES_NO | wxICON_QUESTION) == wxYES) {
+
+ bi->next_n( listQuantum, bl);
+ listBindingList( item, context.in(), bl);
+
+ }
+
+ }
+ bi->destroy();
+
+ }
+
+ } catch( CORBA::Exception& ex) {
+
+ wxMessageBox( ex._rep_id(), "CORBA::Exception");
+
+ }
+
+}
+
+
+void WxNamingTree::onContextPopupBindContext( wxCommandEvent& event)
+{
+ WxAutoDialog<WxBindDialog> dialog( new WxBindDialog(
+ true,
+ orb,
+ this));
+ if (dialog->ShowModal() != wxID_OK) {
+
+ return;
+
+ }
+ try {
+
+ WxNamingObject* object = getTreeObject();
+ CosNaming::NamingContext_var context = object->NamingContext();
+ if (CORBA::is_nil( context.in ())) {
+
+ return;
+
+ }
+ CosNaming::NamingContext_var newContext =
+ CosNaming::NamingContext::_narrow( dialog->getObject());
+ if (CORBA::is_nil( newContext.in ())) {
+
+ wxMessageBox(
+ "Object is not a CosNaming::NamingContext",
+ "Error",
+ wxOK | wxICON_EXCLAMATION,
+ this);
+ return;
+
+ }
+ context->bind_context(
+ dialog->getName(),
+ newContext.in ());
+ onContextPopupRefresh( event);
+
+ } catch( CORBA::Exception& ex) {
+
+ wxMessageBox(
+ ex._rep_id(),
+ "CORBA::Exception");
+
+ }
+}
+
+
+void WxNamingTree::onContextPopupBindObject( wxCommandEvent& event)
+{
+ WxAutoDialog<WxBindDialog> dialog( new WxBindDialog(
+ false,
+ orb,
+ this));
+ if (dialog->ShowModal() != wxID_OK) {
+
+ return;
+
+ }
+ try {
+
+ wxTreeItemId item = GetSelection();
+ WxNamingObject* object = getTreeObject( item);
+ CosNaming::NamingContext_var context = object->NamingContext();
+ if (CORBA::is_nil( context.in ())) {
+
+ return;
+
+ }
+ context->bind( dialog->getName(), dialog->getObject());
+ onContextPopupRefresh( event);
+
+ } catch( CORBA::Exception& ex) {
+
+ wxMessageBox(
+ ex._rep_id(),
+ "CORBA::Exception");
+
+ }
+}
+
+
+void WxNamingTree::onContextPopupBindNewContext( wxCommandEvent& event)
+{
+ wxTreeItemId item = GetSelection();
+ WxNamingObject* object = getTreeObject( item);
+ CosNaming::NamingContext_var context = object->NamingContext();
+ if (CORBA::is_nil( context.in ())) {
+
+ return;
+
+ }
+ WxAutoDialog<WxBindNewContext> dialog( new WxBindNewContext( this));
+ if (dialog->ShowModal() != wxID_OK) {
+
+ return;
+
+ }
+ try {
+
+ CosNaming::NamingContext_var newContext = context->new_context();
+ context->bind_context( dialog->getName(), newContext.in ());
+ onContextPopupRefresh( event);
+
+ } catch( CORBA::Exception& ex) {
+
+ wxMessageBox(
+ ex._rep_id(),
+ "CORBA::Exception");
+
+ }
+}
+
+
+void WxNamingTree::onContextPopupDestroy( wxCommandEvent&)
+{
+ if (wxMessageBox(
+ "Are you sure you want to destroy this object?",
+ "Confirm",
+ wxYES_NO | wxICON_QUESTION) != wxYES) {
+
+ return;
+
+ }
+ wxTreeItemId item = GetSelection();
+ wxTreeItemId parentItem = GetParent( item);
+ if (parentItem == 0) {
+
+ return;
+
+ }
+ WxNamingObject* object = getTreeObject( item);
+ WxNamingObject* parentObject = getTreeObject( parentItem);
+ CosNaming::NamingContext_var parentNaming = parentObject->NamingContext();
+ try {
+
+ // First try to destroy, it will raise an exception if it's not empty
+ CosNaming::NamingContext_var context = object->NamingContext();
+ context->destroy();
+ // OK it's destroyed, cleanup any children we might have lying aroung
+ clearChildren( item);
+ Delete( item);
+ // Do the unbind
+ parentNaming->unbind( object->Name());
+
+ } catch( CORBA::Exception& ex) {
+
+ wxMessageBox( ex._rep_id(), "CORBA::Exception");
+
+ }
+}
+
+
+void WxNamingTree::onContextPopupRefresh( wxCommandEvent&)
+{
+ wxTreeItemId item = GetSelection();
+ clearChildren( item);
+ listContext( item);
+}
+
+
+void WxNamingTree::onContextPopupUnbind( wxCommandEvent&)
+{
+ if (wxMessageBox(
+ "Are you sure you want to unbind this context?",
+ "Confirm",
+ wxYES_NO | wxICON_QUESTION) != wxYES) {
+
+ return;
+
+ }
+ wxTreeItemId item = GetSelection();
+ wxTreeItemId parentItem = GetParent( item);
+ if (parentItem == 0) {
+
+ return;
+
+ }
+ WxNamingObject* object = getTreeObject( item);
+ WxNamingObject* parent = getTreeObject( parentItem);
+ CosNaming::NamingContext_var context = parent->NamingContext();
+ try {
+
+ context->unbind( object->Name());
+ clearChildren( item);
+ Delete( item);
+
+ } catch( CORBA::Exception& ex) {
+
+ wxMessageBox( ex._rep_id(), "CORBA::Exception");
+
+ }
+}
+
+
+void WxNamingTree::onItemExpanding( wxTreeEvent& event)
+{
+
+ wxTreeItemId item = event.GetItem();
+ // If this item has a child it has already been listed so nothing to do.
+ if (GetLastChild( item) != wxTreeItemId( 0L)) {
+
+ return;
+
+ }
+ listContext( item);
+}
+
+
+void WxNamingTree::onLeftDClick( wxMouseEvent& event)
+{
+ wxTreeItemId item = HitTest( event.GetPosition());
+ if (!item) {
+
+ return;
+ }
+ WxAutoDialog<WxViewIORDialog> dialog( new WxViewIORDialog(
+ orb,
+ getTreeObject( item)->Object(),
+ this));
+
+ dialog->ShowModal();
+}
+
+
+void WxNamingTree::onObjectPopupUnbind( wxCommandEvent& )
+{
+ if (wxMessageBox(
+ "Are you sure you want to unbind this object?",
+ "Confirm",
+ wxYES_NO | wxICON_QUESTION) != wxYES) {
+
+ return;
+
+ }
+ wxTreeItemId item = GetSelection();
+
+ // Make sure we don't unbind "Root"
+ wxTreeItemId parentItem = GetParent( item);
+ if (parentItem == 0) {
+
+ return;
+
+ }
+ WxNamingObject* object = getTreeObject( item);
+ WxNamingObject* parent = getTreeObject( parentItem);
+ CosNaming::NamingContext_var context = parent->NamingContext();
+ try {
+
+ context->unbind( object->Name());
+ clearChildren( item);
+ Delete( item);
+
+ } catch( CORBA::Exception& ex) {
+
+ wxMessageBox( ex._rep_id(), "CORBA::Exception");
+
+ }
+}
+
+
+void WxNamingTree::onPopupViewReference( wxCommandEvent&)
+{
+ WxAutoDialog<WxViewIORDialog> dialog( new WxViewIORDialog(
+ orb,
+ getTreeObject()->Object(),
+ this));
+
+ dialog->ShowModal();
+}
+
+
+void WxNamingTree::onRMouseUClick( wxMouseEvent& event)
+{
+ wxTreeItemId item = HitTest( event.GetPosition());
+ if (!item) {
+
+ return;
+ }
+ // First select the item, then popup the appropriate menu
+ SelectItem( item);
+ WxNamingObject* object = getTreeObject( item);
+ CosNaming::NamingContext_var context = object->NamingContext();
+ if (CORBA::is_nil( context.in ())) {
+
+ PopupMenu( objectPopup, event.m_x, event.m_y);
+
+ } else {
+
+ contextPopup->Enable( contextPopupDestroy, item != GetRootItem());
+ contextPopup->Enable( contextPopupUnbind, item != GetRootItem());
+ PopupMenu( contextPopup, event.m_x, event.m_y);
+
+ }
+}
+
+void WxNamingTree::resolve( CosNaming::NamingContext_ptr pRootContext)
+{
+ clearChildren();
+ if (!CORBA::is_nil( pRootContext)) {
+
+ wxTreeItemId item = AddRoot( "Root");
+ SetItemData( item, new WxNamingObject( pRootContext));
+ listContext( item);
+
+ } else {
+
+ AddRoot( "<null>");
+
+ }
+}
+
+void WxNamingTree::setOrb( CORBA::ORB_ptr pOrb)
+{
+ // This can only be called once!
+ assert( orb == 0);
+ orb = pOrb;
+}