Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Specialized
Imports System.Diagnostics
Imports System.IO
Imports System.Windows.Forms
Imports Nexamas.UI.Controls
Imports Nexamas.UI.Composition
Imports Nexamas.UI.FileSystem
Imports Nexamas.UI.General
Imports Nexamas.UI.Rendering
Imports Nexamas.UI.Theming
Imports Nexamas.UI.Values
Imports Nexamas.UI.Layout
Imports SkiaSharp

Namespace Nexamas.UI.Components


    Partial Public NotInheritable Class MASFilePickerControl
#Region "Button/browser event bridge"

        Private Sub BuildButtons()
            _primaryButton.Text = If(_controller IsNot Nothing, _controller.PrimaryButtonText, "OK")
            _primaryButton.Enabled = If(_controller IsNot Nothing, _controller.CanAccept, False)

            _cancelButton.Text = "Cancel"
            _cancelButton.Enabled = True

            _footerLabel.Text = If(CurrentOptions.FooterText, String.Empty)
            _footerLabel.Visible = Not String.IsNullOrWhiteSpace(_footerLabel.Text)
            _footerLabel.Enabled = Enabled
        End Sub


        Private Sub SyncNavigationBarState()
            Dim path As String = If(_controller IsNot Nothing, _controller.CurrentPath, String.Empty)

            _navigationBar.PathText = path
            _navigationBar.CanGoUp = Not String.IsNullOrWhiteSpace(path)
            _navigationBar.CanGoBack = If(_controller IsNot Nothing, _controller.CanGoBack, False)
            _navigationBar.CanGoForward = If(_controller IsNot Nothing, _controller.CanGoForward, False)
            _navigationBar.CanRefresh = True
        End Sub


        Private Sub SyncControllerSaveFileNameFromTextBox()
            If _controller Is Nothing Then Return
            If Not _controller.IsSaveMode Then Return
            If _fileNameBox Is Nothing Then Return

            _controller.SaveFileName = _fileNameBox.Text
        End Sub


        Private Sub SyncFileNameBoxFromController()
            If _controller Is Nothing Then Return
            If _fileNameBox Is Nothing Then Return

            Dim desired As String = _controller.SaveFileName

            If Not String.Equals(_fileNameBox.Text, desired, StringComparison.Ordinal) Then
                _fileNameBox.Text = desired
            End If
        End Sub


        Private Sub OnPrimaryButtonClick(sender As Object, e As EventArgs)
            If _disposedLocal OrElse _controller Is Nothing Then Return

            SyncControllerSaveFileNameFromTextBox()
            _controller.AcceptSelection()
        End Sub


        Private Sub OnCancelButtonClick(sender As Object, e As EventArgs)
            If _disposedLocal OrElse _controller Is Nothing Then Return
            _controller.CancelSelection()
        End Sub


        Private Sub OnNavigationUpRequested(sender As Object, e As EventArgs)
            NavigateUp()
        End Sub


        Private Sub OnNavigationRefreshRequested(sender As Object, e As EventArgs)
            RefreshItems()
        End Sub


        Private Sub OnNavigationBackRequested(sender As Object, e As EventArgs)
            GoBack()
        End Sub


        Private Sub OnNavigationForwardRequested(sender As Object, e As EventArgs)
            GoForward()
        End Sub


        Private Sub OnPickerAccepted(sender As Object, e As MASFilePickerResultEventArgs)
            If _disposedLocal Then Return
            RaiseEvent Accepted(Me, e)
            RaiseStateChanged()
        End Sub


        Private Sub OnPickerCancelled(sender As Object, e As EventArgs)
            If _disposedLocal Then Return
            RaiseEvent Cancelled(Me, EventArgs.Empty)
            RaiseStateChanged()
        End Sub


        Private Sub OnPickerStateChanged(sender As Object, e As EventArgs)
            If _disposedLocal Then Return

            SyncFileNameBoxFromController()
            BuildButtons()
            SyncNavigationBarState()

            RaiseStateChanged()
            SafeInvalidate()
        End Sub


        Private Sub OnBrowserCurrentPathChanged(sender As Object, e As EventArgs)
            If _disposedLocal Then Return

            SyncNavigationBarState()

            RaiseEvent CurrentPathChanged(Me, EventArgs.Empty)
            RaiseStateChanged()
            SafeInvalidate()
        End Sub


        Private Sub OnBrowserSelectionChanged(sender As Object, e As EventArgs)
            If _disposedLocal Then Return

            SyncFileNameBoxFromController()
            BuildButtons()

            RaiseEvent SelectionChanged(Me, EventArgs.Empty)
            RaiseStateChanged()
            SafeInvalidate()
        End Sub


        Private Sub OnBrowserItemsChanged(sender As Object, e As EventArgs)
            If _disposedLocal Then Return

            RaiseEvent ItemsChanged(Me, EventArgs.Empty)
            RaiseStateChanged()
            SafeInvalidate()
        End Sub


        Private Sub OnBrowserItemContextMenuRequested(sender As Object, e As MASFilePickerItemContextMenuRequestedEventArgs)
            If _disposedLocal OrElse e Is Nothing OrElse e.Entry Is Nothing Then Return

            RaiseEvent ItemContextMenuRequested(Me, e)
        End Sub


        Private Sub OnBrowserEmptySpaceContextMenuRequested(sender As Object, e As MASFilePickerEmptySpaceContextMenuRequestedEventArgs)
            If _disposedLocal OrElse e Is Nothing Then Return

            RaiseEvent EmptySpaceContextMenuRequested(Me, e)
        End Sub


        Private Sub OnBrowserInlineRenameCommitted(sender As Object, e As MASFilePickerInlineRenameCommittedEventArgs)
            If _disposedLocal OrElse e Is Nothing OrElse e.Entry Is Nothing Then Return

            Dim errorMessage As String = String.Empty

            If Not TryRenameEntry(e.Entry, e.NewText, errorMessage) Then
                e.Cancel = True
                e.ErrorMessage = If(String.IsNullOrWhiteSpace(errorMessage), "Rename failed.", errorMessage)

                RaiseEvent InlineRenameFailed(
                    Me,
                    New MASFilePickerInlineRenameFailedEventArgs(
                        entry:=e.Entry,
                        attemptedName:=e.NewText,
                        message:=e.ErrorMessage))
            End If
        End Sub


        Private Sub OnFileNameTextChanged(sender As Object, e As EventArgs)
            If _disposedLocal Then Return
            If _controller Is Nothing OrElse _fileNameBox Is Nothing Then Return

            _controller.SaveFileName = _fileNameBox.Text
            BuildButtons()

            RaiseStateChanged()
            RequestSizeLayoutRefreshForSizeAffectingChange("MASFilePickerControl.FileNameTextChanged")
            SafeInvalidate()
        End Sub


        Private Sub RaiseStateChanged()
            RaiseEvent StateChanged(Me, EventArgs.Empty)
        End Sub



#End Region

    End Class

End Namespace
