void ColumnListView::SetSorting(int32 NumberOfKeys, int32* SortKeys, CLVSortMode* SortModes) { BWindow* ParentWindow = Window(); if(ParentWindow) ParentWindow->Lock(); //Need to remove old sort keys and erase all the old underlines BRect LabelBounds = fColumnLabelView->Bounds(); int32 SortKeyCount = fSortKeyList.CountItems(); for(int32 Counter = 0; Counter < SortKeyCount; Counter++) { CLVColumn* UnderlineColumn = (CLVColumn*)fSortKeyList.ItemAt(Counter); if(UnderlineColumn->fSortMode != NoSort) fColumnLabelView->Invalidate(BRect(UnderlineColumn->fColumnBegin,LabelBounds.top, UnderlineColumn->fColumnEnd,LabelBounds.bottom)); } fSortKeyList.MakeEmpty(); for(int32 Counter = 0; Counter < NumberOfKeys; Counter++) { if(Counter == 0) SetSortKey(SortKeys[0]); else AddSortKey(SortKeys[Counter]); SetSortMode(SortKeys[Counter],SortModes[Counter]); } if(ParentWindow) ParentWindow->Unlock(); }
void ColumnListView::AddSortKey(int32 ColumnIndex) { CLVColumn* Column; if(ColumnIndex >= 0) { Column = (CLVColumn*)fColumnList.ItemAt(ColumnIndex); if(!(Column->Flags()&CLV_SORT_KEYABLE)) return; } else Column = NULL; if(Column && !fSortKeyList.HasItem(Column)) { BWindow* ParentWindow = Window(); if(ParentWindow) ParentWindow->Lock(); BRect LabelBounds = fColumnLabelView->Bounds(); fSortKeyList.AddItem(Column); if(Column->fSortMode == NoSort) SetSortMode(ColumnIndex,Ascending); SortItems(); //Need to draw new underline fColumnLabelView->Invalidate(BRect(Column->fColumnBegin,LabelBounds.top,Column->fColumnEnd, LabelBounds.bottom)); if(ParentWindow) ParentWindow->Unlock(); } }
void ColumnListView::ReverseSortMode(int32 ColumnIndex) { CLVColumn* Column; if(ColumnIndex >= 0) { Column = (CLVColumn*)fColumnList.ItemAt(ColumnIndex); if(!(Column->Flags()&CLV_SORT_KEYABLE)) return; } else return; if(Column->fSortMode == Ascending) SetSortMode(ColumnIndex,Descending); else if(Column->fSortMode == Descending) SetSortMode(ColumnIndex,NoSort); else if(Column->fSortMode == NoSort) SetSortMode(ColumnIndex,Ascending); }
void CMatchingDlg::OnFrameColumnClicked(GtkTreeViewColumn *pCol) { for (GSList *ptr=m_FrameCols; ptr!=NULL; ptr=ptr->next) { tColData *col = (tColData*)ptr->data; if (col->col == pCol) { SetSortMode(col->data->column); g_Project->SetInt("MatchingDlg", "Sort", m_FrameSort); break; } } }
bool CMatchingDlg::SelectFrame(int *frame_id) { m_FrameID = 0; gtk_widget_hide(m_UseFrame); ReadFrames(true, *frame_id); SetSelectMode(REFERENCE_FRAME); SetSortMode(m_FrameSort); UpdatePreview(true); UpdateControls(); if (gtk_dialog_run(GTK_DIALOG(m_pDlg))==GTK_RESPONSE_ACCEPT) { g_Project->SetInt("MatchingDlg", "Frame", m_FrameID); *frame_id = m_FrameID; return true; } return false; }
void ColumnListView::SetSortKey(int32 ColumnIndex) { CLVColumn* Column; if(ColumnIndex >= 0) { Column = (CLVColumn*)fColumnList.ItemAt(ColumnIndex); if(!(Column->Flags()&CLV_SORT_KEYABLE)) return; } else Column = NULL; if(fSortKeyList.ItemAt(0) != Column || Column == NULL) { BWindow* ParentWindow = Window(); if(ParentWindow) ParentWindow->Lock(); BRect LabelBounds = fColumnLabelView->Bounds(); //Need to remove old sort keys and erase all the old underlines int32 SortKeyCount = fSortKeyList.CountItems(); for(int32 Counter = 0; Counter < SortKeyCount; Counter++) { CLVColumn* UnderlineColumn = (CLVColumn*)fSortKeyList.ItemAt(Counter); if(UnderlineColumn->fSortMode != NoSort) fColumnLabelView->Invalidate(BRect(UnderlineColumn->fColumnBegin,LabelBounds.top, UnderlineColumn->fColumnEnd,LabelBounds.bottom)); } fSortKeyList.MakeEmpty(); if(Column) { fSortKeyList.AddItem(Column); if(Column->fSortMode == NoSort) SetSortMode(ColumnIndex,Ascending); SortItems(); //Need to draw new underline fColumnLabelView->Invalidate(BRect(Column->fColumnBegin,LabelBounds.top,Column->fColumnEnd, LabelBounds.bottom)); } if(ParentWindow) ParentWindow->Unlock(); } }
void CMatchingDlg::Execute(void) { int res; char msg[256]; m_FrameID = 0; g_free(m_CatFile); m_CatFile = NULL; g_free(m_SelectionName); m_SelectionName = NULL; m_FileList = NULL; // Restore path to catalog files gchar *fpath = CConfig::GetStr("MakeCatDlg", "Folder", NULL); if (fpath && *fpath!='\0' && g_file_test(fpath, G_FILE_TEST_IS_DIR)) gtk_entry_set_text(GTK_ENTRY(m_PathEntry), fpath); else { gchar *defpath = g_build_filename(get_user_data_dir(), "Catalog files", NULL); if (force_directory(defpath)) gtk_entry_set_text(GTK_ENTRY(m_PathEntry), defpath); g_free(defpath); } g_free(fpath); // Update list of frames ReadFrames(false, g_Project->GetInt("MatchingDlg", "Frame", 0)); // Update list of catalog files gchar *path = g_Project->GetStr("MatchingDlg", "File", NULL); if (!path) path = CConfig::GetStr("MatchingDlg", "File", NULL); ReadCatalogs(path); g_free(path); gtk_widget_show(m_UseFrame); // Check inputs if (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(m_Frames), NULL)==0) { ShowError(m_pParent, "There are no frames usable as a reference frame."); return; } // Select reference frame or the first frame SetSelectMode(m_SelectMode); SetSortMode(m_FrameSort); UpdatePreview(true); UpdateControls(); if (gtk_dialog_run(GTK_DIALOG(m_pDlg))!=GTK_RESPONSE_ACCEPT) return; gtk_widget_hide(m_pDlg); g_Project->SetInt("MatchingDlg", "Select", m_SelectMode); if (m_SelectMode == REFERENCE_FRAME) g_Project->SetInt("MatchingDlg", "Frame", m_FrameID); else { g_Project->SetStr("MatchingDlg", "File", m_CatFile); CConfig::SetStr("MatchingDlg", "File", m_CatFile); } g_Project->ClearReference(); // Always all files gtk_tree_model_foreach(g_Project->FileList(), GtkTreeModelForeachFunc(make_list), &m_FileList); CProgressDlg pDlg(m_pParent, "Matching photometry files"); pDlg.SetMinMax(0, g_list_length(m_FileList)); res = pDlg.Execute(ExecuteProc, this); if (res!=0) { char *msg = cmpack_formaterror(res); ShowError(m_pParent, msg, true); cmpack_free(msg); } else if (m_OutFiles==0) { ShowError(m_pParent, "No file was successfully processed.", true); } else if (m_OutFiles!=m_InFiles) { sprintf(msg, "%d file(s) were successfully processed, %d file(s) failed.", m_OutFiles, m_InFiles-m_OutFiles); ShowWarning(m_pParent, msg, true); } else { sprintf(msg, "All %d file(s) were successfully processed.", m_OutFiles); ShowInformation(m_pParent, msg, true); } // Free allocated memory g_list_foreach(m_FileList, (GFunc)gtk_tree_row_reference_free, NULL); g_list_free(m_FileList); m_FileList = NULL; g_free(m_CatFile); m_CatFile = NULL; g_free(m_SelectionName); m_SelectionName = NULL; }
int Panel::SetPluginCommand(int Command,int Param1,void* Param2) { _ALGO(CleverSysLog clv(L"Panel::SetPluginCommand")); _ALGO(SysLog(L"(Command=%s, Param1=[%d/0x%08X], Param2=[%d/0x%08X])",_FCTL_ToName(Command),(int)Param1,Param1,(int)Param2,Param2)); int Result=FALSE; ProcessingPluginCommand++; switch (Command) { case FCTL_SETVIEWMODE: Result = Parent()->ChangePanelViewMode(shared_from_this(), Param1, Parent()->IsTopWindow()); break; case FCTL_SETSORTMODE: { int Mode=Param1; if ((Mode>SM_DEFAULT) && (Mode < SM_COUNT)) { SetSortMode(panel_sort(Mode - 1)); // Уменьшим на 1 из-за SM_DEFAULT Result=TRUE; } break; } case FCTL_SETSORTORDER: { ChangeSortOrder(Param1 != 0); Result=TRUE; break; } case FCTL_SETDIRECTORIESFIRST: { ChangeDirectoriesFirst(Param1 != 0); Result=TRUE; break; } case FCTL_CLOSEPANEL: if (m_PanelMode == panel_mode::PLUGIN_PANEL) { string folder=NullToEmpty((const wchar_t *)Param2); SetCurDir(folder,true); if (folder.empty()) Update(UPDATE_KEEP_SELECTION); Redraw(); } Result=TRUE; break; case FCTL_GETPANELINFO: { PanelInfo *Info=(PanelInfo *)Param2; if(!CheckStructSize(Info)) break; *Info = {}; Info->StructSize = sizeof(PanelInfo); UpdateIfRequired(); Info->OwnerGuid=FarGuid; Info->PluginHandle=nullptr; switch (GetType()) { case panel_type::FILE_PANEL: Info->PanelType=PTYPE_FILEPANEL; break; case panel_type::TREE_PANEL: Info->PanelType=PTYPE_TREEPANEL; break; case panel_type::QVIEW_PANEL: Info->PanelType=PTYPE_QVIEWPANEL; break; case panel_type::INFO_PANEL: Info->PanelType=PTYPE_INFOPANEL; break; } int X1,Y1,X2,Y2; GetPosition(X1,Y1,X2,Y2); Info->PanelRect.left=X1; Info->PanelRect.top=Y1; Info->PanelRect.right=X2; Info->PanelRect.bottom=Y2; Info->ViewMode=GetViewMode(); Info->SortMode = static_cast<OPENPANELINFO_SORTMODES>((GetSortMode() < panel_sort::COUNT? SM_UNSORTED - static_cast<int>(panel_sort::UNSORTED) : 0) + static_cast<int>(GetSortMode())); Info->Flags |= Global->Opt->ShowHidden? PFLAGS_SHOWHIDDEN : 0; Info->Flags |= Global->Opt->Highlight? PFLAGS_HIGHLIGHT : 0; Info->Flags |= GetSortOrder()? PFLAGS_REVERSESORTORDER : 0; Info->Flags |= GetSortGroups()? PFLAGS_USESORTGROUPS : 0; Info->Flags |= GetSelectedFirstMode()? PFLAGS_SELECTEDFIRST : 0; Info->Flags |= GetDirectoriesFirst()? PFLAGS_DIRECTORIESFIRST : 0; Info->Flags |= (GetMode() == panel_mode::PLUGIN_PANEL)? PFLAGS_PLUGIN : 0; Info->Flags |= IsVisible()? PFLAGS_VISIBLE : 0; Info->Flags |= IsFocused()? PFLAGS_FOCUS : 0; Info->Flags |= Parent()->IsLeft(this)? PFLAGS_PANELLEFT : 0; if (GetType() == panel_type::FILE_PANEL) { FileList *DestFilePanel=(FileList *)this; if (Info->Flags&PFLAGS_PLUGIN) { Info->OwnerGuid = DestFilePanel->GetPluginHandle()->plugin()->Id(); Info->PluginHandle = DestFilePanel->GetPluginHandle()->panel(); static int Reenter=0; if (!Reenter) { Reenter++; OpenPanelInfo PInfo; DestFilePanel->GetOpenPanelInfo(&PInfo); if (PInfo.Flags & OPIF_REALNAMES) Info->Flags |= PFLAGS_REALNAMES; if (PInfo.Flags & OPIF_DISABLEHIGHLIGHTING) Info->Flags &= ~PFLAGS_HIGHLIGHT; if (PInfo.Flags & OPIF_USECRC32) Info->Flags |= PFLAGS_USECRC32; if (PInfo.Flags & OPIF_SHORTCUT) Info->Flags |= PFLAGS_SHORTCUT; Reenter--; } } DestFilePanel->PluginGetPanelInfo(*Info); } if (!(Info->Flags&PFLAGS_PLUGIN)) // $ 12.12.2001 DJ - на неплагиновой панели - всегда реальные имена Info->Flags |= PFLAGS_REALNAMES; Result=TRUE; break; } case FCTL_GETPANELPREFIX: { string strTemp; if (GetType() == panel_type::FILE_PANEL && GetMode() == panel_mode::PLUGIN_PANEL) { PluginInfo PInfo = {sizeof(PInfo)}; FileList *DestPanel = ((FileList*)this); if (DestPanel->GetPluginInfo(&PInfo)) strTemp = NullToEmpty(PInfo.CommandPrefix); } if (Param1&&Param2) xwcsncpy((wchar_t*)Param2, strTemp.c_str(), Param1); Result=(int)strTemp.size()+1; break; } case FCTL_GETPANELHOSTFILE: case FCTL_GETPANELFORMAT: { string strTemp; if (GetType() == panel_type::FILE_PANEL) { FileList *DestFilePanel=(FileList *)this; static int Reenter=0; if (!Reenter && GetMode() == panel_mode::PLUGIN_PANEL) { Reenter++; OpenPanelInfo PInfo; DestFilePanel->GetOpenPanelInfo(&PInfo); switch (Command) { case FCTL_GETPANELHOSTFILE: strTemp=NullToEmpty(PInfo.HostFile); break; case FCTL_GETPANELFORMAT: strTemp=NullToEmpty(PInfo.Format); break; } Reenter--; } } if (Param1&&Param2) xwcsncpy((wchar_t*)Param2, strTemp.c_str(), Param1); Result=(int)strTemp.size()+1; break; } case FCTL_GETPANELDIRECTORY: { static int Reenter=0; if(!Reenter) { Reenter++; ShortcutInfo Info; GetShortcutInfo(Info); Result = static_cast<int>(aligned_sizeof<FarPanelDirectory>()); const auto folderOffset = Result; Result+=static_cast<int>(sizeof(wchar_t)*(Info.ShortcutFolder.size()+1)); const auto pluginFileOffset = Result; Result+=static_cast<int>(sizeof(wchar_t)*(Info.PluginFile.size()+1)); const auto pluginDataOffset = Result; Result+=static_cast<int>(sizeof(wchar_t)*(Info.PluginData.size()+1)); const auto dirInfo = static_cast<FarPanelDirectory*>(Param2); if(Param1>=Result && CheckStructSize(dirInfo)) { dirInfo->StructSize=sizeof(FarPanelDirectory); dirInfo->PluginId=Info.PluginGuid; dirInfo->Name = static_cast<wchar_t*>(static_cast<void*>(static_cast<char*>(Param2) + folderOffset)); dirInfo->Param = static_cast<wchar_t*>(static_cast<void*>(static_cast<char*>(Param2) + pluginDataOffset)); dirInfo->File = static_cast<wchar_t*>(static_cast<void*>(static_cast<char*>(Param2) + pluginFileOffset)); *std::copy(ALL_CONST_RANGE(Info.ShortcutFolder), const_cast<wchar_t*>(dirInfo->Name)) = L'\0'; *std::copy(ALL_CONST_RANGE(Info.PluginData), const_cast<wchar_t*>(dirInfo->Param)) = L'\0'; *std::copy(ALL_CONST_RANGE(Info.PluginFile), const_cast<wchar_t*>(dirInfo->File)) = L'\0'; } Reenter--; } break; } case FCTL_GETCOLUMNTYPES: case FCTL_GETCOLUMNWIDTHS: if (GetType() == panel_type::FILE_PANEL) { string strColumnTypes,strColumnWidths; ((FileList *)this)->PluginGetColumnTypesAndWidths(strColumnTypes,strColumnWidths); if (Command==FCTL_GETCOLUMNTYPES) { if (Param1&&Param2) xwcsncpy((wchar_t*)Param2,strColumnTypes.c_str(),Param1); Result=(int)strColumnTypes.size()+1; } else { if (Param1&&Param2) xwcsncpy((wchar_t*)Param2,strColumnWidths.c_str(),Param1); Result=(int)strColumnWidths.size()+1; } } break; case FCTL_GETPANELITEM: { if (GetType() == panel_type::FILE_PANEL && CheckNullOrStructSize(static_cast<FarGetPluginPanelItem*>(Param2))) Result = static_cast<int>(static_cast<FileList*>(this)->PluginGetPanelItem(Param1, static_cast<FarGetPluginPanelItem*>(Param2))); break; } case FCTL_GETSELECTEDPANELITEM: { if (GetType() == panel_type::FILE_PANEL && CheckNullOrStructSize(static_cast<FarGetPluginPanelItem*>(Param2))) Result = static_cast<int>(static_cast<FileList*>(this)->PluginGetSelectedPanelItem(Param1, static_cast<FarGetPluginPanelItem*>(Param2))); break; } case FCTL_GETCURRENTPANELITEM: { if (GetType() == panel_type::FILE_PANEL && CheckNullOrStructSize(static_cast<FarGetPluginPanelItem*>(Param2))) { PanelInfo Info; const auto DestPanel = static_cast<FileList*>(this); DestPanel->PluginGetPanelInfo(Info); Result = static_cast<int>(DestPanel->PluginGetPanelItem(static_cast<int>(Info.CurrentItem), static_cast<FarGetPluginPanelItem*>(Param2))); } break; } case FCTL_BEGINSELECTION: { if (GetType() == panel_type::FILE_PANEL) { ((FileList *)this)->PluginBeginSelection(); Result=TRUE; } break; } case FCTL_SETSELECTION: { if (GetType() == panel_type::FILE_PANEL) { ((FileList *)this)->PluginSetSelection(Param1, Param2 != nullptr); Result=TRUE; } break; } case FCTL_CLEARSELECTION: { if (GetType() == panel_type::FILE_PANEL) { static_cast<FileList*>(this)->PluginClearSelection(Param1); Result=TRUE; } break; } case FCTL_ENDSELECTION: { if (GetType() == panel_type::FILE_PANEL) { ((FileList *)this)->PluginEndSelection(); Result=TRUE; } break; } case FCTL_UPDATEPANEL: Update(Param1?UPDATE_KEEP_SELECTION:0); if (GetType() == panel_type::QVIEW_PANEL) UpdateViewPanel(); Result=TRUE; break; case FCTL_REDRAWPANEL: { PanelRedrawInfo *Info=(PanelRedrawInfo *)Param2; if (CheckStructSize(Info)) { m_CurFile=static_cast<int>(Info->CurrentItem); m_CurTopFile=static_cast<int>(Info->TopPanelItem); } // $ 12.05.2001 DJ перерисовываемся только в том случае, если мы - текущее окно if (Parent()->IsTopWindow()) Redraw(); Result=TRUE; break; } case FCTL_SETPANELDIRECTORY: { const auto dirInfo = static_cast<const FarPanelDirectory*>(Param2); if (CheckStructSize(dirInfo)) { Result = ExecShortcutFolder(NullToEmpty(dirInfo->Name), dirInfo->PluginId, NullToEmpty(dirInfo->File), NullToEmpty(dirInfo->Param), false, false, true); // restore current directory to active panel path if (!IsFocused()) { Parent()->ActivePanel()->SetCurPath(); } } break; } case FCTL_SETACTIVEPANEL: { if (IsVisible()) { Parent()->SetActivePanel(this); Result=TRUE; } break; } } ProcessingPluginCommand--; return Result; }