microsoft / vscode

Visual Studio Code
https://code.visualstudio.com
MIT License
162.37k stars 28.61k forks source link

Add setting to keep tab characters in HTML clipboard #134588

Open erkkifromdeepforest opened 2 years ago

erkkifromdeepforest commented 2 years ago

We have written the needed data into your clipboard because it was too large to send. Please paste.

Issue Type: Bug

I select a portion of my text in VS Code, send a copy to clipboard (ctrl-c), move mouse cursor to a Word document, and try to paste the text with ctrl-V. The text appears on Word, but the tab characters are converted to spaces. Then I try another route: VS Code -> TextPad -> Word, and here the tabs are copied correctly. - So one of the Microsoft Apps fails in this copy - paste operation: Word or Code. Please make a correction!

VS Code version: Code 1.60.2 (7f6ab5485bbc008386c4386d08766667e155244e, 2021-09-22T12:00:31.514Z) OS version: Windows_NT x64 10.0.19043 Restricted Mode: No

System Info |Item|Value| |---|---| |CPUs|Intel(R) Core(TM) i7-3635QM CPU @ 2.40GHz (8 x 2395)| |GPU Status|2d_canvas: enabled
gpu_compositing: enabled
multiple_raster_threads: enabled_on
oop_rasterization: enabled
opengl: enabled_on
rasterization: enabled
skia_renderer: enabled_on
video_decode: enabled
vulkan: disabled_off
webgl: enabled
webgl2: enabled| |Load (avg)|undefined| |Memory (System)|15.89GB (12.20GB free)| |Process Argv|--crash-reporter-id 45a27e0b-c086-47c7-bb82-a3bc76a31454| |Screen Reader|no| |VM|0%|
Extensions: none
A/B Experiments ``` vsliv368cf:30146710 vsreu685:30147344 python383:30185418 pythonvspyt602:30300191 vspor879:30202332 vspor708:30202333 vspor363:30204092 pythonvspyt639:30300192 pythontb:30283811 pythonptprofiler:30281270 vsdfh931cf:30280410 vshan820:30294714 vstes263:30335439 pythondataviewer:30285071 pythonvsuse255:30340121 vscod805cf:30301675 pythonvspyt200:30340761 binariesv615:30325510 vsccppwt:30378364 pythonvssor306:30344512 bridge0708:30335490 pygetstartedt2:30371810 dockerwalkthru:30377721 bridge0723:30353136 pythonrunftest32:30373476 pythonf5test824:30373475 javagetstartedt:30364666 pythonvspyt187:30373474 pydsgst2:30361792 vsqsis400:30374798 vsaa593:30376534 ```
alexdima commented 2 years ago

@erkkifromdeepforest We have just shipped a change with 1.61.0 in this area (https://github.com/microsoft/vscode/issues/131922). Could you please update to 1.61.0 and check if this still reproduces for you?

Could you please also include here the text that you are using (I would like to look at it to see if it uses tabs or spaces for indentation) and include screenshots of how the pasted text looks in Word?

erkkifromdeepforest commented 2 years ago

hello!

I am now sitting on my Mac (Big Sur last version) and did what you asked:

Enclosed you get three documents:

I originally found the problem in my Windows laptop, but the same problem occurs also in Mac.

best regards, Erkki Ahola


//  4.10.2021     Kohdehaku.xaml.cs (HerbaarioWin)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data.SQLite;
using static HerbaarioWin.Vakiot;

// Avataan näyttö, jossa on hakuehdot kohteen ja havainnon löytämiseksi. 
// Näytön alaosassa on luettelo hakutuloksista

// Modaalinen ikkuna. Painikkeesta Sulje asetetaan DialogResult = false. 
// Luokan muodostimesta virhetarkistuksissa ikkuna suljetaan, jolloin logiikka johtaa
// antamaan arvon DialogResult = false.

/*
K11 Alasvetovalikot()
K14 ButtonHae_Click(object sender, RoutedEventArgs e)
K05 ButtonNayta_Click(object sender, RoutedEventArgs e)
K19 ButtonRyhma_Click(object sender, RoutedEventArgs e)
K13 ButtonSulje_Click(object sender, RoutedEventArgs e)
K07 ButtonTyhjenna_Click(object sender, RoutedEventArgs e)
K06 ButtonUusi_Click(object sender, RoutedEventArgs e)
K22 HaekaikkiID()  -> List<int>
K01 Kohdehaku(SQLiteConnection conn)
K01a    Kohdehaku(SQLiteConnection conn, int mod, Kohde kox)
K01b    Kohdehaku(SQLiteConnection conn, string selez, string ehtoz)
K17 Lopetus()
K15 TeeHakuKohteet(string kyselyz, bool esiin)   -> bool
K20 TeeSelectOsat()
K02 TeeWhere(int modpai)
K18 TyhjaaKentat()
K08 Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
*/

namespace HerbaarioWin
{
    public partial class Kohdehaku : Window
    {
        public int Kantamuutos
        { get; set; } = EIOO;   // OUTPUT onko tietokantaan tehty muutoksia  EIOO, MUUTOS

        public int Mode           // output siitä saatiinko ikkuna esiin
        { get; set; } = EIOO;
        // KORJAA: normaali arvo aloituksen jälkeen
        // OOKOO: ihan lopussa olemme poistumassa oikeaa reittiä eikä haluta mennä -> Lopetus()
        // jos arvoksi jää EIOO, oli luokan muodostimessa ongelma

        private readonly List<Havakohrivi> tulostaulu;  // datagrid-taulukon sisältö
        private readonly SQLiteConnection conlite;
        private readonly Dictionary<string, string> isanat = null;   // initiedot
        private readonly string kuvapolkuz = "";     // kuvakansionpolku ini-tiedoista

        private StringBuilder swalku = null;   // WHERE-osa
        private StringBuilder sbalku = null;  // SELECT-osa
        private List<int> koht;                // hakutuloksen kohteiden id:t

        //-----------------------------------------------------------------------
        // 3.10.2021 K01
        public Kohdehaku(SQLiteConnection conn, Dictionary<string, string> isa)
        {
            InitializeComponent();

            isanat = isa;
            conlite = conn;
            if (conlite == null || isanat == null || isanat.Count < 2)
            {
                _ = MessageBox.Show("Virhe input-parametrissä", "(K01-01) Ohjelmointivirhe");
                Close();
                return;
            }

            _ = isanat.TryGetValue("kuvapolku#", out kuvapolkuz);
            Mode = KORJAA;    // voidaan muokata
            Alasvetovalikot();
            tulostaulu = new List<Havakohrivi>();
            TeeSelectOsat();

            // laitetaan otsakkeeseen onko tuotanto- vai testikanta
            Title += " " + Meka.MikaKanta(conlite, isanat);

            _ = textSunimi.Focus();
        }

        //-----------------------------------------------------------------------
        // 3.10.2021     K01a
        // mod = HARVI muuttujassa kox.IHava on harvinaisuusarvo, ja 
        //             muuttujassa kox.Kuva on "Näyte", "Valokuva" tai "Digikuva", tai ei mitään eli "kaikki"
        // mod = AIKA  muuttujassa kox.Kuva on aikaan liittyvä hakuehto, ja Nega paikkakuntaehto (ei pakoll)
        //                  paikkakuntaehto tulee luokasta Paik_lista
        // mod = LAATU muuttujassa kox.Laatuz on hakuehtona toimiva laatunimi
        // ja pitää tapahtua vastaava haku
        // Tätä kutsuu Rapo_ikku kahdessa paikassa, ja Paik_lista yhdessä paikassa
        public Kohdehaku(SQLiteConnection conn, Dictionary<string, string> isa, int mod, Kohde kox)
        {
            bool virhe = false;
            isanat = isa;
            conlite = conn;

            if ((mod != HARVI && mod != AIKA && mod != LAATU) || (kox.Kuva == "" && mod == AIKA))
            {
                virhe = true;
            }

            if (!virhe && mod == HARVI && kox.KohHuom.IsEmpty())
            {
                virhe = true;
            }

            if (!virhe && mod == LAATU && kox.Laatuz == "")
            {
                virhe = true;
            }

            if (conlite == null || isanat == null || isanat.Count < 2)
            {
                virhe = true;
            }

            if (virhe)
            {
                _ = MessageBox.Show("Väärä input", "(K01a-02) Ohjelmointivirhe");
                Close();
                return;
            }

            InitializeComponent();

            _ = isanat.TryGetValue("kuvapolku#", out kuvapolkuz);
            _ = textSunimi.Focus();

            Alasvetovalikot();
            TeeSelectOsat();

            if (mod == HARVI)
            {
                comboYleis.SelectedValue = Meka.EtsiComboitem(comboYleis, kox.KohHuom);
                comboLaji.SelectedValue = Meka.EtsiComboitem(comboLaji, kox.Kuva);
            }
            else if (mod == LAATU)
            {
                comboLaatu.SelectedValue = Meka.EtsiComboitem(comboLaatu, kox.Laatuz);
            }
            else if (mod == AIKA)
            {
                string z = kox.Kuva;
                if (z.StartsWith("*.") && z.EndsWith(".*"))
                {
                    if (z[3] == '.')
                    {
                        textAika1.Text = "1." + z[2..3];
                        textAika2.Text = "31." + z[2..3];
                    }
                    else
                    {
                        textAika1.Text = "1." + z[2..4];
                        textAika2.Text = "31." + z[2..4];
                    }
                }
                else
                {
                    textAika1.Text = z;
                }

                textPaikka.Text = kox.Nega;   // tullaan Paik_lista:sta
            }
            else
            {
                _ = MessageBox.Show($"Väärä input mod={mod}", "K01a-03");
                Close();
                return;
            }
            Mode = KORJAA;
            // jos paikkanimessä on jotain, haku tarkkaan (tullaan Paik_lista:sta)
            int mopa = kox.Nega.IsEmpty() ? VILLI : TARKKA;
            tulostaulu = new List<Havakohrivi>();
            if (TeeWhere(mopa))      // kootaan haun sql-lause kenttiin edellä laitetuista arvoista
            {
                _ = TeeHakuKohteet(KAIKKI); // näytä hakutulos
            }
        }

        //-----------------------------------------------------------------------
        // 3.10.2021   K01b
        // Tätä kutsutaan myös Rapo_ikku:ssa
        // selez = WHERE-osan loppuun tulevaa, ei saa olla sellaista että tarvitaan alkuun sulkeita
        // ehz = ehto-osuus
        // Tässä kootaan hakuehto käyttäen Kohdeikku:n omaa SELECT-osaa
        public Kohdehaku(SQLiteConnection conn, Dictionary<string, string> isa, string selez, string ehz)
        {
            InitializeComponent();

            isanat = isa;
            conlite = conn;
            if (conlite == null || isanat == null || isanat.Count < 2)
            {
                _ = MessageBox.Show("Virhe input-parametrissä", "(K01-01) Ohjelmointivirhe");
                Close();
                return;
            }

            // tiedot paikoilleen alasvetovalikkoihin; ei tarvita Dictionarya

            _ = isanat.TryGetValue("kuvapolku#", out kuvapolkuz);
            Alasvetovalikot();
            TeeSelectOsat();
            _ = textSunimi.Focus();
            textSunimi.Text = "ERIKOISHAKU";

            swalku = new StringBuilder("");   // WHERE-osa
            _ = sbalku.Append(selez);
            _ = swalku.Append(ehz);

            Mode = KORJAA;
            tulostaulu = new List<Havakohrivi>();

            _ = TeeHakuKohteet(KAIKKI);     // toteutetaan haku
        }

        //-----------------------------------------------------------------------
        // 12.5.2021  K11
        private void Alasvetovalikot()
        {
            // tiedot paikoilleen alasvetovalikkoihin
            List<Combocoll> dct = Meka.HaeCombodata("Lajit", conlite, true);
            comboLaji.ItemsSource = dct;
            dct = Meka.HaeCombodata("Laadut", conlite, true);
            comboLaatu.ItemsSource = dct;
            dct = Meka.HaeCombodata("Alueet", conlite, true);
            comboAlue.ItemsSource = dct;
            dct = Meka.HaeCombodata("Yleisyydet", conlite, true);
            comboYleis.ItemsSource = dct;
        }

        //-----------------------------------------------------------------------
        // 3.10.2021   K20
        // tehdään kahden erityypisen haun tarvitsemat paruslausekkeet
        // nämä tyypit ovat Erikoishaku (K01b) ja muu tavallinen haku
        private void TeeSelectOsat()
        {
            // Muualla (K01b ja K02) rakennetaan SQL-lausekkeen muut osat
            // Huom! Tämä toimi Windowsissa oikein, jos havainnolla ei ole yhtään kohdetta,
            // samoin Java-versio Windowsissa, mutta MacSwiftUI ei saanut tulokseen yhtään riviä.
            // Macissä piti lisätä Havainnot LEFT JOIN Kohteet.... ja kaikkiin LEFT JOIN
            sbalku = new StringBuilder();
            _ = sbalku.Append("SELECT DISTINCT idKoh, LajiNimi, Nega, Sunimi, ");
            _ = sbalku.Append("(Suku || ' ' || LatLaji) AS Tieteell_nimi, Pvm, Kuva, ");
            _ = sbalku.Append("LaatuNimi, Paikkanimi, HavHuom, iKasvi, idHava, KohHuom ");
            _ = sbalku.Append("FROM ((((((((Havainnot LEFT JOIN Kohteet ON iHava = idHava) ");  // UUTTA
            _ = sbalku.Append("LEFT JOIN Laadut ON Laatu = idLaatu) ");
            _ = sbalku.Append("LEFT JOIN Lajit ON Laji = idLaji) ");
            _ = sbalku.Append("LEFT JOIN Kasvit ON iKasvi = idKas) ");
            _ = sbalku.Append("LEFT JOIN Vanhanimi ON iKas = idKas) ");  // UUTTA
            _ = sbalku.Append("LEFT JOIN Paikat ON iPaikka = idPaikka) ");
            _ = sbalku.Append("LEFT JOIN Alueet ON iAlue=idAlue) ");
            _ = sbalku.Append("LEFT JOIN Yleist ON iYleis=idYleis) ");
        }

        //-----------------------------------------------------------------------
        // 30.5.2019    K15
        // näytetään alaosassa hakutulos
        // SQL-lauseke luokkamuuttujina sbalku ja swalku
        // esiin=true: näytetään datagrid, vaikka ei olisi hakutuloksia
        // output = false, jos virhe tai jos ei tuloksia
        // mita = KAIKKI: kaikki tiedot haetaan kannasta ja näyttö päivitetään
        //      = idKoh: yksi tai useampi rivi korjataan ajan tasalle
        private bool TeeHakuKohteet(int mita)
        {
            bool virhe = false;
            int kpluu = 0;  // montako uutta
            SQLiteCommand kome = null;
            SQLiteDataReader rdr = null;
            StringBuilder sqb = new();   // SQL-lauseen kokoaminen
            List<int> havat = new();  // tähän kerätään havainnot, tarvitaan vain lukumäärä

            if (mita == KAIKKI)
            {
                // ensin tyhjennetään mahdollinen vanha data
                dgHakutulos.ItemsSource = null;
                dgHakutulos.Items.Refresh();
                tulostaulu.Clear();
                koht = new List<int>();   // tähän kerätään idKoh

                _ = sqb.Append($"{sbalku}WHERE ({swalku}) ");
            }
            else
            {
                _ = sqb.Append($"{sbalku}WHERE ((idHava = {mita}) AND {swalku}) ");
            }
            _ = sqb.Append("ORDER BY Sunimi, Tieteell_nimi, Pvm");
            string sqz = sqb.ToString();

            try
            {
                kome = new SQLiteCommand(sqz, conlite);
                rdr = kome.ExecuteReader();
                while (rdr.Read())
                {
                    // SELECT idKoh, LajiNimi, Nega, Sunimi, Tieteell_nimi, Pvm, Kuva,
                    // LaatuNimi, Paikkanimi, HavHuom, iKasvi, idHava, KohHuom ");
                    string havhuz = rdr.IsDBNull(9) ? "" : rdr.GetString(9).KorvaaTabLF();
                    string kohuz = rdr.IsDBNull(12) ? "" : rdr.GetString(12).KorvaaTabLF();
                    Havakohrivi hav = new()
                    {
                        IDkoh = rdr.IsDBNull(0) ? EIOO : rdr.GetInt32(0),
                        Lajiz = rdr.IsDBNull(1) ? "" : rdr.GetString(1).KorvaaTabLF(),
                        Negaz = rdr.IsDBNull(2) ? "" : rdr.GetString(2).KorvaaTabLF(),
                        Sunimiz = rdr.IsDBNull(3) ? "" : rdr.GetString(3).KorvaaTabLF(),
                        Tietnimiz = rdr.IsDBNull(4) ? "" : rdr.GetString(4).KorvaaTabLF(),
                        Pvmz = rdr.IsDBNull(5) ? "" : rdr.GetString(5).KorvaaTabLF(),
                        Polkuz = rdr.IsDBNull(6) ? "" : rdr.GetString(6).KorvaaTabLF().KorjaaKenot(2),
                        Laatuz = rdr.IsDBNull(7) ? "" : rdr.GetString(7).KorvaaTabLF(),
                        Paikz = rdr.IsDBNull(8) ? "" : rdr.GetString(8).KorvaaTabLF(),
                        Lisaz = havhuz + " " + kohuz,
                        IDkas = rdr.IsDBNull(10) ? EIOO : rdr.GetInt32(10),
                        IDhava = rdr.IsDBNull(11) ? EIOO : rdr.GetInt32(11)
                    };

                    if (mita == KAIKKI)
                    {
                        tulostaulu.Add(hav);
                        koht.Add(hav.IDkoh);
                        if (!havat.Contains(hav.IDhava))
                        {
                            havat.Add(hav.IDhava);
                        }
                    }
                    else   // kirjoitetaan päivitetyt tiedot vanhan päälle
                    {
                        // tässä käsitellään muutettu rivi
                        // etsitään tulostaulusta rivi jossa oikea IDkoh
                        foreach (Havakohrivi item in dgHakutulos.Items)   // etsitään rivi
                        {
                            if (item.IDhava == mita && item.IDkoh == hav.IDkoh)
                            {
                                item.Lajiz = hav.Lajiz;
                                item.Negaz = hav.Negaz;
                                item.Sunimiz = hav.Sunimiz;
                                item.Tietnimiz = hav.Tietnimiz;
                                item.Pvmz = hav.Pvmz;
                                item.Polkuz = hav.Polkuz;
                                item.Laatuz = hav.Laatuz;
                                item.Paikz = hav.Paikz;
                                item.Lisaz = hav.Lisaz;
                                item.IDkas = hav.IDkas;
                                break;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Meka.Virhe2("K15-03", $"{sqz}\nDataa ei saatu ladattua.", ex);
                virhe = true;
            }
            finally
            {
                if (rdr != null) { rdr.Close(); }
                if (kome != null) { kome.Dispose(); }
            }
            if (virhe == true)
            {
                labelDgridotsa.Content = "Tuloksia ei saatu";
                return false;
            }
            if (mita == KAIKKI)
            {
                if (tulostaulu.Count > 0)
                {
                    dgHakutulos.ItemsSource = tulostaulu;
                    dgHakutulos.SelectedItem = dgHakutulos.Items[0];
                }
                else
                {
                    dgHakutulos.ItemsSource = null;
                    labelDgridotsa.Content = "0 havaintoa";
                    _ = MessageBox.Show("Ei ole yhtään ehdot täyttävää havaintoa", "(K15-05) Ilmoitus");
                    return false;
                }
                string az = (havat.Count == 1) ? "1 havainto, jossa" : $"{havat.Count} havaintoa, joissa";
                string bz = (tulostaulu.Count == 1) ? "1 kohde" : $"{tulostaulu.Count} kohdetta";
                labelDgridotsa.Content = $"{az} {bz}";
            }
            else    // yliviivataan poistetut tiedot
            {
                // verrataan koht ja koht2 (idKohde)
                // koht on viimeksi KAIKKI jolloin luettelo tehty kannan mukaiseksi
                // koht2 on ne mitkä löytyi nyt kun käyttäjä palasi muokkaamisesta
                // jos koht-id ei löydy koht2:sta, merkitään se poistetuksi
                List<int> koht2 = HaekaikkiID();
                foreach (int idi in koht)
                {
                    if (!koht2.Contains(idi))
                    {
                        foreach (Havakohrivi item in dgHakutulos.Items)   // etsitään rivi
                        {
                            if (item.IDkoh == idi)
                            {
                                item.Lajiz = "---";
                                item.Negaz = "---";
                                item.Sunimiz = "KOHDE";
                                item.Tietnimiz = "POISTETTU";
                                item.Pvmz = "---";
                                item.Polkuz = "---";
                                item.Laatuz = "---";
                                item.Paikz = "---";
                                item.Lisaz = "---";
                                item.IDkas = EIOO;
                                item.IDkoh = EIOO;
                                break;
                            }
                        }
                    }
                }
                kpluu = 0;  // montako uutta kohdetta
                foreach (int idi in koht2)
                {
                    if (!koht.Contains(idi))
                    {
                        kpluu++;
                    }
                }
            }
            dgHakutulos.Items.Refresh();   // tarpeen tässä, koska on voitu päivittää yksittäistä riviä
            if (mita == KAIKKI && tulostaulu.Count > 5)  // tämän oltava lopussa, jolloin data valmiina
            {
                dgHakutulos.ScrollIntoView(dgHakutulos.Items[0]); // skrollataan eka rivi esille
            }

            _ = dgHakutulos.Focus();
            if (kpluu > 0)
            {
                _ = MessageBox.Show("Kohteita lisätty, luettelo ei päivity itsestään.", "(K15-07) Ilmoitus");
            }
            return true;
        }

        //-----------------------------------------------------------------------
        // 31.1.2021  K22
        // Tehdään luettelo ehdon täyttävistä kohteista
        private List<int> HaekaikkiID()
        {
            bool virhe = false;
            SQLiteCommand kome = null;
            SQLiteDataReader rdr = null;
            List<int> koh = new();  // tähän kerätään kohde-iideet

            StringBuilder sqb = new();
            _ = sqb.Append($"{sbalku}WHERE ({swalku}) ");
            string sqz = sqb.ToString();

            try
            {
                kome = new SQLiteCommand(sqz, conlite);
                rdr = kome.ExecuteReader();
                while (rdr.Read())
                {
                    // SELECT idKoh ...
                    int idkoh = rdr.IsDBNull(0) ? EIOO : rdr.GetInt32(0);
                    koh.Add(idkoh);

                }
            }
            catch (Exception ex)
            {
                Meka.Virhe2("K22-03", $"{sqz}\nTiedon haku epäonnistui.", ex);
                virhe = true;
            }
            finally
            {
                if (rdr != null) { rdr.Close(); }
                if (kome != null) { kome.Dispose(); }
            }
            if (virhe)
            {
                return null;
            }

            return koh;
        }

        //-----------------------------------------------------------------------
        // 3.10.2021  K14
        // HAE_painikkeen painaminen, tehdään hakutulos
        private void BtnHae_Click(object sender, RoutedEventArgs e)
        {
            if (!int.TryParse(textIDhav.Text.OmaTrim(), out int idha))
            {
                idha = EIOO;
            }
            if (!int.TryParse(textIDkoh.Text.OmaTrim(), out int idkoh))
            {
                idkoh = EIOO;
            }

            // Jos on annettu molemmat id-arvot, ei kelpaa
            if (idha != EIOO && idkoh != EIOO)
            {
                _ = MessageBox.Show("Vain jompikumpi: idHava tai idKoh", "(K14-04) Ilmoitus");
                return;
            }

            // Jos on annettu tietoa kenttään idHav tai idKoh, 
            // kaikki muut kentät tyhjennetään, 
            // ja esille haetaan suoraan havainto idHav (tai idKoh:n havainto),
            // eikä taulukkoon laiteta mitään

            if (idha != EIOO || idkoh != EIOO)
            {
                TyhjaaKentat();

                int kumpi = (idha != EIOO) ? HAVAINTO : KOHDE;
                int idi = (idha != EIOO) ? idha : idkoh;
                if (idha != EIOO)
                {
                    textIDhav.Text = idha.ToString();
                }
                else
                {
                    textIDkoh.Text = idkoh.ToString();
                }

                int itu;
                Kaikikku ikku = new(conlite, isanat, idi, kumpi) { Owner = Application.Current.MainWindow };
                if (ikku.Mode == EIOO)
                {
                    return;   // ikku-luokan muodostimessa oli this.Close()
                }

                bool? result = ikku.ShowDialog();   // modaalinen
                if (result.HasValue)
                {
                    itu = ikku.Kantamuutos;
                }
                else
                {
                    _ = MessageBox.Show("Virhetilanne, ikkunasta ei tulosta", "(K14-06) Ilmoitus");
                    return;
                }
                if (itu == MUUTOS)
                {
                    Kantamuutos = MUUTOS;
                }
            }
            else
            {
                if (TeeWhere(VILLI))
                {
                    _ = TeeHakuKohteet(KAIKKI);
                }
            }
        }

        //-----------------------------------------------------------------------
        // 13.6.2020  K07
        // käyttäjä painoi Tyhjennä -painiketta
        private void BtnTyhjenna_Click(object sender, RoutedEventArgs e)
        {
            TyhjaaKentat();
            labelDgridotsa.Content = "Hakutulos 0 kpl";
        }

        //-----------------------------------------------------------------------
        // 12.5.2021   K18
        // tyhjennetään kentät ja hakutulos, paitsi kenttää idHava
        private void TyhjaaKentat()
        {
            checkBoxEpaselva.IsChecked = false;
            textNega.Clear();
            textAika2.Clear();
            textAika1.Clear();
            textTiet.Clear();
            textPaikka.Clear();
            textSunimi.Clear();
            textIDhav.Clear();
            textIDkoh.Clear();
            _ = textSunimi.Focus();
            textHeimo.Clear();
            comboAlue.SelectedIndex = -1;
            comboYleis.SelectedIndex = -1;
            comboLaji.SelectedIndex = -1;
            comboLaatu.SelectedIndex = -1;
            textFaili.Clear();

            // tyhjennetään hakutuloksen nykyiset rivit
            dgHakutulos.ItemsSource = null;
            dgHakutulos.Items.Refresh();
            tulostaulu.Clear();
        }

        //-----------------------------------------------------------------------
        // 3.10.2021  K05
        // Tässä näytetään rivillä valittuna oleva kohde ja havainto
        private void BtnNayta_Click(object sender, RoutedEventArgs e)
        {
            if (tulostaulu.Count == 0)
            {
                return;
            }

            Havakohrivi dsele = (Havakohrivi)dgHakutulos.SelectedItem;
            int idKoh = (dsele != null) ? dsele.IDkoh : EIOO;
            int idHava = (dsele != null) ? dsele.IDhava : EIOO;

            if (idKoh == EIOO)
            {
                _ = MessageBox.Show("Valitse ensin jokin rivi!", "(K05-01) Opastus");
                return;
            }

            int itu;
            Kaikikku ikku = new(conlite, isanat, idKoh, KOHDE) { Owner = Application.Current.MainWindow };
            if (ikku.Mode == EIOO)
            {
                return;   // ikku-luokan muodostimessa oli this.Close()
            }

            bool? result = ikku.ShowDialog();   // modaalinen
            if (result.HasValue)
            {
                itu = ikku.Kantamuutos;
            }
            else
            {
                _ = MessageBox.Show("Virhetilanne, ikkunasta ei tulosta", "(K05-06) Ilmoitus");
                return;
            }

            if (itu == MUUTOS)
            {
                Kantamuutos = MUUTOS;
                _ = TeeHakuKohteet(idHava);
            }
        }

        //-----------------------------------------------------------------------
        // 3.10.2021   K06      
        // käyttäjä haluaa tehdä uuden havainnon
        private void BtnUusi_Click(object sender, RoutedEventArgs e)
        {
            int itu = EIOO;
            int idi = EIOO;
            Kaikikku ikku = new(conlite, isanat, EIOO, HAVAINTO) { Owner = Application.Current.MainWindow };
            if (ikku.Mode == EIOO)
            {
                return;   // ikku-luokan muodostimessa oli this.Close()
            }

            bool? result = ikku.ShowDialog();   // modaalinen
            if (result.HasValue)
            {
                if (ikku.Kantamuutos == MUUTOS)
                {
                    Kantamuutos = MUUTOS;
                    itu = MUUTOS;
                }
                if (result.Value)       // ikkunasta poistuttiin normaalisti (DialogResult = true)
                {
                    idi = ikku.Ihavauus;    // tehdyn uuden havainnon idHava
                }
            }
            else
            {
                _ = MessageBox.Show("Virhetilanne, ikkunasta ei tulosta", "(K06-01) Ilmoitus");
                return;
            }

            if (idi == EIOO)
            {
                return;
            }

            if (itu == MUUTOS)
            {
                TyhjaaKentat();
                _ = MessageBox.Show("Uusi havainto tehty, idHava=" + idi, "(K06-03) Ilmoitus");
            }
        }

        //-----------------------------------------------
        // 20.4.2017  K13
        private void BtnSulje_Click(object sender, RoutedEventArgs e)
        {
            Lopetus();
        }

        //-----------------------------------------------
        // 3.10.2021   K08
        // Tänne tullaan, jos tuli komento this.Close()
        // tänne tullaan myös jos käyttäjä klikkaa punaista ruksia
        // mode = EIOO (luokan muodostajassa oli this.Close()), 
        //       OOKOO (DialogResult = true/false)
        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (Mode != EIOO && Mode != OOKOO)
            {
                Lopetus();
            }
        }

        //-----------------------------------------------
        // 3.10.2021  K17
        // tänne tuo suoraan ButtonPeruuta() ja 
        // Window_Closingin kautta oikean ylänurkan ruksaus
        private void Lopetus()
        {
            // tänne lopetusjuttuja
            Mode = OOKOO;   // ohitetaan Lopetus() jonne Window_Closing vie             
            DialogResult = false;
        }

        //-----------------------------------------------------------------------
        // 3.10.2021    K19
        // Käyttäjä haluaa nähdä pikkukuvat
        private void BtnRyhma_Click(object sender, RoutedEventArgs e)
        {
            if (tulostaulu.Count == 0)
            {
                _ = MessageBox.Show("Ei yhtään kasvia!", "(K19-01) Opastus");
                return;
            }

            List<Kuvainfo> kuvasto = new();

            foreach (Havakohrivi hkoh in tulostaulu)
            {
                if (hkoh.Polkuz.IsEmpty())
                {
                    continue;
                }

                string uuz = Meka.AnnaOikeapolku($"{kuvapolkuz}\\{hkoh.Polkuz}", isanat);
                if (uuz.IsEmpty())
                {
                    continue;
                }

                Kuvainfo kux = new()
                {
                    IDkoh = hkoh.IDkoh,
                    IDkas = hkoh.IDkas,
                    Sunimiz = hkoh.Sunimiz,
                    Polkuz = uuz,
                    Pvmz = hkoh.Pvmz,
                    Lajiz = hkoh.Lajiz,
                    Laatuz = hkoh.Laatuz,
                    Paikkaz = hkoh.Paikz
                };
                kuvasto.Add(kux);
            }

            if (kuvasto.Count == 0)
            {
                _ = MessageBox.Show("Ei yhtään kasvia joista olisi kuva!", "(K19-06) Ilmoitus");
                return;
            }
            Kuvamatriisi ikku = new(conlite, isanat, kuvasto)
            {
                Owner = Application.Current.MainWindow
            };
            if (ikku.Mode == EIOO)
            {
                return;           // Tokaikku-luokan muodostimessa oli this.Close()
            }

            bool? result = ikku.ShowDialog();   // modaalinen
            if (result.HasValue)
            {
                if (ikku.Kantamuutos == MUUTOS)
                {
                    Kantamuutos = MUUTOS;
                }
            }
            else
            {
                _ = MessageBox.Show("Virhetilanne, ikkunasta ei tulosta", "(K19-09) Ilmoitus");
                return;
            }
        }

        //-----------------------------------------------------------------------
        // 3.10.2021  K02
        // Hakuehtoja vastaavan SQL-lausekkeen kokoaminen -> ehtoz
        // modpai = TARKKA tai VILLI, paikkaehdon tarkkuus (jos yksi kirjain ehto on k*)
        // output=true: kaikki ok, hakuehdoissa ei virheitä
        //        false: jotain mätää, käyttäjä saa ilmoituksen
        private bool TeeWhere(int modpai)
        {
            string z;
            int iWhere = 0;                        // montako WHERE-ehtoa
            bool ehtojaon = false;   // onko annettu ehtoja lainkaan

            string sunimi = textSunimi.Text.OmaTrim();   // kerätään hakuehtotekstit
            string latnimi = textTiet.Text.OmaTrim();
            string heimoz = textHeimo.Text.OmaTrim();
            string aika1 = textAika1.Text.OmaTrim();
            string aika2 = textAika2.Text.OmaTrim();
            string nega = textNega.Text.OmaTrim();
            string tiedosto = textFaili.Text.OmaTrim();
            if (tiedosto.IndexOf("'") != -1)
            {
                _ = MessageBox.Show("Tiedostonimessä ei saa olla hipsua", "(K02-01) Ilmoitus");
                return false;
            }

            string paikkaz = textPaikka.Text.OmaTrim();

            if (sunimi != "" || latnimi != "" || heimoz != "" || aika1 != "" || aika2 != ""
                || nega != "" || paikkaz != "" || tiedosto != "")
            {
                ehtojaon = true;
            }

            object hsele = comboAlue.SelectedItem;
            string aluez = (hsele != null) ? ((Combocoll)hsele).Nimiz : "";
            hsele = comboLaji.SelectedItem;
            string lajiz = (hsele != null) ? ((Combocoll)hsele).Nimiz : "";
            hsele = comboLaatu.SelectedItem;
            string laatuz = (hsele != null) ? ((Combocoll)hsele).Nimiz : "";
            object ysele = comboYleis.SelectedItem;
            int idyleis = (ysele != null) ? ((Combocoll)ysele).Nro : EIOO;  // yleisyyden numero

            if (!ehtojaon)
            {
                if (heimoz != "" || aluez != "" || lajiz != "" || laatuz != "" || idyleis != EIOO)
                {
                    ehtojaon = true;
                }
            }

            if (!ehtojaon)
            {
                if (checkBoxEpaselva.IsChecked == true)
                {
                    ehtojaon = true;
                }
            }

            if (!ehtojaon)
            {
                _ = MessageBox.Show("Hakuehtoja ei ole annettu!", "(K02-02) Ilmoitus");
                return false;
            }

            swalku = new StringBuilder("");   // WHERE-osa 
                                                         // SELECT-osa on tehty luokkamuuttujaan sbalku

            // Havainnon id: tätä ei tarvitse tutkia koska jo buttonHae (K14) tutkii tämän

            if (checkBoxEpaselva.IsChecked == true)
            {
                z = (iWhere == 0) ? "(Epaselva = 1)" : " AND (Epaselva = 1)";
                _ = swalku.Append(z);
                iWhere++;
            }
            if (aluez != "")
            {
                z = (iWhere > 0) ? " AND" : "";
                z += $"(Aluenimi = '{aluez}')";
                _ = swalku.Append(z);
                iWhere++;
            }
            if (paikkaz != "")
            {
                z = (iWhere > 0) ? " AND" : "";
                // skandien variointi LIKE-ehdossa:
                string ehz = Meka.TeeSQLvario(paikkaz.Hipsut(), "Paikkanimi", 0);   // ei %
                string eh1z = Meka.TeeSQLvario(paikkaz.Hipsut(), "Paikkanimi", 1);   // ..%
                string eh3z = Meka.TeeSQLvario(paikkaz.Hipsut(), "Paikkanimi", 3);   // %..%
                if (ehz.IsEmpty() || eh1z.IsEmpty() || eh3z.IsEmpty())
                {
                    return false;
                }

                if (paikkaz.Length == 1)    // yksi merkki, haku paikkanimen alusta
                {
                    z += $"({eh1z})";
                }
                else if (modpai == TARKKA)
                {
                    z += $"({ehz})";
                }
                else
                {
                    z += $"({eh3z})";
                }

                _ = swalku.Append(z);
                iWhere++;
            }
            if (tiedosto != "")
            {
                z = (iWhere > 0) ? " AND" : "";
                // skandien variointi LIKE-ehdossa:
                string ehz = Meka.TeeSQLvario(tiedosto, "REPLACE(Kuva, '/', '\\')", 3);   // %..%
                if (ehz.IsEmpty())
                {
                    return false;
                }

                z += $"({ehz})";
                _ = swalku.Append(z);
                iWhere++;
            }
            // TODO: muokattava rakenne siten, että tässä ei oteta laatuz eikä lajiz vaan vastaavat ilaatu ja ilaji
            // katso miten se on tehty Macissä; myös heimoz / iheimo (ei enää iheimo)
            if (laatuz != "")
            {
                z = (iWhere > 0) ? " AND" : "";
                // skandien variointi LIKE-ehdossa:
                string ehz = Meka.TeeSQLvario(laatuz.Hipsut(), "LaatuNimi", 0);   // ei %
                if (ehz.IsEmpty())
                {
                    return false;
                }

                z += $"({ehz})";
                _ = swalku.Append(z);
                iWhere++;
            }
            if (lajiz != "")
            {
                z = (iWhere > 0) ? " AND" : "";
                // skandien variointi LIKE-ehdossa:
                string ehz = Meka.TeeSQLvario(lajiz.Hipsut(), "LajiNimi", 0);   // ei %
                if (ehz.IsEmpty())
                {
                    return false;
                }

                z += $"({ehz})";
                _ = swalku.Append(z);
                iWhere++;
            }
            if (heimoz != "")
            {
                z = (iWhere > 0) ? " AND" : "";
                // skandien variointi LIKE-ehdossa:  TODO: ei heimonimessä ole skandeja
                string ehz = Meka.TeeSQLvario(heimoz.Hipsut(), "Heimo", 3);   // %..%
                if (ehz.IsEmpty())
                {
                    return false;
                }

                z += $"(({ehz})";
                _ = swalku.Append(z);
                iWhere++;

                _ = swalku.Append($" OR ( Vnimi LIKE '%{heimoz.Hipsut()}%' AND Mika='Heimo')) ");
            }

            string ekaz, tokaz;
            string tz = "";
            bool pvmhoidettu = false;

            if (aika1.IndexOf("'") != EIOO || aika2.IndexOf("'") != EIOO)
            {
                _ = MessageBox.Show("Päivämäärissä ei saa olla hipsua", "(K02-05) Ilmoitus");
                return false;
            }
            // aika1 = "*.5.1999", "*.*.1999", "*.5.*"  ja aika2 on tyhjä
            if (aika1 != "" && aika2 == "")
            {
                if (aika1.StartsWith("*.*.") && aika1.Length == 8)
                {
                    string vuosiz = aika1[4..];
                    tz = $"(strftime('%Y', Pvm)='{vuosiz}') ";
                    pvmhoidettu = true;
                }
                // *.5.* tai *.11.*
                else if (aika1.StartsWith("*.") && aika1.EndsWith(".*") && (aika1.Length == 5 || aika1.Length == 6))
                {
                    string kuz = aika1[2..^2];   // "5" tai "11"  Substring(2, aika1.Length - 4)
                    if (kuz.Length == 1)
                    {
                        kuz = "0" + kuz;
                    }

                    tz = $"(strftime('%m', Pvm)='{kuz}') ";
                    pvmhoidettu = true;
                }
                // *.5.1999 tai *.10.1999
                else if (aika1.StartsWith("*.") && (aika1.Length == 8 || aika1.Length == 9))
                {
                    ekaz = ("1." + aika1[2..]).PvmKorjaa(VIIVAT);    // "1999-05-01"
                    string vkz = ekaz[..7];
                    tz = $"(strftime('%Y-%m', Pvm)='{vkz}') ";
                    pvmhoidettu = true;
                }
                if (pvmhoidettu)
                {
                    z = (iWhere > 0) ? $" AND {tz}" : tz;
                    iWhere++;
                    _ = swalku.Append(z);
                }
            }
            // Käsitellään onko pvm-kentissä esimerkiksi 10.4 ja 20.4 ilman vuosilukua
            // 10.4.*  käy myös, oltava molemmat
            if (aika1 != "" && aika2 != "" && pvmhoidettu == false)
            {
                ekaz = aika1.PvmKorjaa(VIIVAT);
                tokaz = aika2.PvmKorjaa(VIIVAT);
                if (ekaz == "" && tokaz == "")      // ainakaan eivät ole oikeassa muodossa?
                {
                    if (aika1.EndsWith(".*"))
                    {
                        aika1 = aika1[0..^2];    // aika1.Substring(0, aika1.Length - 2);
                    }

                    if (aika2.EndsWith(".*"))
                    {
                        aika2 = aika2[0..^2];
                    }

                    z = aika1 + ".2000";
                    ekaz = z.PvmKorjaa(VIIVAT);  // ovatko ne oikein vuosiluvun kanssa?
                    z = aika2 + ".2000";
                    tokaz = z.PvmKorjaa(VIIVAT);
                    if (ekaz != "" && tokaz != "")            // jos olivat oikein, niin jatketaan
                    {
                        ekaz = ekaz[5..];     // otetaan loppuosa esim. '04-10'
                        tokaz = tokaz[5..];
                        string sz = (iWhere > 0) ? " AND " : "";
                        sz += $"(strftime('%m-%d', Pvm)>='{ekaz}' AND strftime('%m-%d', Pvm)<='{tokaz}') ";
                        pvmhoidettu = true;
                        iWhere++;
                        _ = swalku.Append(sz);
                    }
                }
            }

            // Käsitellään onko alkupvm-kentässä esimerkiksi 10.4 tai 10.4.* ilman vuosilukua
            if (aika1 != "" && aika2 == "" && pvmhoidettu == false)
            {
                ekaz = aika1.PvmKorjaa(VIIVAT);
                if (ekaz == "")      // ainakaan ei ole oikeassa muodossa?
                {
                    if (aika1.EndsWith(".*"))
                    {
                        aika1 = aika1[0..^2];   // aika1.Substring(0, aika1.Length - 2);
                    }

                    z = aika1 + ".2000";
                    ekaz = z.PvmKorjaa(VIIVAT);  // ovatko ne oikein vuosiluvun kanssa?
                    if (ekaz != "")            // jos olivat oikein, niin jatketaan
                    {
                        ekaz = ekaz[5..];     // otetaan loppuosa esim. '04-10'
                        z = (iWhere > 0) ? " AND " : "";
                        z += $"(strftime('%m-%d', Pvm)='{ekaz}') ";
                        pvmhoidettu = true;
                        iWhere++;
                        _ = swalku.Append(z);
                    }
                }
            }

            if (!pvmhoidettu)
            {
                if (aika1 == "" && aika2 != "")
                {
                    aika1 = aika2;
                    aika2 = "";
                }
                if (aika1 != "" || aika2 != "")
                {
                    if (aika1 != "")
                    {
                        ekaz = aika1.PvmKorjaa(VIIVAT);
                        if (ekaz == "")
                        {
                            _ = MessageBox.Show("Löytöajan alkukohta on väärin", "(K02-06) Anna kunnollinen päivämäärä");
                            return false;
                        }
                        else
                        {
                            if (aika2 != "")
                            {
                                tokaz = aika2.PvmKorjaa(VIIVAT);
                                if (tokaz == "")
                                {
                                    _ = MessageBox.Show("Löytöajan loppukohta on väärin", "(K02-07) Anna kunnollinen päivämäärä");
                                    return false;
                                }
                                else if (string.Compare(ekaz, tokaz) > 0)
                                {
                                    _ = MessageBox.Show("Löytöajan loppukohta < alkukohta", "(K02-08) Virhe annetuissa tiedoissa");
                                    return false;
                                }
                                else
                                {
                                    z = (iWhere > 0) ? " AND" : "";
                                    z += $"(Pvm <= '{tokaz}') AND (Pvm >= '{ekaz}') ";
                                    iWhere++;
                                }
                            }
                            else
                            {
                                z = (iWhere > 0) ? " AND" : "";
                                z += $"(Pvm = '{ekaz}') ";
                                iWhere++;
                            }
                            _ = swalku.Append(z);
                        }
                    }
                }
            }

            if (nega != "")
            {
                z = (iWhere > 0) ? " AND" : "";
                // skandien variointi LIKE-ehdossa:
                string ehz = Meka.TeeSQLvario(nega.Hipsut(), "Nega", 1);   // ..%
                if (ehz.IsEmpty())
                {
                    return false;
                }

                z += $"({ehz})";
                iWhere++;
                _ = swalku.Append(z);
            }
            if (sunimi != "")
            {
                z = (iWhere > 0) ? " AND" : "";
                string ehz = Meka.TeeSQLvario(sunimi.Hipsut(), "Sunimi", 3);   // %..%
                string eh2z = Meka.TeeSQLvario(sunimi.Hipsut(), "Kaksois", 3);   // %..%
                if (ehz.IsEmpty() || eh2z.IsEmpty())
                {
                    return false;
                }

                _ = swalku.Append(z + $"(({ehz} OR {eh2z})");
                iWhere++;

                string eh3z = Meka.TeeSQLvario(sunimi.Hipsut(), "Vnimi", 3);   // %..%  // UUTTA
                if (eh3z.IsEmpty())
                {
                    return false;
                }

                _ = swalku.Append($" OR ({eh3z} AND Mika='SuomNimi')) ");
            }
            if (latnimi != "")
            {
                z = (iWhere > 0) ? " AND" : "";
                z += $"((Suku || ' ' || LatLaji LIKE '%{latnimi.Hipsut()}%' )";  // ei skandiongelmaa LIKE-lauseessa
                _ = swalku.Append(z);
                iWhere++;

                _ = swalku.Append($" OR ( Vnimi LIKE '%{latnimi.Hipsut()}%' AND Mika='TietNimi')) ");    // UUTTA
            }
            if (idyleis != EIOO)     // Yleisyys   
            {
                z = (iWhere > 0) ? " AND " : "";
                z += $"(iYleis = {idyleis})";
                iWhere++;
                _ = swalku.Append(z);
            }

            return true;
        }

    }
}
alexdima commented 2 years ago

Thank you @erkkifromdeepforest for the extra information. The screenshots did not come through because they don't work over email. They would work if you would upload them manually at https://github.com/microsoft/vscode/issues/134588

Here is what is going on:

I think you would want a way to configure vscode to write tabs as they are to the HTML clipboard.

erkkifromdeepforest commented 2 years ago

hello!

Here two more examples concerning similar situations. When I copy text using cmd+c and cmd+v the following happens:

So in this editor family (Xcode, Visual Studio, Code) Code behaves differently. Of course it should behave in same way.

Best regards, Erkki Ahola

Lähettäjä: Alexandru Dima @.> Lähetetty: maanantai 11. lokakuuta 2021 9.38 Vastaanottaja: microsoft/vscode @.> Kopio: erkkifromdeepforest @.>; Mention @.> Aihe: Re: [microsoft/vscode] Copy-paste from Code to Word (#134588)

Thank you @erkkifromdeepforesthttps://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Ferkkifromdeepforest&data=04%7C01%7C%7C2bf6b1b161994fda382a08d98c81b8b1%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C637695311043523421%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=wtZN5ZqHu0i7P8sTR2PPPMmRWibagoOv3zjxEpVSuds%3D&reserved=0 for the extra information. The screenshots did not come through because they don't work over email. They would work if you would upload them manually at #134588https://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fmicrosoft%2Fvscode%2Fissues%2F134588&data=04%7C01%7C%7C2bf6b1b161994fda382a08d98c81b8b1%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C637695311043533417%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=VVz7i0QoaizEUHYean%2ByzBJ8NXli1PeILeHiFInwywQ%3D&reserved=0

Here is what is going on:

I think you would want a way to configure vscode to write tabs as they are to the HTML clipboard.

- You are receiving this because you were mentioned. Reply to this email directly, view it on GitHubhttps://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fmicrosoft%2Fvscode%2Fissues%2F134588%23issuecomment-939727436&data=04%7C01%7C%7C2bf6b1b161994fda382a08d98c81b8b1%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C637695311043533417%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=4p2faAQ3GJV45WzeraT2bCQR5O%2B64Ota6jIzXuQKuYc%3D&reserved=0, or unsubscribehttps://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fnotifications%2Funsubscribe-auth%2FASIRNHHELAM7TV27U2LTGL3UGKA53ANCNFSM5FRW2BAQ&data=04%7C01%7C%7C2bf6b1b161994fda382a08d98c81b8b1%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C637695311043543413%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=4iWmPGAXISXVAqcHIc9XPaLgz2lWxklQSxwLmXgs1xE%3D&reserved=0. Triage notifications on the go with GitHub Mobile for iOShttps://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fapps.apple.com%2Fapp%2Fapple-store%2Fid1477376905%3Fct%3Dnotification-email%26mt%3D8%26pt%3D524675&data=04%7C01%7C%7C2bf6b1b161994fda382a08d98c81b8b1%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C637695311043543413%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=xhdTiS72zXThknIXWybeqIufO%2FuHyAIY%2Fg%2FRJFfwUQg%3D&reserved=0 or Androidhttps://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fplay.google.com%2Fstore%2Fapps%2Fdetails%3Fid%3Dcom.github.android%26referrer%3Dutm_campaign%253Dnotification-email%2526utm_medium%253Demail%2526utm_source%253Dgithub&data=04%7C01%7C%7C2bf6b1b161994fda382a08d98c81b8b1%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C637695311043553416%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=fOW4S%2BsM2WEmoWJE2nK6W4rI1T6Kpo075rK3bOW%2FbyQ%3D&reserved=0.

erkkifromdeepforest commented 2 years ago

Here the files which I have earlier tried to send in email,

l

alexdima commented 2 years ago

As a reference, here is what xcode creates for the code:

//
//  ContentView.swift
//  Shared
//
//  Created by Alex on 10/14/21.
//

import SwiftUI

struct ContentView: View {
    var body: some View {
        Text("Hello, world!")
            .padding()
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Style-Type" content="text/css">
<title></title>
<meta name="Generator" content="Cocoa HTML Writer">
<meta name="CocoaVersion" content="2022.6">
<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #5d6c79; background-color: #ffffff}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #000000; color: rgba(0, 0, 0, 0.85); background-color: #ffffff; min-height: 14.0px}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #000000; color: rgba(0, 0, 0, 0.85); background-color: #ffffff}
p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #0b4f79; background-color: #ffffff}
p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #c41a16; background-color: #ffffff}
p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #9b2393; background-color: #ffffff}
span.s1 {color: #9b2393}
span.s2 {color: rgba(0, 0, 0, 0.85)}
span.s3 {color: #0f68a0}
span.s4 {color: #0b4f79}
span.Apple-tab-span {white-space:pre}
</style>
</head>
<body>
<p class="p1">//</p>
<p class="p1">//<span class="Apple-converted-space">&nbsp; </span>ContentView.swift</p>
<p class="p1">//<span class="Apple-converted-space">&nbsp; </span>Shared</p>
<p class="p1">//</p>
<p class="p1">//<span class="Apple-converted-space">&nbsp; </span>Created by Alex on 10/14/21.</p>
<p class="p1">//</p>
<p class="p2"><br></p>
<p class="p3"><span class="s1"><b>import</b></span> SwiftUI</p>
<p class="p2"><br></p>
<p class="p4"><span class="s1"><b>struct</b></span><span class="s2"> </span>ContentView<span class="s2">: View {</span></p>
<p class="p3"><span class="Apple-tab-span"> </span><span class="s1"><b>var</b></span> <span class="s3">body</span>: <span class="s1"><b>some</b></span> View {</p>
<p class="p5"><span class="s2"><span class="Apple-tab-span">    </span><span class="Apple-tab-span">    </span>Text(</span>"Hello, world!"<span class="s2">)</span></p>
<p class="p3"><span class="Apple-tab-span"> </span><span class="Apple-tab-span">    </span><span class="Apple-tab-span">    </span>.padding()</p>
<p class="p3"><span class="Apple-tab-span"> </span>}</p>
<p class="p3">}</p>
<p class="p2"><br></p>
<p class="p3"><span class="s1"><b>struct</b></span> <span class="s4">ContentView_Previews</span>: PreviewProvider {</p>
<p class="p6"><span class="s2"><span class="Apple-tab-span">    </span></span><b>static</b><span class="s2"> </span><b>var</b><span class="s2"> </span><span class="s3">previews</span><span class="s2">: </span><b>some</b><span class="s2"> View {</span></p>
<p class="p3"><span class="Apple-tab-span"> </span><span class="Apple-tab-span">    </span>ContentView()</p>
<p class="p3"><span class="Apple-tab-span"> </span>}</p>
<p class="p3">}</p>
</body>
</html>