//RUNAS import win; import win.ui; import win.ui.toolbar; import win.ui.accelerator; import fonts.fontAwesome; import console; import config; import flexcell; import teUtils; import teMenu; /*DSG{{*/ var mainForm = win.form(text="TabEditor++";right=1399;bottom=799;bgcolor=16777215) mainForm.add( custom={cls="custom";text="自定义控件";left=0;top=36;right=1400;bottom=800;ah=1;aw=1;bgcolor=12639424;db=1;dl=1;dr=1;dt=1;z=2}; plus={cls="plus";left=0;top=0;right=1400;bottom=36;bgcolor=16777215;border={left=1;top=1;right=1;color=-6250332};clipBk=false;clipch=1;dl=1;dr=1;dt=1;font=LOGFONT(h=-18);forecolor=16777215;notify=1;repeat="stretch";z=1} ) /*}}*/ //整理内存 import process; import raw; mainForm.release = function(){ collectgarbage("collect"); collectgarbage("collect"); } var frmChild = mainForm.loadForm("\dlg\searchForm.aardio"); //菜单控件初始化 g_teMenus = teMenu.TeMenu(mainForm.plus); //flexcell控件初始化 mainForm.g_flexcell = flexcell.FlexGrid(mainForm.custom,,,1); mainForm.g_flexcell.setTheme(flexcell.FlexGrid.themeWps); mainForm.g_flexcell.isModified = false; mainForm.g_flexcell.ShowResizeTip = true; teUtils.initFlexCellShow(mainForm.g_flexcell); mainForm.g_flexcell.AllowFilter = false; var showModifyStyle = function(){ mainForm.g_flexcell.isModified = true; if(teUtils.getCurFilePath() == null){ g_teMenus.disabled(0, 3, true); } else { g_teMenus.disabled(0, 3, false); } g_teMenus.disabled(0, 4, false); mainForm.text = string.replace(mainForm.text, '[ ][\*]', ""); mainForm.text += " *"; } var showUnmodifyStyle = function(){ mainForm.g_flexcell.isModified = false; g_teMenus.disabled(0, 3, true); g_teMenus.disabled(0, 4, true); mainForm.text = string.replace(mainForm.text, '[ ][\*]', ""); } showUnmodifyStyle(); /*菜单{{*/ //menu-新建 g_teMenus.newFile = function(ctrl){ return function(){ var curRow = mainForm.g_flexcell.ActiveCell().Row; var curCol = mainForm.g_flexcell.ActiveCell().Col; mainForm.g_flexcell.FrozenRows = 0; mainForm.g_flexcell.FrozenCols = 0; mainForm.g_flexcell.range(0,0,mainForm.g_flexcell.rowCount,mainForm.g_flexcell.colCount).ClearBackColor(); mainForm.g_flexcell.isModified = true;//避免 ModifyStyle, UnmodifyStyle 切换闪烁 mainForm.g_flexcell.clear(); teUtils.initFlexCellShow(mainForm.g_flexcell); showUnmodifyStyle(); mainForm.release(); } } //menu-打开 g_teMenus.openFile = function(ctrl){ return function(){ var t = teUtils.getTxtTableData(); if(t){ mainForm.text += "[ " + teUtils.getCurFilePath() + " ]"; g_teMenus.newFile(); mainForm.g_flexcell.AutoRedraw = false; mainForm.g_flexcell.setTable(t,,t.fields); mainForm.g_flexcell.column(0).AutoFit(); if(mainForm.g_flexcell.Column(0).Width < 40){ mainForm.g_flexcell.Column(0).Width = 40; } mainForm.g_flexcell.AutoRedraw = true; mainForm.g_flexcell.Refresh(); collectgarbage("collect"); collectgarbage("collect"); } } } //menu-保存 g_teMenus.saveFile = function(ctrl){ return function(){ teUtils.saveTxtTableData(mainForm.g_flexcell.getVlistData()); showUnmodifyStyle(); } } //menu-另存为 g_teMenus.saveAsFile = function(ctrl){ return function(){ teUtils.saveAsTxtTableData(mainForm.g_flexcell.getVlistData()); mainForm.text += "[ " + teUtils.getCurFilePath() + " ]"; showUnmodifyStyle(); } } //menu-设置背景色 g_teMenus.setBackground = function(ctrl){ return function(){ mainForm.g_flexcell.selection().BackColor = color.rgbReverse(ctrl.backgroundColor); } } import win.ui.ctrl.pick; g_teMenus.setBackgroundRClick = function(ctrl){ var colorPick = win.ui.ctrl.pick(mainForm); colorPick.onColorChange = function(clr){ ctrl.skin({ background={ active=clr; default=clr; hover=clr }; foreground={ hover = color.argb(0,0,0,20); active = color.argb(0,0,0,40) }; color={ active=0xE8000000; default=0xFF000000; disabled=0xFF6D6D6D } }) } colorPick.setColor(ctrl.backgroundColor); var x,y = win.getMessagePos(); colorPick.setPos(x,y); colorPick.doModal(); } //menu-设置前景色 g_teMenus.setForeground = function(ctrl){ return function(){ mainForm.g_flexcell.selection().ForeColor = color.rgbReverse(ctrl.argbColor); } } g_teMenus.setForegroundRClick = function(ctrl){ var colorPick = win.ui.ctrl.pick(mainForm); colorPick.onColorChange = function(clr){ ctrl.skin({ background={}; foreground={ hover = color.argb(0,0,0,20); active = color.argb(0,0,0,40) }; color={ active=clr; default=clr; disabled=clr } }) } colorPick.setColor(ctrl.argbColor); var x,y = win.getMessagePos(); colorPick.setPos(x,y); colorPick.doModal(); } class FlexFreeeItem { bool change = false; int start_row = 0; int start_col = 0; int end_row = 0; int end_col = 0; } var flexFreeeCol = FlexFreeeItem(); var flexFreeeRow = FlexFreeeItem(); var setFlexFreee = function(freee){ if(flexFreeeCol.change){ mainForm.g_flexcell.range(flexFreeeCol.start_row, flexFreeeCol.start_col, flexFreeeCol.end_row, flexFreeeCol.end_col).setBorders(2/*_FlexCell2_Edge_Right*/, 0/*_FlexCell2_BorderStyle_cellFlat*/ ); } if(flexFreeeRow.change){ mainForm.g_flexcell.range(flexFreeeRow.start_row, flexFreeeRow.start_col, flexFreeeRow.end_row, flexFreeeRow.end_col).setBorders(8/*_FlexCell2_Edge_Bottom*/ , 0/*_FlexCell2_BorderStyle_cellFlat*/ ); } if(!freee){return true;} mainForm.g_flexcell.range(flexFreeeCol.start_row, flexFreeeCol.start_col, flexFreeeCol.end_row, flexFreeeCol.end_col ).setBorders(2/*_FlexCell2_Edge_Right*/, 1/*_FlexCell2_BorderStyle_cellFlat*/); mainForm.g_flexcell.range(flexFreeeRow.start_row, flexFreeeRow.start_col, flexFreeeRow.end_row, flexFreeeRow.end_col ).setBorders(8/*_FlexCell2_Edge_Bottom*/ , 1/*_FlexCell2_BorderStyle_cellFlat*/);; } //menu-冻结行&列 g_teMenus.freeeRowCol = function(ctrl){ return function(){ var curRow = mainForm.g_flexcell.ActiveCell().Row; var curCol = mainForm.g_flexcell.ActiveCell().Col; setFlexFreee(false); //绘制冻结列的右侧边框线 flexFreeeCol.change = true; flexFreeeCol.start_row = curRow+1; flexFreeeCol.start_col = curCol; flexFreeeCol.end_row = mainForm.g_flexcell.rowCount; flexFreeeCol.end_col = curCol; //绘制冻结行的底部边框线 flexFreeeRow.change = true; flexFreeeRow.start_row = curRow; flexFreeeRow.start_col = curCol+1; flexFreeeRow.end_row = curRow; flexFreeeRow.end_col = mainForm.g_flexcell.colCount; setFlexFreee(true); //冻结行 mainForm.g_flexcell.FrozenRows = curRow; //冻结列 mainForm.g_flexcell.FrozenCols = curCol; } } //menu-取消冻结 g_teMenus.unfreeeRowCol = function(ctrl){ return function(){ setFlexFreee(false); mainForm.g_flexcell.FrozenRows = 0; mainForm.g_flexcell.FrozenCols = 0; } } //menu-导出 Sqlite3 g_teMenus.exportSqlite3 = function(ctrl){ return function(){ } } //menu-导出 txt g_teMenus.exportTxt = function(ctrl){ return function(){ } } //menu-关于 g_teMenus.showAbout = function(ctrl){ return function(){ import fsys.version; var version = fsys.version.getInfo(io._exepath).productVersion; mainForm.msgbox(version); } } //menu-帮助 g_teMenus.showHelp = function(ctrl){ return function(){ mainForm.release(); } } g_teMenus.setCommandFunc(0, 1, g_teMenus.newFile); g_teMenus.setCommandFunc(0, 2, g_teMenus.openFile); g_teMenus.setCommandFunc(0, 3, g_teMenus.saveFile); g_teMenus.setCommandFunc(0, 4, g_teMenus.saveAsFile); g_teMenus.setCommandFunc(0, 5, g_teMenus.setBackground); g_teMenus.setRightClickFunc(0, 5, g_teMenus.setBackgroundRClick); g_teMenus.setCommandFunc(0, 6, g_teMenus.setForeground); g_teMenus.setRightClickFunc(0, 6, g_teMenus.setForegroundRClick); g_teMenus.setCommandFunc(0, 7, g_teMenus.freeeRowCol); g_teMenus.setCommandFunc(0, 8, g_teMenus.unfreeeRowCol); g_teMenus.setCommandFunc(0, 9, g_teMenus.exportSqlite3); g_teMenus.setCommandFunc(0, 10, g_teMenus.exportTxt); g_teMenus.setCommandFunc(0, 11, g_teMenus.showAbout); g_teMenus.setCommandFunc(1, 1, g_teMenus.showHelp); /*}}*/ pre_searched_row = null; pre_searched_col = null; /*消息回调{{*/ mainForm.g_flexcell.onCellChange = function(Row,Col){ if(!mainForm.g_flexcell.isModified){ showModifyStyle(); } mainForm.g_flexcell.isModified = true; } mainForm.g_flexcell.onClick = function(Row,Col){ var row,col=owner.toRelativeRow(Row),owner.toRelativeCol(Col); } //左侧弹出菜单 mainForm.popmenuLeft = win.ui.popmenu(mainForm); mainForm.popmenuLeft.add('向上插入一行',function(id){ var curSelection = mainForm.g_flexcell.selection(); teUtils.insertFlexCellNewRow(mainForm.g_flexcell, curSelection.FirstRow, 1, mainForm.g_flexcell.colCount); curSelection.release(); mainForm.release(); } ) mainForm.popmenuLeft.add('向下插入一行',function(id){ var curSelection = mainForm.g_flexcell.selection(); teUtils.insertFlexCellNewRow(mainForm.g_flexcell, curSelection.FirstRow + 1, 1, mainForm.g_flexcell.colCount); curSelection.release(); mainForm.release(); } ) mainForm.popmenuLeft.add('删除行',function(id){ var curSelection = mainForm.g_flexcell.selection(); mainForm.g_flexcell.delRow(curSelection.FirstRow, 1/*删除数量*/); curSelection.release(); mainForm.release(); } ) //右侧弹出菜单 mainForm.popmenuRight = win.ui.popmenu(mainForm); mainForm.popmenuRight.add('向左插入一列',function(id){ var curSelection = mainForm.g_flexcell.selection(); teUtils.insertFlexCellNewCol(mainForm.g_flexcell, curSelection.FirstCol, 1, mainForm.g_flexcell.colCount); curSelection.release(); mainForm.release(); } ) mainForm.popmenuRight.add('向右插入一列',function(id){ var curSelection = mainForm.g_flexcell.selection(); teUtils.insertFlexCellNewCol(mainForm.g_flexcell, curSelection.FirstCol+1, 1, mainForm.g_flexcell.colCount); curSelection.release(); mainForm.release(); } ) mainForm.popmenuRight.add('删除列',function(id){ var curSelection = mainForm.g_flexcell.selection(); //TODO mainForm.msgbox("暂无删除列功能--TODO"); curSelection.release(); mainForm.release(); } ) mainForm.g_flexcell.onMouseUp = function(Button , Shift, x, y){ /*** 鼠标按键放开。 Button 当前按下的鼠标按钮:1:左按钮;2:右按钮;4:中间按钮;同时按下时执行位或操作。 Shift 功能键状态:1:SHIFT;2:CTRL;4:ALT;同时按下时执行位或操作。 x,y 鼠标指针当前位置 ***/ if(Button == 2){ mainForm.g_flexcell.cell(mainForm.g_flexcell.MouseRow, mainForm.g_flexcell.MouseCol).Select(); var x,y = win.getMessagePos(); if(mainForm.g_flexcell.MouseCol == 0){ mainForm.popmenuLeft.popup(x,y,true) } elseif(mainForm.g_flexcell.MouseRow == 0){ mainForm.popmenuRight.popup(x,y,true) } } if(pre_searched_row != null and pre_searched_col != null){ mainForm.g_flexcell.Cell(pre_searched_row, pre_searched_col).BackColor = 0xffffff; pre_searched_row = null; pre_searched_col = null; } } mainForm.g_flexcell.onSelChange = function(FirstRow,FirstCol,LastRow,LastCol){ /*** 在Selection选择范围改变时发生。参数:起始行,起始列,结束行,结束列 ***/ var row1,col1=owner.toRelativeRow(FirstRow),owner.toRelativeCol(FirstCol); var row2,col2=owner.toRelativeRow(LastRow),owner.toRelativeCol(LastCol); console.log(row1, col1, row2, col2) } /*}}*/ research_flag = true; searchNextContent = function(data, firstRow, firstCol, lastRow, lastCol, isRangeSearch, selFirstRow, selFirstCol, searchContent, isCaseSensitive, isCellMatching){ if(isRangeSearch){// 从一个范围开始搜索 var tempRow = firstRow; var tempCol = firstCol; firstRow = pre_searched_row != null and research_flag ? pre_searched_row : firstRow; firstCol = pre_searched_col != null and research_flag ? pre_searched_col : firstCol; for i,v in table.eachIndex(data){ if(i < firstRow or i > lastRow){ continue; } for i2,v2 in table.eachIndex(data.fields){ if(i2 < firstCol or i2 > lastCol){ continue; } if (i == pre_searched_row and i2 == pre_searched_col){ continue; } var currStr = v[v2]; if(#currStr == 0 and #searchContent != 0){ continue; } if(!isCaseSensitive){ currStr = string.lower(currStr); searchContent = string.lower(searchContent); } if (isCellMatching){ if(currStr == searchContent){ research_flag = true; pre_searched_row = i; pre_searched_col = i2; return i, i2; } } else { if(string.find(currStr, searchContent) or currStr == searchContent){ research_flag = true; pre_searched_row = i; pre_searched_col = i2; return i, i2; } } } firstCol = tempRow; firstCol = tempCol; } // 搜不到了,重头搜索 if(research_flag){ research_flag = false; pre_searched_row = null; pre_searched_col = null; row, col = searchNextContent(data, selFirstRow, selFirstCol, lastRow, lastCol, isRangeSearch, selFirstRow, selFirstCol, searchContent, isCaseSensitive, isCellMatching); return row, col; } research_flag = true; } else {// 从一个点开始搜索 for i,v in table.eachIndex(data){ if(i < firstRow){ continue; } for i2,v2 in table.eachIndex(data.fields){ if(i2 < firstCol){ continue } if(i == firstRow and i2 == firstCol){ continue; } var currStr = v[v2]; if(#currStr == 0 and #searchContent != 0){ continue; } if(!isCaseSensitive){ currStr = string.lower(currStr); searchContent = string.lower(searchContent); } if (isCellMatching){ if(currStr == searchContent){ research_flag = true; return i, i2; } } else { if(string.find(currStr, searchContent) or currStr == searchContent){ research_flag = true; return i, i2; } } } firstCol = 1; } // 搜不到了,重头搜索 if(research_flag){ research_flag = false; row, col = searchNextContent(data, 1, 1, 1, 1, isRangeSearch, selFirstRow, selFirstCol, searchContent, isCaseSensitive, isCellMatching); return row, col; } research_flag = true; } } subscribe("search_prev",function(...){ // TODO console.dump(...); } ) subscribe("search_next",function(...){ var args = {...}; var searchContent = args[1]; var isCaseSensitive = args[2]; var isCellMatching = args[3]; var curSelection = mainForm.g_flexcell.selection(); var firstRow = curSelection.FirstRow; var firstCol = curSelection.FirstCol; var lastRow = curSelection.LastRow; var lastCol = curSelection.LastCol; var isRangeSearch = false; if(firstRow != lastRow or firstCol != lastCol){ isRangeSearch = true; } if(pre_searched_row != null and pre_searched_col != null){ mainForm.g_flexcell.Cell(pre_searched_row, pre_searched_col).BackColor = 0xffffff; } var row, col = searchNextContent(mainForm.g_flexcell.getVlistData(), firstRow, firstCol, lastRow, lastCol, isRangeSearch, firstRow, firstCol, searchContent, isCaseSensitive, isCellMatching); //console.dump(row, col); if(row != null && col != null){ if(isRangeSearch){ if(pre_searched_row != null and pre_searched_col != null){ mainForm.g_flexcell.Cell(pre_searched_row, pre_searched_col).BackColor = 0xff00ff; } mainForm.g_flexcell.Cell(row, col).EnsureVisible(); } else { pre_searched_row = null; pre_searched_col = null; mainForm.g_flexcell.cell(row, col).Select(); } } else { frmChild.msgbox("找不到正在搜索的数据") } curSelection.release(); } ) //搜索窗口 var openSearchForm = function(){ frmChild.show(); frmChild.editSearchInput.setFocus(); } var accelerator = win.ui.accelerator({ { ctrl = true; vkey = 'F'#; oncommand = function() openSearchForm(); }; { ctrl = true; vkey = 'S'#; oncommand = function(){ var curRow = mainForm.g_flexcell.ActiveCell().Row; var curCol = mainForm.g_flexcell.ActiveCell().Col; mainForm.g_flexcell.Cell(curRow, curCol).SetFocus(); // 不加这个,光标处于的单元格内容不会被保存----规避方案 teUtils.saveTxtTableData(mainForm.g_flexcell.getVlistData()); showUnmodifyStyle(); }; }; },mainForm ); import win.ui.minmax; win.ui.minmax(mainForm,860,400); mainForm.show(); return win.loopMessage();