diff --git a/build/jam/OptionalPackageDependencies b/build/jam/OptionalPackageDependencies index 650783dc8f..aa4a525d3b 100644 --- a/build/jam/OptionalPackageDependencies +++ b/build/jam/OptionalPackageDependencies @@ -20,6 +20,7 @@ OptionalPackageDependencies Git : Expat Curl OpenSSL LibIconv ; OptionalPackageDependencies GitDoc : Man Git ; OptionalPackageDependencies ICU-devel : DevelopmentBase ; OptionalPackageDependencies LibLayout : DevelopmentBase ; +OptionalPackageDependencies LibXML2 : XZ-Utils ; OptionalPackageDependencies Man : Groff ; OptionalPackageDependencies Tar : LibIconv ; OptionalPackageDependencies Python : Bzip ; diff --git a/build/jam/OptionalPackages b/build/jam/OptionalPackages index ad77d54041..f4b3dd97b6 100644 --- a/build/jam/OptionalPackages +++ b/build/jam/OptionalPackages @@ -475,13 +475,13 @@ if [ IsOptionalHaikuImagePackageAdded CMake ] { } else { if $(HAIKU_GCC_VERSION[1]) >= 4 { InstallOptionalHaikuImagePackage - cmake-2.8.4-r1a3-x86-gcc4-2011-05-23.zip - : $(baseURL)/cmake-2.8.4-r1a3-x86-gcc4-2011-05-23.zip + cmake-2.8.5-x86-gcc4-2012-07-18.zip + : $(baseURL)/cmake-2.8.5-x86-gcc4-2012-07-18.zip : : true ; } else { InstallOptionalHaikuImagePackage - cmake-2.8.4-r1a3-x86-gcc2-2011-05-19.zip - : $(baseURL)/cmake-2.8.4-r1a3-x86-gcc2-2011-05-19.zip + cmake-2.8.5-x86-gcc2-2012-07-16.zip + : $(baseURL)/cmake-2.8.5-x86-gcc2-2012-07-16.zip : : true ; } } @@ -1206,12 +1206,12 @@ if [ IsOptionalHaikuImagePackageAdded LibXML2 ] { } else { if $(HAIKU_GCC_VERSION[1]) >= 4 { InstallOptionalHaikuImagePackage - libxml2-2.8.0-x86-gcc4-2012-06-18.zip - : $(baseURL)/libxml2-2.8.0-x86-gcc4-2012-06-18.zip ; + libxml2-2.8.0-x86-gcc4-2012-07-18.zip + : $(baseURL)/libxml2-2.8.0-x86-gcc4-2012-07-18.zip ; } else { InstallOptionalHaikuImagePackage - libxml2-2.8.0-x86-gcc2-2012-06-21.zip - : $(baseURL)/libxml2-2.8.0-x86-gcc2-2012-06-21.zip ; + libxml2-2.8.0-x86-gcc2-2012-07-17.zip + : $(baseURL)/libxml2-2.8.0-x86-gcc2-2012-07-17.zip ; } } } @@ -1986,8 +1986,8 @@ if [ IsOptionalHaikuImagePackageAdded XZ-Utils ] { Echo "No optional package XZ-Utils available for $(TARGET_ARCH)" ; } else { InstallOptionalHaikuImagePackage - xz-utils-5.0.1-r1a3-x86-gcc4-2011-05-24.zip - : $(baseURL)/xz-utils-5.0.1-r1a3-x86-gcc4-2011-05-24.zip ; + xz-utils-5.0.1-x86-gcc4-2012-07-18.zip + : $(baseURL)/xz-utils-5.0.1-x86-gcc4-2012-07-18.zip ; AddExpanderRuleToHaikuImage "application/x-xz" : .tar.xz : "tar -Jtvf \\0045s" : "tar -Jxvf \\0045s" diff --git a/src/apps/debuganalyzer/gui/table/TreeTable.cpp b/src/apps/debuganalyzer/gui/table/TreeTable.cpp index 0c20843914..851342a4cd 100644 --- a/src/apps/debuganalyzer/gui/table/TreeTable.cpp +++ b/src/apps/debuganalyzer/gui/table/TreeTable.cpp @@ -1,5 +1,6 @@ /* * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. + * Copyright 2012, Rene Gollent, rene@gollent.com. * Distributed under the terms of the MIT License. */ @@ -226,6 +227,14 @@ TreeTableModel::NotifyNodesChanged(const TreeTablePath& path, int32 childIndex, } +// #pragma mark - TreeTableToolTipProvider + + +TreeTableToolTipProvider::~TreeTableToolTipProvider() +{ +} + + // #pragma mark - TreeTableListener @@ -650,6 +659,7 @@ TreeTable::TreeTable(const char* name, uint32 flags, border_style borderStyle, : AbstractTable(name, flags, borderStyle, showHorizontalScrollbar), fModel(NULL), + fToolTipProvider(NULL), fRootNode(NULL), fSelectionModel(this), fIgnoreSelectionChange(0) @@ -731,6 +741,13 @@ TreeTable::SetTreeTableModel(TreeTableModel* model) } +void +TreeTable::SetToolTipProvider(TreeTableToolTipProvider* toolTipProvider) +{ + fToolTipProvider = toolTipProvider; +} + + TreeTableSelectionModel* TreeTable::SelectionModel() { @@ -810,6 +827,31 @@ TreeTable::RemoveTreeTableListener(TreeTableListener* listener) } +bool +TreeTable::GetToolTipAt(BPoint point, BToolTip** _tip) +{ + if (fToolTipProvider == NULL) + return AbstractTable::GetToolTipAt(point, _tip); + + // get the table row + BRow* row = RowAt(point); + if (row == NULL) + return AbstractTable::GetToolTipAt(point, _tip); + + TreeTableRow* treeRow = dynamic_cast(row); + // get the table column + BColumn* column = ColumnAt(point); + + int32 columnIndex = column != NULL ? column->LogicalFieldNum() : -1; + + TreeTablePath path; + _GetPathForNode(treeRow->Node(), path); + + return fToolTipProvider->GetToolTipForTablePath(path, columnIndex, + _tip); +} + + void TreeTable::SelectionChanged() { diff --git a/src/apps/debuganalyzer/gui/table/TreeTable.h b/src/apps/debuganalyzer/gui/table/TreeTable.h index a4758690e3..b006e083f1 100644 --- a/src/apps/debuganalyzer/gui/table/TreeTable.h +++ b/src/apps/debuganalyzer/gui/table/TreeTable.h @@ -1,5 +1,6 @@ /* * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. + * Copyright 2012, Rene Gollent, rene@gollent.com. * Distributed under the terms of the MIT License. */ #ifndef TREE_TABLE_H @@ -122,6 +123,17 @@ private: }; +class TreeTableToolTipProvider { +public: + virtual ~TreeTableToolTipProvider(); + + virtual bool GetToolTipForTablePath( + const TreeTablePath& path, + int32 columnIndex, BToolTip** _tip) = 0; + // columnIndex can be -1, if not in a column +}; + + class TreeTableListener { public: virtual ~TreeTableListener(); @@ -157,6 +169,11 @@ public: bool SetTreeTableModel(TreeTableModel* model); TreeTableModel* GetTreeTableModel() const { return fModel; } + void SetToolTipProvider( + TreeTableToolTipProvider* toolTipProvider); + TreeTableToolTipProvider* ToolTipProvider() const + { return fToolTipProvider; } + TreeTableSelectionModel* SelectionModel(); void SelectNode(const TreeTablePath& path, @@ -177,6 +194,8 @@ public: TreeTableListener* listener); protected: + virtual bool GetToolTipAt(BPoint point, BToolTip** _tip); + virtual void SelectionChanged(); virtual AbstractColumn* CreateColumn(TableColumn* column); @@ -226,6 +245,7 @@ private: private: TreeTableModel* fModel; + TreeTableToolTipProvider* fToolTipProvider; TreeTableNode* fRootNode; TreeTableSelectionModel fSelectionModel; ListenerList fListeners; diff --git a/src/apps/debugger/user_interface/gui/team_window/VariablesView.cpp b/src/apps/debugger/user_interface/gui/team_window/VariablesView.cpp index 04ad5d457b..b0beb9c0e9 100644 --- a/src/apps/debugger/user_interface/gui/team_window/VariablesView.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/VariablesView.cpp @@ -13,6 +13,7 @@ #include #include +#include #include #include @@ -25,6 +26,7 @@ #include "FunctionInstance.h" #include "GUISettingsUtils.h" #include "MessageCodes.h" +#include "Register.h" #include "SettingsMenu.h" #include "StackFrame.h" #include "StackFrameValues.h" @@ -312,10 +314,12 @@ protected: targetView); return; } + } else if (value.Type() == B_STRING_TYPE) { + fField.SetString(value.ToString()); + } else { + // fall back to drawing an empty string + fField.SetString(""); } - - // fall back to drawing an empty string - fField.SetString(""); fField.SetWidth(Width()); fColumn.DrawField(&fField, rect, targetView); } @@ -345,7 +349,8 @@ protected: // #pragma mark - VariableTableModel -class VariablesView::VariableTableModel : public TreeTableModel { +class VariablesView::VariableTableModel : public TreeTableModel, + public TreeTableToolTipProvider { public: VariableTableModel(); ~VariableTableModel(); @@ -379,6 +384,10 @@ public: void NotifyNodeChanged(ModelNode* node); void NotifyNodeHidden(ModelNode* node); + virtual bool GetToolTipForTablePath( + const TreeTablePath& path, + int32 columnIndex, BToolTip** _tip); + private: struct NodeHashDefinition { typedef ValueNodeChild* KeyType; @@ -1105,8 +1114,29 @@ VariablesView::VariableTableModel::GetValueAt(void* object, int32 columnIndex, _value.SetTo(node->Name(), B_VARIANT_DONT_COPY_DATA); return true; case 1: - if (node->GetValue() == NULL) + if (node->GetValue() == NULL) { + ValueLocation* location = node->NodeChild()->Location(); + if (location == NULL) + return false; + + Type* nodeChildRawType = node->NodeChild()->Node()->GetType() + ->ResolveRawType(false); + if (nodeChildRawType->Kind() == TYPE_COMPOUND) + { + if (location->CountPieces() > 1) + return false; + + BString data; + ValuePieceLocation piece = location->PieceAt(0); + if (piece.type != VALUE_PIECE_LOCATION_MEMORY) + return false; + + data.SetToFormat("[@ 0x%llx]", piece.address); + _value.SetTo(data); + return true; + } return false; + } _value.SetTo(node, VALUE_NODE_TYPE); return true; @@ -1159,6 +1189,55 @@ VariablesView::VariableTableModel::NotifyNodeHidden(ModelNode* node) } +bool +VariablesView::VariableTableModel::GetToolTipForTablePath( + const TreeTablePath& path, int32 columnIndex, BToolTip** _tip) +{ + ModelNode* node = (ModelNode*)NodeForPath(path); + if (node == NULL) + return false; + + if (node->NodeChild()->LocationResolutionState() != B_OK) + return false; + + ValueLocation* location = node->NodeChild()->Location(); + BString tipData; + for (int32 i = 0; i < location->CountPieces(); i++) { + ValuePieceLocation piece = location->PieceAt(i); + BString pieceData; + switch (piece.type) { + case VALUE_PIECE_LOCATION_MEMORY: + pieceData.SetToFormat("(%ld): Address: 0x%llx, Size: " + "%lld bytes", i, piece.address, piece.size); + break; + case VALUE_PIECE_LOCATION_REGISTER: + { + Architecture* architecture = fThread->GetTeam()->GetArchitecture(); + pieceData.SetToFormat("(%ld): Register (%s)", + i, architecture->Registers()[piece.reg].Name()); + + break; + } + default: + break; + } + + tipData += pieceData; + if (i < location->CountPieces() - 1) + tipData += "\n"; + } + + if (tipData.IsEmpty()) + return false; + + *_tip = new(std::nothrow) BTextToolTip(tipData); + if (*_tip == NULL) + return false; + + return true; +} + + status_t VariablesView::VariableTableModel::_AddNode(Variable* variable, ModelNode* parent, ValueNodeChild* nodeChild, bool isPresentationNode, @@ -1734,6 +1813,7 @@ VariablesView::_Init() if (fVariableTableModel->Init() != B_OK) throw std::bad_alloc(); fVariableTable->SetTreeTableModel(fVariableTableModel); + fVariableTable->SetToolTipProvider(fVariableTableModel); fContainerListener = new ContainerListener(this); fVariableTableModel->SetContainerListener(fContainerListener); diff --git a/src/kits/interface/ColumnListView.cpp b/src/kits/interface/ColumnListView.cpp index baa05a2822..b31cf0c0a4 100644 --- a/src/kits/interface/ColumnListView.cpp +++ b/src/kits/interface/ColumnListView.cpp @@ -3512,8 +3512,11 @@ OutlineView::MouseDown(BPoint position) fCurrentRow = new_row; fCurrentField = new_field; fCurrentCode = B_INSIDE_VIEW; + BMessage* message = Window()->CurrentMessage(); + int32 buttons = 1; + message->FindInt32("buttons", &buttons); fCurrentColumn->MouseDown(fMasterView, fCurrentRow, - fCurrentField, fFieldRect, position, 1); + fCurrentField, fFieldRect, position, buttons); } if (!fEditMode) { @@ -4090,6 +4093,16 @@ OutlineView::RemoveRow(BRow* row) fItemsHeight -= subTreeHeight; FixScrollBar(false); + int32 indent = 0; + float top = 0.0; + if (FindRow(fVisibleRect.top, &indent, &top) == NULL && ScrollBar(B_VERTICAL) != NULL) { + // after removing this row, no rows are actually visible any more, + // force a scroll to make them visible again + if (fItemsHeight > fVisibleRect.Height()) + ScrollBy(0.0, fItemsHeight - fVisibleRect.Height() - Bounds().top); + else + ScrollBy(0.0, -Bounds().top); + } if (parentRow != NULL) { parentRow->fChildList->RemoveItem(row); if (parentRow->fChildList->CountItems() == 0) { @@ -4294,7 +4307,7 @@ OutlineView::FixScrollBar(bool scrollToFit) float maxScrollBarValue = fItemsHeight - fVisibleRect.Height(); vScrollBar->SetProportion(fVisibleRect.Height() / fItemsHeight); - // If the user is scrolled down too far when makes the range smaller, the list + // If the user is scrolled down too far when making the range smaller, the list // will jump suddenly, which is undesirable. In this case, don't fix the scroll // bar here. In ScrollTo, it checks to see if this has occured, and will // fix the scroll bars sneakily if the user has scrolled up far enough.