summaryrefslogtreecommitdiff
path: root/libgtk_kylix/GTKView.pas
diff options
context:
space:
mode:
Diffstat (limited to 'libgtk_kylix/GTKView.pas')
-rw-r--r--libgtk_kylix/GTKView.pas457
1 files changed, 242 insertions, 215 deletions
diff --git a/libgtk_kylix/GTKView.pas b/libgtk_kylix/GTKView.pas
index b971e7d..1ac742b 100644
--- a/libgtk_kylix/GTKView.pas
+++ b/libgtk_kylix/GTKView.pas
@@ -210,6 +210,7 @@ type
function GetSearchColumn: integer;
function GetSortColumnID: integer;
function GetSortOrder: TGTKTreeViewSortOrder;
+ function GetFixedHeightMode: boolean;
procedure SetSelectionMode(Value: TGTKSelectionMode);
procedure SetShowHeaders(Value: boolean);
procedure SetRulesHint(Value: boolean);
@@ -218,6 +219,7 @@ type
procedure SetSearchColumn(Value: integer);
procedure SetSortColumnID(Value: integer);
procedure SetSortOrder(Value: TGTKTreeViewSortOrder);
+ procedure SetFixedHeightMode(Value: boolean);
protected
public
FSelection: PGtkTreeSelection;
@@ -244,6 +246,7 @@ type
property CellDataFunc: TGTKCellDataFunc read FCellDataFunc write FCellDataFunc;
property FromSortedCoversionFunc: TGTKSortCoversionFunc read FFromSortedConvFunc write FFromSortedConvFunc;
property ToSortedCoversionFunc: TGTKSortCoversionFunc read FToSortedConvFunc write FToSortedConvFunc;
+ property FixedHeightMode: boolean read GetFixedHeightMode write SetFixedHeightMode;
end;
(****************************************** TGTKLISTVIEW ************************************************************************)
@@ -255,6 +258,9 @@ type
FSortable: boolean;
FCompareFunc: TGTKTreeViewCompareFunc;
FOnColumnsChanged: TNotifyEvent;
+ FChangedSignalHandlerID: gulong;
+ FRowActivatedSignalHandlerID: gulong;
+ FColumnsChangedSignalHandlerID: gulong;
protected
FListItems: TGTKListItems;
procedure Recreate;
@@ -291,6 +297,7 @@ begin
FOnSelectionChanged := nil;
FToSortedConvFunc := nil;
FFromSortedConvFunc := nil;
+ FSelection := nil;
end;
destructor TGTKView.Destroy;
@@ -388,6 +395,16 @@ begin
gtk_tree_sortable_set_sort_column_id(PGtkTreeSortable(FTreeModelSort), Value, TGtkSortType(GetSortOrder));
end;
+function TGTKView.GetFixedHeightMode: boolean;
+begin
+ Result := gtk_tree_view_get_fixed_height_mode(PGtkTreeView(FWidget));
+end;
+
+procedure TGTKView.SetFixedHeightMode(Value: boolean);
+begin
+ gtk_tree_view_set_fixed_height_mode(PGtkTreeView(FWidget), Value);
+end;
+
procedure TGTKView.ConvertChildToPath(var Path: PGtkTreePath);
var NewPath: PGtkTreePath;
begin
@@ -471,6 +488,9 @@ end;
constructor TGTKListView.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
+ FChangedSignalHandlerID := 0;
+ FRowActivatedSignalHandlerID := 0;
+ FColumnsChangedSignalHandlerID := 0;
FListItems := TGTKListItems.Create(Self);
FSortable := False;
FCompareFunc := nil;
@@ -479,6 +499,9 @@ end;
destructor TGTKListView.Destroy;
begin
+// if FChangedSignalHandlerID > 0 then g_signal_handler_disconnect(PGObject(FSelection), FChangedSignalHandlerID);
+// if FRowActivatedSignalHandlerID > 0 then g_signal_handler_disconnect(PGObject(FWidget), FRowActivatedSignalHandlerID);
+// if FColumnsChangedSignalHandlerID > 0 then g_signal_handler_disconnect(PGObject(FWidget), FColumnsChangedSignalHandlerID);
FListItems.Free;
inherited Destroy;
end;
@@ -517,9 +540,9 @@ begin
FWidget := gtk_tree_view_new_with_model(PGtkTreeModel(FTreeModelSort));
end;
FSelection := gtk_tree_view_get_selection(PGtkTreeView(FWidget));
- g_signal_connect_data(PGObject(FSelection), 'changed', TGCallback(@TGTKListView_changed), Self, nil, G_CONNECT_DEFAULT);
- g_signal_connect_data(PGObject(FWidget), 'row-activated', TGCallback(@TGTKListView_row_activated), Self, nil, G_CONNECT_DEFAULT);
- g_signal_connect_data(PGObject(FWidget), 'columns-changed', TGCallback(@TGTKListView_columns_changed), Self, nil, [G_CONNECT_AFTER]);
+ FChangedSignalHandlerID := g_signal_connect_data(PGObject(FSelection), 'changed', TGCallback(@TGTKListView_changed), Self, nil, G_CONNECT_DEFAULT);
+ FRowActivatedSignalHandlerID := g_signal_connect_data(PGObject(FWidget), 'row-activated', TGCallback(@TGTKListView_row_activated), Self, nil, G_CONNECT_DEFAULT);
+ FColumnsChangedSignalHandlerID := g_signal_connect_data(PGObject(FWidget), 'columns-changed', TGCallback(@TGTKListView_columns_changed), Self, nil, [G_CONNECT_AFTER]);
FTreeModel := gtk_tree_view_get_model(PGtkTreeView(FWidget));
Show;
end;
@@ -663,7 +686,7 @@ end;
function TGTKListItems.GetItem(Index: longint): TGTKListItem;
begin
Result := TGTKListItem(FList[Index]);
- Result.FIndex := Index;
+// Result.FIndex := Index;
end;
procedure TGTKListItems.SetItem(Index: longint; Value: TGTKListItem);
@@ -672,11 +695,12 @@ begin
end;
function TGTKListItems.Add: TGTKListItem;
+var Item: TGTKListItem;
begin
- Result := TGTKListItem.Create(Self);
- Result.FIndex := GetCount;
-// Insert(GetCount, Result);
- Append(Result);
+ Item := TGTKListItem.Create(Self);
+ Item.FIndex := GetCount;
+ Append(Item);
+ Result := Item;
end;
function TGTKListItems.GetCount: longint;
@@ -691,16 +715,17 @@ begin
end;
procedure TGTKListItems.Delete(Index: longint);
-var x: pointer;
+var x: TGTKListItem;
Iter: TGtkTreeIter;
begin
- x := FList[Index];
+ Initialize(Iter);
+ x := TGTKListItem(FList[Index]);
if gtk_tree_model_get_iter_from_string(PGtkTreeModel(FStore), @Iter, PChar(IntToStr(Index))) then begin
// (FOwner as TGTKView).CovertSortableIter(Iter);
gtk_list_store_remove(FStore, @Iter);
- end;
+ end else writeln(' iter invalid!!!');
FList.Delete(Index);
- TObject(x).Free;
+ x.Free;
end;
procedure TGTKListItems.Insert(Index: longint; Item: TGTKListItem);
@@ -713,12 +738,217 @@ end;
procedure TGTKListItems.Append(Item: TGTKListItem);
var Iter: TGtkTreeIter;
begin
+ Initialize(Iter);
FList.Add(Item);
gtk_list_store_append(FStore, @Iter);
end;
(********************************************************************************************************************************)
(********************************************************************************************************************************)
+constructor TGTKListItem.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FOwner := AOwner;
+ FData := nil;
+end;
+
+destructor TGTKListItem.Destroy;
+begin
+ inherited Destroy;
+end;
+
+function TGTKListItem.AsString(Index: longint): string;
+var Iter: TGtkTreeIter;
+ Val: Pgchar;
+begin
+ Result := '';
+ Val := nil;
+ if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) then
+ begin
+ gtk_tree_model_get(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, [Index, @Val, -1]);
+ if Assigned(Val) then Result := String(Val);
+ end;
+end;
+
+function TGTKListItem.AsInteger(Index: longint): integer;
+var Iter: TGtkTreeIter;
+ Val: glong;
+begin
+ Result := 0;
+ Val := 0;
+ if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) then
+ begin
+ gtk_tree_model_get(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, [Index, @Val, -1]);
+ Result := Val;
+ end;
+end;
+
+function TGTKListItem.AsPointer(Index: longint): pointer;
+var Iter: TGtkTreeIter;
+ Val: Pointer;
+begin
+ Result := nil;
+ Val := nil;
+ if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) then
+ begin
+ gtk_tree_model_get(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, [Index, @Val, -1]);
+ Result := Val;
+ end;
+end;
+
+function TGTKListItem.AsBoolean(Index: longint): boolean;
+var Iter: TGtkTreeIter;
+ Val: gboolean;
+begin
+ Result := False;
+ Val := False;
+ if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) then
+ begin
+ gtk_tree_model_get(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, [Index, @Val, -1]);
+ Result := Val;
+ end;
+end;
+
+procedure TGTKListItem.SetValue(Index: longint; Value: string);
+var Iter: TGtkTreeIter;
+begin
+ if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex)))
+ then gtk_list_store_set((FOwner as TGTKListItems).FStore, @Iter, [Index, PChar(Value), -1]);
+end;
+
+procedure TGTKListItem.SetValue(Index: longint; Value: integer);
+var Iter: TGtkTreeIter;
+begin
+ if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex)))
+ then gtk_list_store_set((FOwner as TGTKListItems).FStore, @Iter, [Index, glong(Value), -1]);
+end;
+
+procedure TGTKListItem.SetValue(Index: longint; Value: pointer);
+var Iter: TGtkTreeIter;
+begin
+ if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex)))
+ then gtk_list_store_set((FOwner as TGTKListItems).FStore, @Iter, [Index, gpointer(Value), -1]);
+end;
+
+procedure TGTKListItem.SetValue(Index: longint; Value: boolean);
+var Iter: TGtkTreeIter;
+begin
+ if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex)))
+ then gtk_list_store_set((FOwner as TGTKListItems).FStore, @Iter, [Index, gboolean(Value), -1]);
+end;
+
+function TGTKListItem.GetSelected: boolean;
+var Iter: TGtkTreeIter;
+begin
+ Result := False;
+ if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) then begin
+// ((FOwner as TGTKListItems).FOwner as TGTKView).ConvertSortableIter(Iter);
+ Result := gtk_tree_selection_iter_is_selected(((FOwner as TGTKListItems).FOwner as TGTKView).FSelection, @Iter);
+ end;
+end;
+
+procedure TGTKListItem.SetSelected(Value: boolean);
+var Iter, NewIter: TGtkTreeIter;
+begin
+ try
+ if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) then begin
+ if Assigned(((FOwner as TGTKListItems).FOwner as TGTKView).FTreeModelSort) then begin
+ gtk_tree_model_sort_convert_child_iter_to_iter(((FOwner as TGTKListItems).FOwner as TGTKView).FTreeModelSort, @NewIter, @Iter);
+ Iter := NewIter;
+ end;
+ if Value then gtk_tree_selection_select_iter(((FOwner as TGTKListItems).FOwner as TGTKView).FSelection, @Iter)
+ else gtk_tree_selection_unselect_iter(((FOwner as TGTKListItems).FOwner as TGTKView).FSelection, @Iter);
+ end;
+ except end;
+end;
+
+procedure TGTKListItem.SetCursor(const FocusColumnNo: integer; const StartEditing, UseAlignment: boolean; const AlignX, AlignY: Double);
+var Path: PGtkTreePath;
+ Column: PGtkTreeViewColumn;
+// Renderer: PGtkCellRenderer;
+ i : integer;
+begin
+ Path := gtk_tree_path_new_from_string(PChar(IntToStr(FIndex)));
+ if not Assigned(Path) then Exit;
+ ((FOwner as TGTKListItems).FOwner as TGTKView).ConvertChildToPath(Path);
+ if not Assigned(Path) then Exit;
+
+ Column := ((FOwner as TGTKListItems).FOwner as TGTKView).Columns[FocusColumnNo].FColumn;
+// Renderer := ((FOwner as TGTKListItems).FOwner as TGTKView).Columns[FocusColumnNo].FRenderer;
+
+ gtk_tree_view_set_cursor(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, StartEditing);
+// gtk_tree_view_set_cursor(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, StartEditing);
+// gtk_tree_view_set_cursor_on_cell(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, Renderer, StartEditing);
+ gtk_tree_view_scroll_to_cell(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, nil, UseAlignment, AlignX, AlignY);
+
+ gtk_tree_path_free(Path);
+end;
+
+procedure TGTKListItem.StartEditing(ColumnNo: integer);
+var CellEditable: PGtkCellEditable;
+ Path: PGtkTreePath;
+ Column: PGtkTreeViewColumn;
+ BackgroundRect, CellRect: TGdkRectangle;
+begin
+ Path := gtk_tree_path_new_from_string(PChar(IntToStr(FIndex)));
+ if not Assigned(Path) then Exit;
+ ((FOwner as TGTKListItems).FOwner as TGTKView).ConvertChildToPath(Path);
+ if not Assigned(Path) then Exit;
+ Column := ((FOwner as TGTKListItems).FOwner as TGTKView).Columns[ColumnNo].FColumn;
+ gtk_tree_view_get_background_area(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, @BackgroundRect);
+ gtk_tree_view_get_cell_area(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, @CellRect);
+
+ gtk_tree_view_column_focus_cell(Column, ((FOwner as TGTKListItems).FOwner as TGTKView).Columns[ColumnNo].FRenderer);
+ CellEditable := gtk_cell_renderer_start_editing(((FOwner as TGTKListItems).FOwner as TGTKView).Columns[ColumnNo].FRenderer,
+ nil, ((FOwner as TGTKListItems).FOwner as TGTKView).FWidget, PChar(PChar(IntToStr(FIndex))),
+ @BackgroundRect, @CellRect, []);
+ gtk_widget_show(PGtkWidget(CellEditable));
+// gtk_cell_editable_start_editing(CellEditable, nil);
+
+
+ gtk_tree_path_free(Path);
+end;
+
+procedure TGTKListItem.RedrawRow;
+var Rect, BackgroundRect: TGdkRectangle;
+ Path: PGtkTreePath;
+ Column: PGtkTreeViewColumn;
+begin
+Exit;
+ Path := gtk_tree_path_new_from_string(PChar(IntToStr(FIndex)));
+ if not Assigned(Path) then Exit;
+ ((FOwner as TGTKListItems).FOwner as TGTKView).ConvertChildToPath(Path);
+ if not Assigned(Path) then Exit;
+ Column := ((FOwner as TGTKListItems).FOwner as TGTKView).Columns[0].FColumn;
+ gtk_tree_view_get_background_area(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, @BackgroundRect);
+
+ Rect.x := 0;
+ Rect.width := gtk_widget_get_allocated_width(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget);
+ Rect.y := BackgroundRect.y;
+ Rect.height := BackgroundRect.height;
+ gdk_window_invalidate_rect(gtk_tree_view_get_bin_window(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget)), @Rect, True);
+
+ gtk_tree_path_free(Path);
+end;
+
+function TGTKListItem.IsVisible: boolean;
+var CellRect, VisibleRect: TGdkRectangle;
+ Path: PGtkTreePath;
+begin
+ Result := False;
+ Exit;
+ gtk_tree_view_get_visible_rect(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), @VisibleRect);
+ Path := gtk_tree_path_new_from_string(PChar(IntToStr(FIndex)));
+ if not Assigned(Path) then Exit;
+ ((FOwner as TGTKListItems).FOwner as TGTKView).ConvertChildToPath(Path);
+ if not Assigned(Path) then Exit;
+ gtk_tree_view_get_background_area(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, nil, @CellRect);
+ gtk_tree_path_free(Path);
+ Result := (CellRect.y > VisibleRect.y) and (CellRect.y + CellRect.height < VisibleRect.y + VisibleRect.height);
+end;
+
+(********************************************************************************************************************************)
+(********************************************************************************************************************************)
constructor TGTKTreeViewColumns.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
@@ -1108,209 +1338,6 @@ begin
g_object_set_property(PGObject(FPixbufRenderer), PChar(AProperty), @AValue);
end;
-(********************************************************************************************************************************)
-(********************************************************************************************************************************)
-constructor TGTKListItem.Create(AOwner: TComponent);
-begin
- inherited Create(AOwner);
- FOwner := AOwner;
- FData := nil;
-end;
-
-destructor TGTKListItem.Destroy;
-begin
- inherited Destroy;
-end;
-
-function TGTKListItem.AsString(Index: longint): string;
-var Iter: TGtkTreeIter;
- AValue: TGValue;
-begin
- Result := '';
- if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) then
- begin
- AValue.g_type := 0;
- gtk_tree_model_get_value(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, Index, @AValue);
- Result := String(AValue.data[0].v_pointer);
- end;
-end;
-
-function TGTKListItem.AsInteger(Index: longint): integer;
-var Iter: TGtkTreeIter;
- AValue: TGValue;
-begin
- Result := 0;
- if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) then
- begin
- AValue.g_type := 0;
- gtk_tree_model_get_value(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, Index, @AValue);
- Result := AValue.data[0].v_long;
- end;
-end;
-
-function TGTKListItem.AsPointer(Index: longint): pointer;
-var Iter: TGtkTreeIter;
- AValue: TGValue;
-begin
- Result := nil;
- if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) then
- begin
- AValue.g_type := 0;
- gtk_tree_model_get_value(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, Index, @AValue);
- Result := AValue.data[0].v_pointer;
- end;
-end;
-
-function TGTKListItem.AsBoolean(Index: longint): boolean;
-var Iter: TGtkTreeIter;
- AValue: TGValue;
-begin
- Result := False;
- if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) then
- begin
- AValue.g_type := 0;
- gtk_tree_model_get_value(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, Index, @AValue);
- Result := boolean(AValue.data[0].v_int);
- end;
-end;
-
-procedure TGTKListItem.SetValue(Index: longint; Value: string);
-var Iter: TGtkTreeIter;
-begin
- if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex)))
- then gtk_list_store_set((FOwner as TGTKListItems).FStore, @Iter, [Index, PChar(Value), -1]);
-end;
-
-procedure TGTKListItem.SetValue(Index: longint; Value: integer);
-var Iter: TGtkTreeIter;
-begin
- if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex)))
- then gtk_list_store_set((FOwner as TGTKListItems).FStore, @Iter, [Index, Value, -1]);
-end;
-
-procedure TGTKListItem.SetValue(Index: longint; Value: pointer);
-var Iter: TGtkTreeIter;
-begin
- if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex)))
- then gtk_list_store_set((FOwner as TGTKListItems).FStore, @Iter, [Index, Value, -1]);
-end;
-
-procedure TGTKListItem.SetValue(Index: longint; Value: boolean);
-var Iter: TGtkTreeIter;
-begin
- if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex)))
- then gtk_list_store_set((FOwner as TGTKListItems).FStore, @Iter, [Index, Value, -1]);
-end;
-
-function TGTKListItem.GetSelected: boolean;
-var Iter: TGtkTreeIter;
-begin
- Result := False;
- if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) then begin
-// ((FOwner as TGTKListItems).FOwner as TGTKView).ConvertSortableIter(Iter);
- Result := gtk_tree_selection_iter_is_selected(((FOwner as TGTKListItems).FOwner as TGTKView).FSelection, @Iter);
- end;
-end;
-
-procedure TGTKListItem.SetSelected(Value: boolean);
-var Iter, NewIter: TGtkTreeIter;
-begin
- try
- if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) then begin
- if Assigned(((FOwner as TGTKListItems).FOwner as TGTKView).FTreeModelSort) then begin
- gtk_tree_model_sort_convert_child_iter_to_iter(((FOwner as TGTKListItems).FOwner as TGTKView).FTreeModelSort, @NewIter, @Iter);
- Iter := NewIter;
- end;
- if Value then gtk_tree_selection_select_iter(((FOwner as TGTKListItems).FOwner as TGTKView).FSelection, @Iter)
- else gtk_tree_selection_unselect_iter(((FOwner as TGTKListItems).FOwner as TGTKView).FSelection, @Iter);
- end;
- except end;
-end;
-
-procedure TGTKListItem.SetCursor(const FocusColumnNo: integer; const StartEditing, UseAlignment: boolean; const AlignX, AlignY: Double);
-var Path: PGtkTreePath;
- Column: PGtkTreeViewColumn;
-// Renderer: PGtkCellRenderer;
- i : integer;
-begin
- Path := gtk_tree_path_new_from_string(PChar(IntToStr(FIndex)));
- if not Assigned(Path) then Exit;
- ((FOwner as TGTKListItems).FOwner as TGTKView).ConvertChildToPath(Path);
- if not Assigned(Path) then Exit;
-
- Column := ((FOwner as TGTKListItems).FOwner as TGTKView).Columns[FocusColumnNo].FColumn;
-// Renderer := ((FOwner as TGTKListItems).FOwner as TGTKView).Columns[FocusColumnNo].FRenderer;
-
- for i := 1 to 2 do gtk_main_iteration_do(False); // This ugly piece of code HAVE TO BE HERE due some focus-related problems in GtkTreeView
- gtk_tree_view_set_cursor(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, StartEditing);
-// gtk_tree_view_set_cursor(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, StartEditing);
-// gtk_tree_view_set_cursor_on_cell(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, Renderer, StartEditing);
- gtk_tree_view_scroll_to_cell(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, nil, UseAlignment, AlignX, AlignY);
-
- gtk_tree_path_free(Path);
-end;
-
-procedure TGTKListItem.StartEditing(ColumnNo: integer);
-var CellEditable: PGtkCellEditable;
- Path: PGtkTreePath;
- Column: PGtkTreeViewColumn;
- BackgroundRect, CellRect: TGdkRectangle;
-begin
- Path := gtk_tree_path_new_from_string(PChar(IntToStr(FIndex)));
- if not Assigned(Path) then Exit;
- ((FOwner as TGTKListItems).FOwner as TGTKView).ConvertChildToPath(Path);
- if not Assigned(Path) then Exit;
- Column := ((FOwner as TGTKListItems).FOwner as TGTKView).Columns[ColumnNo].FColumn;
- gtk_tree_view_get_background_area(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, @BackgroundRect);
- gtk_tree_view_get_cell_area(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, @CellRect);
-
- gtk_tree_view_column_focus_cell(Column, ((FOwner as TGTKListItems).FOwner as TGTKView).Columns[ColumnNo].FRenderer);
- CellEditable := gtk_cell_renderer_start_editing(((FOwner as TGTKListItems).FOwner as TGTKView).Columns[ColumnNo].FRenderer,
- nil, ((FOwner as TGTKListItems).FOwner as TGTKView).FWidget, PChar(PChar(IntToStr(FIndex))),
- @BackgroundRect, @CellRect, []);
- gtk_widget_show(PGtkWidget(CellEditable));
-// gtk_cell_editable_start_editing(CellEditable, nil);
-
-
- gtk_tree_path_free(Path);
-end;
-
-procedure TGTKListItem.RedrawRow;
-var Rect, BackgroundRect: TGdkRectangle;
- Path: PGtkTreePath;
- Column: PGtkTreeViewColumn;
-begin
- Path := gtk_tree_path_new_from_string(PChar(IntToStr(FIndex)));
- if not Assigned(Path) then Exit;
- ((FOwner as TGTKListItems).FOwner as TGTKView).ConvertChildToPath(Path);
- if not Assigned(Path) then Exit;
- Column := ((FOwner as TGTKListItems).FOwner as TGTKView).Columns[0].FColumn;
- gtk_tree_view_get_background_area(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, @BackgroundRect);
-
- Rect.x := 0;
- Rect.width := gtk_widget_get_allocated_width(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget);
- Rect.y := BackgroundRect.y;
- Rect.height := BackgroundRect.height;
- gdk_window_invalidate_rect(gtk_tree_view_get_bin_window(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget)), @Rect, True);
-
- gtk_tree_path_free(Path);
-end;
-
-function TGTKListItem.IsVisible: boolean;
-var CellRect, VisibleRect: TGdkRectangle;
- Path: PGtkTreePath;
-begin
- Result := False;
- gtk_tree_view_get_visible_rect(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), @VisibleRect);
- Path := gtk_tree_path_new_from_string(PChar(IntToStr(FIndex)));
- if not Assigned(Path) then Exit;
- ((FOwner as TGTKListItems).FOwner as TGTKView).ConvertChildToPath(Path);
- if not Assigned(Path) then Exit;
- gtk_tree_view_get_background_area(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, nil, @CellRect);
- gtk_tree_path_free(Path);
- Result := (CellRect.y > VisibleRect.y) and (CellRect.y + CellRect.height < VisibleRect.y + VisibleRect.height);
-end;
-
(********************************************************************************************************************************)
(********************************************************************************************************************************)