2019-08-23 11:56:54 -07:00
using Beefy.theme.dark ;
using Beefy.widgets ;
using Beefy.events ;
using System ;
2020-04-29 06:40:03 -07:00
using System.Collections ;
2019-08-23 11:56:54 -07:00
using Beefy.gfx ;
using IDE.Util ;
using System.IO ;
namespace IDE.ui
{
class InstalledProjectDialog : IDEDialog
{
class InstalledProject
{
public String mName ~ delete _ ;
public String mPath ~ delete _ ;
public VerSpecRecord mVersion ;
2022-06-24 10:29:40 -07:00
public Project . TargetType mTargetType ;
2019-08-23 11:56:54 -07:00
}
protected IDEListView mProjectList ;
2022-06-24 10:29:40 -07:00
DarkComboBox mKindCombo ;
2019-08-23 11:56:54 -07:00
EditWidget mEditWidget ;
bool mFilterChanged ;
List < InstalledProject > mInstalledProjectList = new . ( ) ~ DeleteContainerAndItems ! ( _ ) ;
List < InstalledProject > mFilteredList = new . ( ) ~ delete _ ;
public static Dictionary < String , int32 > sMRU = new . ( ) ~
{
for ( let key in _ . Keys )
delete key ;
delete _ ;
} ;
public this ( )
{
2020-03-30 12:17:24 -07:00
mWindowFlags = . ClientSized | . TopMost | . Caption | . Border | . SysMenu | . Resizable | . PopupPosition ;
2019-08-23 11:56:54 -07:00
AddOkCancelButtons ( new ( evt ) = > { DoImport ( ) ; } , null , 0 , 1 ) ;
//mApplyButton = AddButton("Apply", (evt) => { evt.mCloseDialog = false; ApplyChanges(); });
Title = "Import Installed Project" ;
mButtonBottomMargin = GS ! ( 6 ) ;
mButtonRightMargin = GS ! ( 6 ) ;
mProjectList = new . ( ) ;
mProjectList . InitScrollbars ( false , true ) ;
mProjectList . mAllowMultiSelect = false ;
mProjectList . mOnItemMouseDown . Add ( new = > ValueMouseDown ) ;
ListViewColumn column = mProjectList . AddColumn ( GS ! ( 200 ) , "Project" ) ;
column . mMinWidth = GS ! ( 100 ) ;
column = mProjectList . AddColumn ( GS ! ( 200 ) , "Path" ) ;
AddWidget ( mProjectList ) ;
mTabWidgets . Add ( mProjectList ) ;
mEditWidget = AddEdit ( "" ) ;
mEditWidget . mOnKeyDown . Add ( new = > EditKeyDownHandler ) ;
mEditWidget . mOnContentChanged . Add ( new ( evt ) = > { mFilterChanged = true ; } ) ;
2022-06-24 10:29:40 -07:00
mKindCombo = new DarkComboBox ( ) ;
mKindCombo . Label = "Libraries" ;
mKindCombo . mPopulateMenuAction . Add ( new ( menu ) = >
{
for ( var kind in String [ ? ] ( "All" , "Libraries" ) )
{
menu . AddItem ( kind ) . mOnMenuItemSelected . Add ( new ( menu ) = >
{
mFilterChanged = true ;
mKindCombo . Label = kind ;
} ) ;
}
} ) ;
AddWidget ( mKindCombo ) ;
2019-08-23 11:56:54 -07:00
FindProjects ( ) ;
}
void FindProjects ( )
{
2020-08-31 11:32:33 -07:00
gApp . CheckLoadConfig ( ) ;
gApp . mBeefConfig . mRegistry . WaitFor ( ) ;
for ( let registryEntry in gApp . mBeefConfig . mRegistry . mEntries )
2019-08-23 11:56:54 -07:00
{
InstalledProject installedProject = new . ( ) ;
installedProject . mName = new String ( registryEntry . mProjName ) ;
2021-02-25 08:10:21 -08:00
switch ( registryEntry . mLocation )
2019-08-23 11:56:54 -07:00
{
case . Path ( let path ) :
installedProject . mPath = new String ( ) ;
Path . GetAbsolutePath ( path , registryEntry . mConfigFile . mConfigDir , installedProject . mPath ) ;
installedProject . mPath . Append ( Path . DirectorySeparatorChar ) ;
installedProject . mPath . Append ( "BeefProj.toml" ) ;
default :
}
2022-06-24 10:29:40 -07:00
installedProject . mTargetType = registryEntry . mTargetType ;
2019-08-23 11:56:54 -07:00
mInstalledProjectList . Add ( installedProject ) ;
}
}
void EditKeyDownHandler ( KeyDownEvent evt )
{
switch ( evt . mKeyCode )
{
case . Up ,
. Down ,
. PageUp ,
. PageDown :
mProjectList . KeyDown ( evt . mKeyCode , false ) ;
default :
}
if ( evt . mKeyFlags = = . Ctrl )
{
switch ( evt . mKeyCode )
{
case . Home ,
. End :
mProjectList . KeyDown ( evt . mKeyCode , false ) ;
default :
}
}
}
public void ValueMouseDown ( ListViewItem clickedItem , float x , float y , int32 btnNum , int32 btnCount )
{
DarkListViewItem item = ( DarkListViewItem ) clickedItem . GetSubItem ( 0 ) ;
mProjectList . GetRoot ( ) . SelectItemExclusively ( item ) ;
mProjectList . SetFocus ( ) ;
if ( ( btnNum = = 0 ) & & ( btnCount > 1 ) )
{
DoImport ( ) ;
}
}
void FilterFiles ( )
{
let root = mProjectList . GetRoot ( ) ;
root . Clear ( ) ;
String filterString = scope String ( ) ;
mEditWidget . GetText ( filterString ) ;
filterString . Trim ( ) ;
2022-06-24 10:29:40 -07:00
bool onlyLibs = mKindCombo . Label = = "Libraries" ;
2021-05-21 23:06:11 +02:00
mFilteredList . Clear ( ) ;
2019-08-23 11:56:54 -07:00
for ( var installedProject in mInstalledProjectList )
{
2022-06-24 10:29:40 -07:00
if ( ( onlyLibs ) & & ( ! installedProject . mTargetType . IsLib ) )
continue ;
2019-08-23 11:56:54 -07:00
if ( ( ! filterString . IsEmpty ) & & ( installedProject . mName . IndexOf ( filterString , true ) = = - 1 ) )
continue ;
var listViewItem = mProjectList . GetRoot ( ) . CreateChildItem ( ) ;
listViewItem . Label = installedProject . mName ;
var subListViewItem = listViewItem . CreateSubItem ( 1 ) ;
2022-06-24 10:29:40 -07:00
subListViewItem . Label = Path . GetDirectoryPath ( installedProject . mPath , . . scope . ( ) ) ;
2019-08-23 11:56:54 -07:00
mFilteredList . Add ( installedProject ) ;
}
ListViewItem bestItem = null ;
int32 bestPri = - 1 ;
for ( int32 childIdx = 0 ; childIdx < root . GetChildCount ( ) ; childIdx + + )
{
var listViewItem = root . GetChildAtIndex ( childIdx ) ;
var projectSource = mFilteredList [ childIdx ] ;
int32 pri ;
sMRU . TryGetValue ( projectSource . mPath , out pri ) ;
if ( pri > bestPri )
{
bestItem = listViewItem ;
bestPri = pri ;
}
}
if ( bestItem ! = null )
{
mProjectList . GetRoot ( ) . SelectItemExclusively ( bestItem ) ;
mProjectList . EnsureItemVisible ( bestItem , true ) ;
}
}
public void DoImport ( )
{
let root = mProjectList . GetRoot ( ) ;
for ( int idx < root . GetChildCount ( ) )
{
let listViewItem = root . GetChildAtIndex ( idx ) ;
if ( ! listViewItem . Selected )
continue ;
let entry = mFilteredList [ idx ] ;
2021-02-25 08:10:21 -08:00
VerSpec verSpec = . SemVer ( new . ( "*" ) ) ;
defer verSpec . Dispose ( ) ;
2019-08-23 11:56:54 -07:00
2022-07-16 09:36:21 -04:00
let project = gApp . mProjectPanel . ImportProject ( entry . mPath , null , verSpec ) ;
2019-08-23 11:56:54 -07:00
if ( project = = null )
{
return ;
}
2020-06-05 09:23:47 -07:00
if ( project . mProjectName ! = entry . mName )
{
gApp . OutputLineSmart ( "WARNING: Project directory name '{}' does not match project name '{}' specified in '{}'.\n Project will be referenced by relative path rather than by name." , entry . mName , project . mProjectName , project . mProjectPath ) ;
String relProjectPath = scope . ( ) ;
Path . GetRelativePath ( project . mProjectDir , gApp . mWorkspace . mDir , relProjectPath ) ;
for ( var projectSpec in gApp . mWorkspace . mProjectSpecs )
{
if ( projectSpec . mProjectName = = project . mProjectName )
{
2021-02-25 08:10:21 -08:00
projectSpec . mVerSpec = . Path ( new String ( relProjectPath ) ) ;
2020-06-05 09:23:47 -07:00
}
}
}
2019-08-23 11:56:54 -07:00
project . mLocked = true ;
project . mLockedDefault = true ;
}
Close ( ) ;
}
public override void AddedToParent ( )
{
base . AddedToParent ( ) ;
mEditWidget . SetFocus ( ) ;
FilterFiles ( ) ;
}
public override void ResizeComponents ( )
{
base . ResizeComponents ( ) ;
//var font = DarkTheme.sDarkTheme.mSmallFont;
float insetSize = GS ! ( 6 ) ;
mProjectList . Resize ( insetSize , insetSize , mWidth - insetSize - insetSize , mHeight - GS ! ( 66 ) ) ;
mEditWidget . Resize ( insetSize , mProjectList . mY + mProjectList . mHeight + insetSize , mWidth - insetSize - insetSize , GS ! ( 22 ) ) ;
2022-06-24 10:29:40 -07:00
mKindCombo . Resize ( insetSize , mHeight - GS ! ( 26 ) , Math . Min ( GS ! ( 160 ) , mDefaultButton . mX - GS ! ( 6 ) ) , GS ! ( 26 ) ) ;
2019-08-23 11:56:54 -07:00
}
public override void CalcSize ( )
{
mWidth = GS ! ( 660 ) ;
mHeight = GS ! ( 512 ) ;
}
public override void Resize ( float x , float y , float width , float height )
{
base . Resize ( x , y , width , height ) ;
ResizeComponents ( ) ;
}
public override void DrawAll ( Graphics g )
{
base . DrawAll ( g ) ;
IDEUtils . DrawOutline ( g , mProjectList ) ;
}
public override void Update ( )
{
base . Update ( ) ;
if ( mFilterChanged )
{
FilterFiles ( ) ;
mFilterChanged = false ;
}
}
}
}