;------------Светодиодная матрица - МОДЖЕТ (антигаджет)-----------
;{---------Запрет на запуск программы более одного раза-----------  
a = CreateSemaphore_(#Null,0,1,"MODGET 8x8") 
If a<>0 And GetLastError_()= #ERROR_ALREADY_EXISTS 
  CloseHandle_(a) 
  End 
EndIf 
;}---------------------------------------------------------------
;{-----------------------Enumeration------------------------------
Enumeration 
  #Window_0 
  #Window_1
  #Window_2
  #Window_3
EndEnumeration 
;}----------------------------------------------------------------
;{----------------------Глобальные переменные---------------------
#Window_0=0
#Name="MODGET 8x8"                            ;заголовок программы
#NO_Device="отключен"                  ;сообщения программы  
#YES_Device="подключен"                ;сообщения программы
Global USB_PID                               ;идентификатор PID
Global USB_VID                               ;идентификатор VID
Global Text.s
;}---------------------------------------------------------------
Procedure ProgramAtStartup(State, ProgName.s) ; Управление автозагрузкой программы
valueName$=ProgramFilename() 
 GetHandle = RegOpenKeyEx_(#HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Run", 0, #KEY_ALL_ACCESS, @hKey)
 If GetHandle = #ERROR_SUCCESS
  If State=1
   RegSetValueEx_(hKey, @ProgName, 0, #REG_SZ, @valueName$, Len(valueName$))
  Else
   RegDeleteValue_(hKey, @ProgName)
  EndIf
  RegCloseKey_(hKey)
 EndIf
EndProcedure
Procedure FindDevice_Timer() ; таймер - процедура проверки подключения нашего устройства
  Static Old_Test
  Test=HID_Lib_DeviceTest(USB_PID, USB_VID);(USB_PID, USB_VID)
  If Test<>Old_Test
    Old_Test=Test 
    If Test 
      HID_Lib_CloseDevice(R_DeviceHandle) : HID_Lib_CloseDevice(W_DeviceHandle)
      W_DeviceHandle=HID_Lib_OpenDevice(USB_PID, USB_VID);(USB_PID, USB_VID)
      R_DeviceHandle=HID_Lib_OpenDevice(USB_PID, USB_VID);(USB_PID, USB_VID)
      SetGadgetText(0,#YES_Device)
      SetGadgetColor(0, #PB_Gadget_FrontColor, $00FF0F) 
    Else
      HID_Lib_CloseDevice(R_DeviceHandle) : HID_Lib_CloseDevice(W_DeviceHandle)
      R_DeviceHandle=0 : W_DeviceHandle=0
      SetGadgetText(0,#NO_Device)
      SetGadgetColor(0, #PB_Gadget_FrontColor, $0000FF)
    EndIf
  EndIf
  
EndProcedure
Structure DrawInfo
  row.c[8]
EndStructure
#xc = 20 ; начало по X
#yc = 20 ; начало по Y
CreateImage(80,148,148)
Procedure Draw_Image(*Infa.DrawInfo)
  
  If StartDrawing(ImageOutput(80))
    Box(83,0,148,148,0) ; Очистка рисунка
    For col = 0 To 7
      For row = 0 To 7
        x = 20 + col * 15
        y = 20 + row * 15 
        If *Infa\row[row] << col & %10000000
          Color = RGB(255, 102, 00)
        Else
          Color = RGB(102, 102, 102)
        EndIf
        Circle(x, y, 5, Color)
      Next
    Next
    StopDrawing()
  EndIf
  ;SetGadgetState(83, ImageID(80))
EndProcedure
Procedure Timer1()
  ImageDraw.DrawInfo
  
  For i=0 To 7
    ImageDraw\row[i] = Random(255)
  Next i
  
  Draw_Image(@ImageDraw)
EndProcedure
Procedure StreamFileIn_Callback(hFile, pbBuff, cb, pcb) 
  ProcedureReturn ReadFile_(hFile, pbBuff, cb, pcb, 0)!1 
EndProcedure 
Procedure FileStreamIn(Gadget, File.s) 
  
  
  ;Procedure zum streamen einer Datei in das RichEdit 
  ;Control 
  
  Protected StreamData.EDITSTREAM 
  
  ;Wenn die Datei geцffnet werden kann, fortfahren.  
  If ReadFile(10, File)    
    
    ;Das Handle der Datei speichern 
    StreamData\dwCookie = FileID(10) 
    StreamData\dwError = #Null 
    
    ;Die Adresse der Callback Procedure speichern 
    StreamData\pfnCallback = @StreamFileIn_Callback() 
    
    ;Das RichEdit Control anweisen, den Stream zu aktivieren 
    SendMessage_(GadgetID(Gadget), #EM_STREAMIN, #SF_RTF, @StreamData) 
    
    ;Datei schliessen 
    CloseFile(10) 
    
  EndIf 
  
EndProcedure 
Procedure Open_Window_1()
  
  OpenWindow(#Window_1, 0, 0, 277, 260, "О программе MODGET 8x8", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  EditorGadget(72,2,2,496,370,#PB_Editor_ReadOnly)
  SendMessage_(GadgetID(72), #EM_SETTARGETDEVICE, #Null, 0) ; Перенос по словам
  
  ;If
  LoadImage(70, "LOGO.bmp")    ; change 2nd parameter to the path/filename of your image
  ImageGadget(70,  10, 12, 100, 83, ImageID(70))                      ; imagegadget standard
  ;ImageGadget(1, 10, 10, 100, 83, ImageID(0), #PB_Image_Border)     ; imagegadget with border
  EditorGadget(72,102,108,165,115,#PB_Editor_ReadOnly)
  SendMessage_(GadgetID(72), #EM_SETTARGETDEVICE, #Null, 0) ; Перенос по словам 
  FileStreamIn(72, "Авторы.rtf")
  
  TextGadget(62,102,10,100,18,"8x8_USB")
  TextGadget(63,102,34,100,18,"Версия 1.0")
  TextGadget(64,102,58,150,18,"Copyright © Radan 2011")
  TextGadget(65,102,82,100,18,"Radan Studio")
  
  ButtonGadget(66,192,230,75,19,"OK")
  ;EndIf
EndProcedure
Procedure.s ReadText(File$)
  Protected Text.s = ""
  If ReadFile(0, File$) 
    Size = Lof(0); размер файла в байтах
    If Size>0
      *String = AllocateMemory(Size); выделяем область памяти 
      If *String 
        FillMemory(*String, Size, 0)
        FormatFile=ReadStringFormat(0) ; Определение кодировки файла (Ascii, UTF8 или Unicode).
        ReadData(0, *String , Size); записываем строку в область памяти
        Text.s=PeekS(*String, -1, FormatFile)
        FreeMemory(*String)
      EndIf
    EndIf
    CloseFile(0)
  EndIf
  ProcedureReturn Text
EndProcedure
Image.DrawInfo
OpenWindow(0, 0, 0, 512, 207, "MODGET 8x8", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_Invisible)
CreateMenu(0, WindowID(0))    ; menu creation starts....
MenuTitle("Автозагрузка")
MenuItem(1, "Добавить в автозагрузку")
MenuItem(2, "Удалить из автозагрузки")
MenuTitle("Помощь")
MenuItem(3, "О программе")
;LoadImage(80, "Фон.bmp")    ; change 2nd parameter to the path/filename of your image
;ImageGadget(80,  6, 33, 148, 148, ImageID(80))                      ; imagegadget standard      
Draw_Image(@Image)
ImageGadget(82,6, 33,148,148,ImageID(80))
;Добавим иконку в системный трей 
AddSysTrayIcon(67, WindowID(0), ExtractIcon_(0,ProgramFilename(),0))
SysTrayIconToolTip(67, "MODGET 8x8") 
;Добавим к иконке меню
CreatePopupMenu(68) 
MenuItem(4, "Развернуть") 
MenuItem(5, "Свернуть") 
MenuBar() 
MenuItem(10, "Выход")   
TextGadget(55, 387, 5, 120 ,15,"MODGET ");, #PB_Text_Border);|#PB_Text_Center)
;SetGadgetColor(55, #PB_Gadget_FrontColor, $FF00FF)
TextGadget(1, 440, 5, 120 ,15,#NO_Device);, #PB_Text_Border);|#PB_Text_Center)
SetGadgetColor(1, #PB_Gadget_FrontColor, $0000FF)
PanelGadget (0, 170, 33, 339, 150)
AddGadgetItem (0, -1, "Случайный")
TrackBarGadget(18, 17, 6, 165, 35, 0, 18, #PB_TrackBar_Ticks)
TrackBarGadget(19, 17, 57, 165, 35, 0, 100, #PB_TrackBar_Ticks)
TrackBarGadget(20, 214, 80, 99, 43, 0, 18, #PB_TrackBar_Ticks)
ButtonGadget(21,186,95,22,23,"")
TextGadget(22, 17, 39, 50 ,18,"Пиксели")
TextGadget(23, 17, 90, 50 ,13,"Скорость")
OptionGadget(13, 188, 3, 70, 20, "Случайно")
OptionGadget(14, 188, 23, 60, 20, "Матрица")
OptionGadget(15, 188, 43, 90, 20, "Калейдоскоп")
;SetGadgetState(13, 13)   ; set second option as active one
CheckBoxGadget(16, 188, 63, 70, 20, "Инверсия"): SetGadgetState(16, #PB_Checkbox_Checked) 
CheckBoxGadget(17, 270, 63, 70, 20, "Звук")
SetGadgetState(17, #PB_Checkbox_Checked)
AddGadgetItem (0, -1,"Время")
TrackBarGadget(8, 50, 16, 165, 35, 0, 300, #PB_TrackBar_Ticks)
TextGadget(25, 50, 50, 50 ,13,"Скорость")
;    TextGadget(0, 50, 70, 80, 20, "")
;AddWindowTimer(0, 123, 1000)
;GadgetToolTip(7, "Уровень сигнала")
OptionGadget(9, 250, 10, 60, 20, "Вид 1")
OptionGadget(10, 250, 32, 60, 20, "Вид 2")
OptionGadget(11, 250, 54, 60, 20, "Вид 3")
;SetGadgetState(9, 9)   ; set second option as active one
CheckBoxGadget(12, 250, 76, 70, 20, "Инверсия")
SetGadgetState(12, #PB_Checkbox_Checked)  
AddGadgetItem (0, -1,"Курс валют")
CheckBoxGadget(25, 11, 9, 70, 13, "Инверсия")
SetGadgetState(25, #PB_Checkbox_Checked) 
CheckBoxGadget(26, 89, 9, 60, 13, "Регистр")
SetGadgetState(26, #PB_Checkbox_Checked) 
OptionGadget(27, 11, 99, 95, 20, "Горизонтально")
OptionGadget(28, 115, 99, 90, 20, "Вертикально")
TrackBarGadget(29, 10, 52, 142, 45, 0, 300, #PB_TrackBar_Ticks)
ComboBoxGadget(30, 10, 28, 142, 21)
AddGadgetItem(30, -1, "Украина")
AddGadgetItem(30, -1, "Россия")
EditorGadget(31,158,7,163,90,#PB_Editor_ReadOnly) 
AddGadgetItem (0, -1,"Текст")
CheckBoxGadget(43, 7, 35, 70, 13, "Инверсия")
SetGadgetState(43, #PB_Checkbox_Checked) 
CheckBoxGadget(44, 85, 35, 60, 13, "Регистр")
SetGadgetState(44, #PB_Checkbox_Checked) 
OptionGadget(45, 11, 84, 95, 20, "Горизонтально")
OptionGadget(46, 11, 102, 90, 20, "Вертикально")
TrackBarGadget(47, 6, 51, 142, 35, 0, 300, #PB_TrackBar_Ticks)
ComboBoxGadget(48, 154, 98, 163, 21)
EditorGadget(49,154,7,163,89,#PB_Editor_ReadOnly)
SendMessage_(GadgetID(49),#EM_SETTARGETDEVICE, #Null, 0)
ButtonGadget(50,6,6,144,23,"Загрузить текст")
;Получает полный путь запущенного приложения      
Result$ = ProgramFilename()
;Извлекает путь из полного пути. Например, если полный путь "C:\PureBasic\PB.exe", результат будет "C:\PureBasic\". 
Path$ = GetPathPart(Result$)
;Debug Path$
; Просмотр всех элементов директории запущенного приложения  (без поддиректорий)
Directory$ = Path$   
If ExamineDirectory(0, Directory$, "*.txt")  
  m=0
  While NextDirectoryEntry(0)
    
    AddGadgetItem(48, -1, Left(DirectoryEntryName(0), Len(DirectoryEntryName(0))-4))
    
    txt.s=Text + ".txt"
    
    If DirectoryEntryName(0) = txt
      SetGadgetState(48, m) 
    EndIf
    m=m+1      ;Debug DirectoryEntryName(0) ;+ Type$ + "- Size in byte: " + Str(DirectoryEntrySize(0))
  Wend
  FinishDirectory(0)
EndIf
AddGadgetItem (0, -1,"Погода")
CheckBoxGadget(32, 11, 9, 70, 13, "Инверсия")
SetGadgetState(32, #PB_Checkbox_Checked) 
CheckBoxGadget(33, 89, 9, 60, 13, "Регистр")
SetGadgetState(33, #PB_Checkbox_Checked) 
OptionGadget(34, 11, 84, 94, 20, "Горизонтально")
OptionGadget(35, 11, 102, 85, 20, "Вертикально")
TrackBarGadget(36, 10, 52, 142, 35, 0, 300, #PB_TrackBar_Ticks)
ComboBoxGadget(37, 10, 28, 142, 21)
EditorGadget(38,158,7,163,90,#PB_Editor_ReadOnly)
CheckBoxGadget(39, 158, 102, 30, 20, "6")
SetGadgetState(39, #PB_Checkbox_Checked)  
CheckBoxGadget(40, 202, 102, 40, 20, "12")
SetGadgetState(40, #PB_Checkbox_Checked)  
CheckBoxGadget(41, 246, 102, 40, 20, "18")
SetGadgetState(41, #PB_Checkbox_Checked)  
CheckBoxGadget(42, 290, 102, 40, 20, "24")
SetGadgetState(42, #PB_Checkbox_Checked)  
AddGadgetItem (0, -1,"Спектр")
TrackBarGadget(7, 27, 16, 165, 45, 0, 18, #PB_TrackBar_Ticks)
;GadgetToolTip(7, "Уровень сигнала")
OptionGadget(4, 250, 10, 60, 20, "Линия 1")
OptionGadget(5, 250, 32, 60, 20, "Линия 2")
OptionGadget(6, 250, 54, 60, 20, "Точка")
;SetGadgetState(4, 4)   ; set second option as active one
CheckBoxGadget(24, 250, 76, 70, 20, "Инверсия")
SetGadgetState(24, #PB_Checkbox_Checked)  
CloseGadgetList()
HideWindow(0,0)
;--------------------Главный цикл---------------------
Repeat 
  
  Event= WaitWindowEvent() 
  Window=EventWindow() 
  Gadget=EventGadget()
  
  If Event = #PB_Event_SysTray 
    If EventType() = #PB_EventType_RightClick ; Обработка правой кнопки мышки 
      DisplayPopupMenu(68, WindowID(0)) ; показ вспывающего меню 
    EndIf 
    If EventType() = #PB_EventType_LeftClick
      
      HideWindow(0, 0)
      SetWindowState(0, #PB_Window_Normal) 
    EndIf
  EndIf 
  
  If Event = #PB_Event_Menu 
    Select EventMenu() 
      Case 1 ;"Добавить в автозагрузку"  
        ;RunProgramAtStartup(1,1,"MODGET 8x8",ProgramFilename()) ; Add to Startup
        ProgramAtStartup(1, "MODGET 8x8")
      Case 2 ;"Удалить из автозагрузки"
        ;DelProgramAtStartup(1,1,"MODGET 8x8") ; Remove from Startup  
        ProgramAtStartup(0, "MODGET 8x8")
      Case 3 ;"О программе"
        Open_Window_1()  
      Case 4 ;"Развернуть"  
        HideWindow(0, 0)
        SetWindowState(0, #PB_Window_Normal)   
      Case 5 ;"Свернуть" 
        HideWindow(0, 1) 
      Case 10 ;"Выход"
        
        ;Q = 1
        
        Break
        
    EndSelect 
  EndIf 
  
  If Event=#PB_Event_MinimizeWindow ;Событие при сворачивании окна
    HideWindow(0,1) ;свернуть окно
  EndIf
  
  ;{----------События компонентов----------
  If Event=#PB_Event_Gadget
    
    Select EventGadget()
        
      Case 13
        
        If GetGadgetState (13) = 1
          ImageGadget(84,20,20,148,148, 0)
          Draw_Image(@Image)
          
          SetTimer_(WindowID(0),2,100, @Timer1() )
        EndIf
        
        
      Case 48
        If EventType() = 1 ; Выпадающий список закрылся
          File$ = Path$ + GetGadgetText(48)+".txt"
          Text=ReadText(File$)
          SetGadgetText(49,Text)
        EndIf
      Case 50
        
        StandardFile$ = ""   ; set initial file+path to display
        ; With next string we will set the search patterns ("|" as separator) for file displaying:
        ;  1st: "Text (*.txt)" as name, ".txt" and ".bat" as allowed extension
        ;  2nd: "PureBasic (*.pb)" as name, ".pb" as allowed extension
        ;  3rd: "All files (*.*) as name, "*.*" as allowed extension, valid for all files
        Pattern$ = "Text (*.txt)|*.txt"
        Pattern = 0    ; use the first of the three possible patterns as standard
        File$ = OpenFileRequester("Открыть файл", StandardFile$, Pattern$, Pattern)
        If File$
          Text=ReadText(File$)
          SetGadgetText(49,Text)
        EndIf
        
      Case 66
        CloseWindow(#Window_1)
    EndSelect
    
    
    
  EndIf 
  ;}-------------------------------------
  
Until Event = #PB_Event_CloseWindow ;Or Q = 1 ;Конец главного цикла