Files
vojta@alfred 4e5c55e846 Prvni commit.
2026-02-01 00:00:07 +01:00

391 lines
12 KiB
JavaScript

/*
* [Česky]
* Projekt: Robot Karel
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
*
* [English]
* Project: Karel, the Robot
* Copyright: See COPYING in the top level directory
*/
// JavaScript - objekt pro práci s myší
// Konstruktor
function Mys(tooltip)
{
// Atribut info je použit pro jednoznačné odlišení objektů
// Atribut detail je použit pro uchovávání informací k objektu, jako je např.
// obsah tooltipu, obrázky apod.
// Uživatel na tomto objektu provedl stisk
this.stisknut = { info: null, detail: null };
// Zvýrazněný objekt, uživatel přejel myší nad objekt
this.zvyraznen = { info: null, detail: null };
// Vybraný objekt, běžně bývá zobrazen se sníženými okraji
this.vybran = { info: null, detail: null };
// Kde byl naposledy proveden stisk. Některé prohlížeče neposílají správně
// stisky, tak se kontroluje puštění a předchozí stisk
this.posledni_stisk = { info: null, detail: null };
// Objekt třídy tooltipu. Pokud není nastaven, žádný tooltip se nezobrazí
if ( !tooltip ) tooltip = null;
this.tooltip = tooltip;
}
// ===========================================================================
// =~ Pomocné funkce ~========================================================
Mys.prototype.je_zvyraznen = function(zvyrazneni)
{
if ( zvyrazneni == undefined ) {
return ( this.zvyraznen.info != null );
} else {
return ( jsou_shodne(zvyrazneni, this.zvyraznen.info) );
}
}
Mys.prototype.je_vybran = function(vyber)
{
if ( vyber == undefined ) {
return ( this.vybran.info != null );
} else {
return ( jsou_shodne(vyber, this.vybran.info) );
}
}
Mys.prototype.je_stisknut = function(stisknuti)
{
if ( stisknuti == undefined ) {
return ( this.stisknut.info != null );
} else {
return ( jsou_shodne(stisknuti, this.stisknut.info) );
}
}
// ===========================================================================
// =~ Obsluha událostí myši ~=================================================
Mys.prototype.pres = function(e, info, detail)
{
if ( !e && typeof(event) != "undefined" ) e = event; // IE
ladici_vypis(LADENI, "mys.pres", info, "myš nad objektem");
if ( !jsou_shodne(info,this.posledni_stisk.info) ) {
this.posledni_stisk.info = this.posledni_stisk.detail = null;
}
if ( !jsou_shodne(info,this.zvyraznen.info ) ) {
if ( this.proved_zvyrazneni(info) ) {
var stary_zvyraznen = this.zvyraznen;
this.zvyraznen = { info:info, detail:detail };
if ( stary_zvyraznen.info != null )
this.stav( stary_zvyraznen.info, stary_zvyraznen.detail);
this.stav(info, detail);
}
}
var element;
if ( this.tooltip && (element = zdrojovy_element(e)) ) {
this.tooltip.pres(element, info, detail);
}
return true;
}
Mys.prototype.pryc = function(e, info, detail)
{
if ( !e && typeof(event) != "undefined" ) e = event; // IE
var zmena = false;
ladici_vypis(LADENI, "mys.pryc", info, "myš pryč z objektu");
if ( jsou_shodne(info,this.posledni_stisk.info) ) {
this.posledni_stisk.info = this.posledni_stisk.detail = null;
}
if ( jsou_shodne(info,this.zvyraznen.info) ) {
this.zvyraznen.info = this.zvyraznen.detail = null;
zmena = true;
}
if ( jsou_shodne(info,this.stisknut.info) ) {
this.stisknut.info = this.stisknut.detail = null;
zmena = true;
}
this.zrus_zvyrazneni(info, detail);
if ( zmena ) {
this.stav(info, detail);
}
var element;
if ( this.tooltip && (element = zdrojovy_element(e)) ) {
this.tooltip.pryc(element, info, detail);
}
}
Mys.prototype.stisk = function(e, info, detail)
{
if ( !e && typeof(event) != "undefined" ) e = event; // IE
ladici_vypis(LADENI, "mys.stisk", info, "myš stiskla tlačítko");
var stary_zvyraznen = { info: null };
var stary_stisknut = { info: null };
if ( !jsou_shodne(info,this.zvyraznen.info ) ) {
if ( this.proved_zvyrazneni(info, detail) ) {
stary_zvyraznen = this.zvyraznen;
this.zvyraznen = {info: info, detail: detail};
}
}
if ( !jsou_shodne(info,this.stisknut.info) ) {
this.stary_stisknut=this.stisknut;
}
this.posledni_stisk = { info: info, detail: detail };
this.stisknut = { info: info, detail: detail };
if ( stary_stisknut.info != null || stary_zvyraznen.info != null ) {
if ( jsou_shodne(stary_stisknut.info,stary_zvyraznen.info) ) {
this.stav(stary_stisknut.info, stary_stisknut.detail);
} else {
if ( stary_stisknut.info != null )
this.stav(stary_stisknut.info, stary_stisknut.detail);
if ( stary_zvyraznen.info != null )
this.stav(stary_zvyraznen.info, stary_zvyraznen.detail);
}
}
this.proved_stisk(info, detail);
this.stav(info, detail);
var element;
if ( this.tooltip && (element = zdrojovy_element(e)) ) {
this.tooltip.zrus(element, info, detail);
}
}
Mys.prototype.pust = function(e, info, detail)
{
if ( !e && typeof(event) != "undefined" ) e = event; // IE
var stary_stisknut = this.stisknut;
if ( jsou_shodne(info,this.posledni_stisk.info) ) {
if ( stary_stisknut.info == null ) {
ladici_vypis(LADENI, "mys.pust", info, "pozice nezměněna; chybí stisk myši, simuluji...");
this.proved_stisk(info, detail);
}
ladici_vypis(LADENI, "mys.pust", info, "myš pustila tlačítko, provedla stisk");
this.vyber(info, detail, false);
} else {
ladici_vypis(LADENI, "mys.pust", info, "myš pustila tlačítko, žádný stisk");
// Kvůli zrušení stisku
info = stary_stisknut.info;
detail = stary_stisknut.detail;
}
this.stisknut.info = this.stisknut.detail = null;
if ( info != null ) {
this.zrus_stisk(info, detail);
this.stav(info, detail);
}
var element;
if ( this.tooltip && (element = zdrojovy_element(e)) ) {
this.tooltip.zrus(element, info, detail);
}
}
Mys.prototype.stav = function(info, detail)
{
var je_zvyraznen = this.je_zvyraznen(info);
var je_vybran = this.je_vybran(info);
var je_stisknut = this.je_stisknut(info);
ladici_vypis(LADENI, "mys.stav", info, "překresluji"+
" (z:"+ formatuj_text(je_zvyraznen)+
" s:"+ formatuj_text(je_stisknut)+
" v:"+ formatuj_text(je_vybran)+ ")");
this.prekresli_stav(info, detail, je_zvyraznen, je_stisknut, je_vybran);
}
Mys.prototype.proved_prejmenovani = function(nazev, objekt, info_z, info_na,
detail_na)
{
if ( jsou_shodne( objekt.info, info_z ) ) {
ladici_vypis( LADENI, "mys.proved_prejmenovani", "měním " + nazev + " z (" +
formatuj_text(objekt.info) + ") na (" + formatuj_text(info_na) + ")" );
objekt.info = info_na;
objekt.detail = detail_na;
return true;
} else {
ladici_vypis( LADENI, "mys.proved_prejmenovani", "žádná změna v " + nazev +
", zůstává (" + formatuj_text(objekt.info) + ")" );
return false;
}
}
Mys.prototype.proved_smazani = function(nazev, objekt, info, detail)
{
if ( jsou_shodne( objekt.info, info ) ) {
ladici_vypis( LADENI, "mys.proved_smazani", info, "ruším " + nazev );
objekt.info = objekt.detail = null;
return true;
} else {
ladici_vypis( LADENI, "mys.proved_smazani", info, "žádná změna v " + nazev );
return false;
}
}
// ===========================================================================
// =~ Veřejně přístupné funkce ~==============================================
// Ruční provedení výběru
Mys.prototype.vyber = function(info, detail, prekresli)
{
var stary_vybran = this.vybran;
if ( !jsou_shodne(info,stary_vybran.info) ) {
if ( this.proved_vyber(info, detail) ) {
if ( stary_vybran.info != null ) {
if ( this.zmen_vyber(stary_vybran.info, stary_vybran.detail, info, detail) ) {
ladici_vypis(LADENI, "mys.vyber", info, "vybráno (předchozí:"+
formatuj_text(stary_vybran.info)+")");
this.vybran = { info: info, detail: detail };
this.stav(stary_vybran.info, stary_vybran.detail );
} else {
ladici_vypis(LADENI, "mys.vyber", info, "změna nepovolena (předchozí:"+
formatuj_text(stary_vybran.info)+")");
prekresli = false;
}
} else {
ladici_vypis(LADENI, "mys.vyber", info, "vybráno (předchozí nevybrán)");
this.vybran = { info: info, detail: detail };
}
if ( prekresli == undefined || prekresli ) {
this.stav(info, detail);
}
} else {
ladici_vypis(LADENI, "mys.vyber", info, "změna výběru nebyla provedena");
}
} else {
if ( this.zrus_vyber(info) ) {
ladici_vypis(LADENI, "mys.vyber", info, "zrušení výběru");
this.vybran.info = this.vybran.detail = null;
if ( prekresli == undefined || prekresli ) {
this.stav(info);
}
} else {
ladici_vypis(LADENI, "mys.vyber", info, "žádná změna výběru");
}
}
}
// Změna informací. Změní výběr a ostatní informace myši, pokud se změnily
// informace, nebo detaily
Mys.prototype.prejmenuj = function(info_z, info_na, detail_na)
{
ladici_vypis(LADENI, "mys.prejmenuj", info_z, "přejmenování na (" +
formatuj_text(info_na) + ")");
var prekresli = false;
if ( this.proved_prejmenovani( "mys.stisknut",
this.stisknut, info_z, info_na, detail_na ) ) {
ladici_vypis(LADENI, "mys.prejmenuj", info_na, "stisk po přejmenování");
this.proved_stisk( info_na, detail_na );
prekresli = true;
}
if ( this.proved_prejmenovani( "mys.zvyraznen",
this.zvyraznen, info_z, info_na, detail_na ) ) {
ladici_vypis(LADENI, "mys.prejmenuj", info_na, "zvýraznění po přejmenování");
this.proved_zvyrazneni( info_na, detail_na );
prekresli = true;
}
if ( this.proved_prejmenovani( "mys.vybran",
this.vybran, info_z, info_na, detail_na ) ) {
ladici_vypis(LADENI, "mys.prejmenuj", info_na, "výběr po přejmenování");
this.proved_vyber( info_na, detail_na );
prekresli = true;
}
this.proved_prejmenovani( "mys.posledni_stisk",
this.posledni_stisk, info_z, info_na, detail_na );
if ( prekresli ) {
this.stav( info_na, detail_na );
}
}
// Smazání informací. Zruší výběr a zvýraznění prvku
Mys.prototype.smaz = function(info, detail)
{
ladici_vypis(LADENI, "mys.smaz", info, "smazání prvku");
var prekresli = false;
if ( this.proved_smazani( "mys.stisknut", this.stisknut, info, detail ) ) {
ladici_vypis(LADENI, "mys.smaz", info, "zrušení stisku");
this.zrus_stisk( info, detail );
prekresli = true;
}
if ( this.proved_smazani( "mys.zvyraznen", this.zvyraznen, info, detail ) ) {
ladici_vypis(LADENI, "mys.smaz", info, "zrušení zvýraznění");
this.zrus_zvyrazneni( info, detail );
prekresli = true;
}
if ( this.proved_smazani( "mys.vybran", this.vybran, info, detail ) ) {
ladici_vypis(LADENI, "mys.smaz", info, "zrušení výběru");
this.smaz_vyber( info, detail );
prekresli = true;
}
this.proved_smazani( "mys.posledni_stisk",
this.posledni_stisk, info, detail );
if ( prekresli ) {
this.stav( info, detail );
}
}
// ===========================================================================
// =~ Veřejně editovatelné funkce ~===========================================
// Překeslení stavu prvku
Mys.prototype.prekresli_stav = function(info, detail, zvyraznen, stisknut,
vybran)
{
}
// Myš stiskla tlačítko
Mys.prototype.proved_stisk = function(info, detail)
{
}
// Myš pustila tlačítko
Mys.prototype.zrus_stisk = function(info, detail)
{
}
// Myš klikla na objekt. Vrací true, pokud se vybralo
Mys.prototype.proved_vyber = function(info, detail)
{
return false;
}
// Zrušen výběr objektu kliknutím na jiný objekt. Vrací true, pokud se má vybrat
Mys.prototype.zmen_vyber = function(info_z, detail_z, info_na, detail_na)
{
return true;
}
// Zrušen výběr objektu kliknutím na stejný objekt. Vrací true, pokud se má
// zrušit výběr
Mys.prototype.zrus_vyber = function(info, detail)
{
return false;
}
// Vybraný objekt byl smazán
Mys.prototype.smaz_vyber = function(info, detail)
{
}
// Myš je nad objektem. Vrací true, pokud se zvýraznilo
Mys.prototype.proved_zvyrazneni = function(info, detail)
{
return false;
}
// Myš není nad objektem
Mys.prototype.zrus_zvyrazneni = function(info, detail)
{
}