From 2c558054feef23be08bfdbdf1eade199af97bde8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Wed, 29 Oct 2008 22:50:52 +0000 Subject: [PATCH] supports double clicking column title separator to preferred column size git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28371 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/interface/ColumnListView.h | 1 + headers/private/interface/ColumnTypes.h | 1 + src/kits/interface/ColumnListView.cpp | 43 ++++++++++++++++++++-- src/kits/interface/ColumnTypes.cpp | 10 +++++ 4 files changed, 52 insertions(+), 3 deletions(-) diff --git a/headers/private/interface/ColumnListView.h b/headers/private/interface/ColumnListView.h index 16524d77d7..c08c9dd4e0 100644 --- a/headers/private/interface/ColumnListView.h +++ b/headers/private/interface/ColumnListView.h @@ -183,6 +183,7 @@ public: virtual void MouseUp(BColumnListView *parent, BRow *row, BField *field); virtual void GetColumnName(BString* into) const; + virtual float GetPreferredWidth(BField *field, BView *parent) const; bool IsVisible() const; void SetVisible(bool); diff --git a/headers/private/interface/ColumnTypes.h b/headers/private/interface/ColumnTypes.h index 7e1e0af7ca..6033cb626b 100644 --- a/headers/private/interface/ColumnTypes.h +++ b/headers/private/interface/ColumnTypes.h @@ -85,6 +85,7 @@ class BStringColumn : public BTitledColumn BView* parent); virtual int CompareFields (BField* field1, BField* field2); + virtual float GetPreferredWidth(BField* field, BView* parent) const; virtual bool AcceptsField (const BField* field) const; private: diff --git a/src/kits/interface/ColumnListView.cpp b/src/kits/interface/ColumnListView.cpp index 125cb44f70..476417c261 100644 --- a/src/kits/interface/ColumnListView.cpp +++ b/src/kits/interface/ColumnListView.cpp @@ -237,7 +237,7 @@ private: int32 FindColumn(BPoint, float *out_leftEdge); void FixScrollBar(bool scrollToFit); void DragSelectedColumn(BPoint); - void ResizeSelectedColumn(BPoint); + void ResizeSelectedColumn(BPoint, bool = false); void ComputeDragBoundries(BColumn*, BPoint); void DrawTitle(BView*, BRect, BColumn*, bool depressed); @@ -296,6 +296,7 @@ public: void RedrawColumn(BColumn *column, float leftEdge, bool isFirstColumn); void StartSorting(); + float GetColumnPreferredWidth(BColumn *column); void AddRow(BRow*, int32 index, BRow *TheRow); BRow* CurrentSelection(BRow *lastSelected) const; @@ -619,6 +620,11 @@ void BColumn::GetColumnName(BString* into) const *into = "(Unnamed)"; } +float BColumn::GetPreferredWidth(BField *field, BView *parent) const +{ + return fWidth; +} + bool BColumn::IsVisible() const { return fVisible; @@ -1798,13 +1804,21 @@ void TitleView::SetColumnFlags(column_flags flags) } -void TitleView::ResizeSelectedColumn(BPoint position) +void TitleView::ResizeSelectedColumn(BPoint position, bool preferred) { float minWidth = fSelectedColumn->MinWidth(); float maxWidth = fSelectedColumn->MaxWidth(); float originalEdge = fSelectedColumnRect.left + fSelectedColumn->Width(); - if (position.x > fSelectedColumnRect.left + maxWidth) + if (preferred) { + float width = fOutlineView->GetColumnPreferredWidth(fSelectedColumn); + if (width < minWidth) + fSelectedColumn->SetWidth(minWidth); + else if (width > maxWidth) + fSelectedColumn->SetWidth(maxWidth); + else + fSelectedColumn->SetWidth(width); + } else if (position.x > fSelectedColumnRect.left + maxWidth) fSelectedColumn->SetWidth(maxWidth); else if (position.x < fSelectedColumnRect.left + minWidth) fSelectedColumn->SetWidth(minWidth); @@ -2138,6 +2152,13 @@ void TitleView::MouseDown(BPoint position) && position.x < rightEdge + kColumnResizeAreaWidth / 2 && column->MaxWidth() > column->MinWidth() && (fColumnFlags & B_ALLOW_COLUMN_RESIZE)) { + int32 clicks = 0; + Window()->CurrentMessage()->FindInt32("clicks", &clicks); + if (clicks == 2) { + ResizeSelectedColumn(position, true); + fCurrentState = INACTIVE; + break; + } fCurrentState = RESIZING_COLUMN; fSelectedColumn = column; fSelectedColumnRect.Set(leftEdge, 0, rightEdge, fVisibleRect.Height()); @@ -4036,6 +4057,22 @@ void OutlineView::InvalidateCachedPositions() FindRect(fFocusRow, &fFocusRowRect); } +float OutlineView::GetColumnPreferredWidth(BColumn *column) +{ + float preferred = 0.0; + for (RecursiveOutlineIterator iterator(&fRows); iterator.CurrentRow(); + iterator.GoToNext()) { + BRow *row = iterator.CurrentRow(); + BField *field = row->GetField(column->fFieldID); + if (field) { + float width = column->GetPreferredWidth(field, this); + if (preferred < width) + preferred = width; + } + } + return preferred; +} + // #pragma mark - diff --git a/src/kits/interface/ColumnTypes.cpp b/src/kits/interface/ColumnTypes.cpp index bba811cd13..dee5efae4f 100644 --- a/src/kits/interface/ColumnTypes.cpp +++ b/src/kits/interface/ColumnTypes.cpp @@ -187,6 +187,16 @@ BStringColumn::DrawField(BField* _field, BRect rect, BView* parent) } +float +BStringColumn::GetPreferredWidth(BField *_field, BView* parent) const +{ + BStringField* field = static_cast(_field); + BFont font; + parent->GetFont(&font); + return font.StringWidth(field->String()) + 2 * kTEXT_MARGIN; +} + + int BStringColumn::CompareFields(BField* field1, BField* field2) {