public void OpenFile(FileItem file)
        {
            //If it is already open, focus it
            if (file.OpenFile != null)
            {
                tabStrip.SelectedItem = file.OpenFile.TabPage;
                file.OpenFile.Editor.Focus();
                return;
            }

            bool editorReadOnly = Options.Editor.ReadOnlyOutput &&
                                  file.IsDecendantOf(ProjectProperties.CurrentProjectPropperties.OutputFolder);
            //Otherwise make a new tab
            file.OpenFile = new OpenFileData();
            file.OpenFile.File = file;
            file.OpenFile.Editor = new MyEditor(this, editorReadOnly);
            //If we have another editor, get font styles from that (to save memmory)
            if (openFiles.Count > 0)
                file.OpenFile.Editor.SetFontScheme(openFiles[0].Editor.GetFontScheme());
            else
            {
                file.OpenFile.Editor.AddFontStyle(GalaxyKeywords.InMethodKeywords.mod, GalaxyKeywords.InMethodKeywords.words);
                file.OpenFile.Editor.AddFontStyle(GalaxyKeywords.OutMethodKeywords.mod, GalaxyKeywords.OutMethodKeywords.words);
                file.OpenFile.Editor.AddFontStyle(GalaxyKeywords.SystemExpressions.mod, GalaxyKeywords.SystemExpressions.words);
                file.OpenFile.Editor.AddFontStyle(GalaxyKeywords.InitializerKeywords.mod, GalaxyKeywords.InitializerKeywords.words);
                //file.OpenFile.Editor.AddFontStyle(GalaxyKeywords.TriggerKeywords.mod, GalaxyKeywords.TriggerKeywords.words);
                file.OpenFile.Editor.AddFontStyle(GalaxyKeywords.Primitives.mod, GalaxyKeywords.Primitives.words);
            }
            file.OpenFile.Editor.Dock = DockStyle.Fill;

            file.OpenFile.Editor.Tag = file.OpenFile;

            file.OpenFile.TabPage = new FATabStripItem(file == null ? "Untitled" : file.Text, null);
            file.OpenFile.TabPage.Margin = new Padding(0);
            file.OpenFile.TabPage.Padding = new Padding(0);
            file.OpenFile.TabPage.Tag = file.OpenFile;

            StreamReader reader = file.File.OpenText();
            file.OpenFile.Editor.Text = reader.ReadToEnd();
            reader.Close();
            file.OpenFile.Editor.SetHiddenBlocks(file.ClosedBlocks);

            file.OpenFile.TabPage.Controls.Add(file.OpenFile.Editor);
            tabStrip.AddTab(file.OpenFile.TabPage);
            openFiles.Add(file.OpenFile);

            file.OpenFile.Editor.OnTextEdited += MyEditor_TextEdited;

            tabStrip.SelectedItem = file.OpenFile.TabPage;
            tabStrip_TabStripItemSelectionChanged(null);
            file.OpenFile.Editor.Focus();
        }
        private void MakeNewFile()
        {
            if (openProjectDir == null)
            {//Open an unsaved file

            }
            else
            {//Make file, and open it
                //Find it's position in the gui tree
                TreeNode folderNode = projectView.SelectedNode ?? ProjectProperties.CurrentProjectPropperties.SrcFolder.GUINode;

                DirItem markedChild = (DirItem) folderNode.Tag;
                FolderItem parentFolder = (FolderItem) (markedChild.Parent ?? markedChild);
                if (markedChild is FolderItem)
                    parentFolder = (FolderItem) markedChild;

                //Find a default unique name
                string name = "New file.galaxy++";
                int i = 1;
                while (parentFolder.Children.Any(child => child.Text == name))
                {
                    i++;
                    name = "New file" + i + ".galaxy++";
                }

                //Create the file
                FileInfo fileInfo = new FileInfo(parentFolder.Dir.FullName + "\\" + name);
                fileInfo.CreateText().Close();
                FileItem newFile = new FileItem(parentFolder, name);

                compiler.AddSourceFile(newFile);

                newFile.GUINode = new TreeNode(name);

                newFile.GUINode.Tag = newFile;
                newFile.GUINode.ImageIndex = newFile.GUINode.SelectedImageIndex = 2;

                //Insert into tree
                int insertAt = parentFolder.Children.IndexOf(markedChild) + 1;
                if (insertAt == 0 || insertAt == parentFolder.Children.Count)
                {
                    parentFolder.Children.Add(newFile);
                    parentFolder.GUINode.Nodes.Add(newFile.GUINode);
                }
                else
                {
                    parentFolder.Children.Insert(insertAt, newFile);
                    parentFolder.GUINode.Nodes.Insert(insertAt, newFile.GUINode);
                }
                ProjectProperties.CurrentProjectPropperties.Save();
                UploadedChangesToMap = false;
                UploadToMap();

                projectView.SelectedNode = newFile.GUINode;
                newFile.GUINode.EnsureVisible();
                BeginRename(newFile.GUINode);

                //Find nearest folder
                /*TreeNode folderNode = projectView.SelectedNode;
                DirectoryInfo dir;
                FindNearestFolderNode(ref folderNode, out dir);
                //Get desired filename
                String filename = GetUniqueStringDialog("New File", "Name", ".galaxy++", dir.GetFiles(),
                                                        "The file can not be created because another file of same name already exists in that folder.");
                if (filename == null) return;

                FileInfo file = new FileInfo(dir.FullName + "\\" + filename);
                file.CreateText().Close();
                TreeNode node = new TreeNode(file.Name);
                node.Tag = file;
                node.ImageIndex = node.SelectedImageIndex = 2;
                (folderNode ?? projectView.Nodes[0]).Nodes.Add(node);
                node.EnsureVisible();
                projectView.SelectedNode = node;
                compiler.AddSourceFile(file);
                OpenFile(file);*/
            }
        }
 public void FocusFile(FileItem file)
 {
     if (file.OpenFile == null)
         OpenFile(file);
     else
         tabStrip.SelectedItem = file.OpenFile.TabPage;
 }
 private TextPoint GetTextPointFromIndex(FileItem file, int index)
 {
     string text = GetText(file);
     TextPoint point = new TextPoint(0, 0);
     while (index > 0)
     {
         index--;
         if (text[index] == '\n')
             point.Line++;
         else if (point.Line == 0)
             point.Pos++;
     }
     return point;
 }
 private string GetText(FileItem file)
 {
     if (file.OpenFile != null)
     {
         if (!CBMatchCase.Checked)
             return file.OpenFile.Editor.Text.ToLower();
         return file.OpenFile.Editor.Text;
     }
     //Open the file
     StreamReader stream = new StreamReader(file.File.OpenRead());
     string text = stream.ReadToEnd();
     stream.Close();
     if (!CBMatchCase.Checked)
         text = text.ToLower();
     return text;
 }
        private FileItem GetPreviousFile(FileItem file)
        {
            if (RBCurrent.Checked)
                return file;

            List<FileItem> files = GetAllFiles();
            int i = files.IndexOf(currentPosition.File);
            i++;
            if (i < 0)
                i += files.Count;
            return files[i];
        }
        private FileItem GetNextFile(FileItem file)
        {
            if (RBCurrent.Checked)
                return file;

            List<FileItem> files = GetAllFiles();
            int i = files.IndexOf(currentPosition.File);
            i = (i + 1)%files.Count;
            return files[i];
        }
 private int GetIndexFromTextpoint(FileItem file, TextPoint point)
 {
     string text = GetText(file);
     int index = 0;
     while (point.Line > 0 || point.Pos > 0)
     {
         if (text[index] == '\n')
             point.Line--;
         else if (point.Line == 0)
             point.Pos--;
         index++;
     }
     return index;
 }