-
Notifications
You must be signed in to change notification settings - Fork 29.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add setting to keep tab characters in HTML clipboard #134588
Comments
@erkkifromdeepforest We have just shipped a change with 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? |
hello!
I am now sitting on my Mac (Big Sur last version) and did what you asked:
- I updated VS Code to the version 1.61.0 (date 2021-10-07)
- I opened a document, copy-pasted a portion of it to Word
The same problem exists, the tab characters are replaced in Word by space characters.
When I paste the same clipboard to BBEdit, the tabs are there.
Enclosed you get three documents:
- "Code and Word.png": screenshot where you can see both VS Code and Word with the copied text
- "Kohdehaku.xaml.cs": the text file which we are looking (originally made by Visual Studio in Windows 10)
- "Kohdemuok.swift": another text file I also tested, with same result. This file is made by Xcode in Mac
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;
}
}
}
```
|
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 #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. |
Here the files which I have earlier tried to send in email,
l |
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"> </span>ContentView.swift</p>
<p class="p1">//<span class="Apple-converted-space"> </span>Shared</p>
<p class="p1">//</p>
<p class="p1">//<span class="Apple-converted-space"> </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> |
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 (7f6ab54, 2021-09-22T12:00:31.514Z)
OS version: Windows_NT x64 10.0.19043
Restricted Mode: No
System Info
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
A/B Experiments
The text was updated successfully, but these errors were encountered: