1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433
| EXTERNE LIB_TEMPLATE
nNbEléments est un entier // Nombre d'éléments total
duDurée est une Durée // Durée d'affichage
nLargeurMax est un entier // Largeur maximale
dhDate est une DateHeure
nX est un réel
nY est un entier
rTxtX est un réel
nLargeurTex est un entier // Largeur du texte
nLargeurEvt est un entier // Largeur d'un événement
sTexte est une chaîne
polPolice est une Police // Police du texte
nLargeurElt est un entier // Largeur d'un élément
tabEvt est un tableau de TimelineEvénement dynamique // Evénements affichés
pclEvt est un TimelineEvénement dynamique
nDecalageV est un entier
stRect est un RECT
stRectComplet est un RECT
nIndice1er est un entier // Indice du premier élément affiché
nIndiceDer est un entier // Indice du dernier élément affiché
bAffichageComplet est un booléen // Flag indiquant si on peut afficher des evenements
nCouleur est un entier
nCouleurEclaircie est un entier
// Durée d'affichage
duDurée = m_dhDateHeureMax - m_dhDateHeureMin
// En fonction du zoom
SELON Zoom
// Décades
CAS zoomDécades
nNbEléments = (m_dhDateHeureMax..Année - m_dhDateHeureMin..Année) / 10
nLargeurElt = 96 * m_rZoomDist
// Années
CAS zoomAnnées
nNbEléments = m_dhDateHeureMax..Année - m_dhDateHeureMin..Année
nLargeurElt = 72 * m_rZoomDist
// Mois
CAS zoomMois
nNbEléments = m_dhDateHeureMax..Année * 12 + m_dhDateHeureMax..Mois - m_dhDateHeureMin..Année * 12 - m_dhDateHeureMin..Mois
nLargeurElt = 72 * m_rZoomDist
// Jours
CAS zoomJours
nNbEléments = duDurée..EnJours
nLargeurElt = 72 * m_rZoomDist
// Heures
CAS zoomHeures
nNbEléments = duDurée..EnHeures
nLargeurElt = 72 * m_rZoomDist
// 10x minutes
CAS zoomMinutes10
nNbEléments = duDurée..EnMinutes * 10
nLargeurElt = 72 * m_rZoomDist
// Minutes
CAS zoomMinutes
nNbEléments = duDurée..EnMinutes
nLargeurElt = 72 * m_rZoomDist
FIN
// Largeur maximale de la timeline
m_nLargeurMax = nLargeurElt * nNbEléments
// Largeur des intervalles
m_nLargeurIntervalles = nLargeurElt
// Couleur de fond
{m_sChamp, indChamp}..CouleurFond = m_nCouleurFond
// Couleurs du texte
nCouleur = m_nCouleur
nCouleurEclaircie = TSL(CouleurTeinte(nCouleur), CouleurSaturation(nCouleur), Max(100, CouleurLuminosité(nCouleur) + 25))
// Début du dessin
dDébutDessin(m_sChamp, dSansEffacer)
DC = dDébutDessin(m_sChamp, dEffacer)
dRectangle(0, 0, {m_sChamp, indChamp}..Largeur, {m_sChamp, indChamp}..Hauteur, m_nCouleurFond, m_nCouleurFond)
// Aucun événement survolé
m_pclEvénementSurvolé = Null
// Crée la police
polPolice = m_polPolice
polPolice..Couleur = m_nCouleur
LIB_TEMPLATE..Police = polPolice
// Décalage de départ
nX = Arrondi(m_bDéplacementAutorisé ? Décalage SINON 0)
// Première DateHeure affichée
m_dhDateHeureMinVisible = PositionVersDate(Abs(nX) / nLargeurElt)
m_dhDateHeureMinAjustée = PositionVersDate(0)
// Ajustement
DateAjuste(m_dhDateHeureMinVisible)
DateAjuste(m_dhDateHeureMinAjustée)
// Dernière DateHeure affichée
m_dhDateHeureMaxVisible = PositionVersDate((Abs(nX) + m_nLargeurTimeLine) / nLargeurElt)
// Ajustement
DateAjuste(m_dhDateHeureMaxVisible)
// Date et heure réelle (bornes)
m_dhDateHeureMinRéel = PositionVersDate(0, Vrai)
m_dhDateHeureMaxRéel = PositionVersDate(m_nLargeurTimeLine, Vrai)
// Répercute les modifications sur la timeline synchronisée
SI m_pclTimelineSynchronisée <> Null ALORS
// On doit modifier les dates pour qu'elles correspondent
m_pclTimelineSynchronisée.DateHeureMin = PositionVersDate(0)
m_pclTimelineSynchronisée.DateHeureMax = DateHeureMax
// Zoom inférieur
m_pclTimelineSynchronisée.Zoom = Min(7, Zoom + 1)
FIN
// Si la plage de date est inférieure à la page de date affichable
SI m_dhDateHeureMaxRéel > m_dhDateHeureMax ALORS
// On empêche le déplacement
m_bDéplacementAutorisé = Faux
SINON
// Autorise le déplacement
m_bDéplacementAutorisé = Vrai
FIN
// Récupère les événements passées entre ces deux dates
tabEvt = ListeEvénements(m_dhDateHeureMinVisible, m_dhDateHeureMaxVisible)
// Premier indice affichable
nIndice1er = DateVersPosition(m_dhDateHeureMinVisible)
nIndiceDer = DateVersPosition(m_dhDateHeureMaxVisible)
nIndiceDer = (nIndice1er + nIndiceDer + 1)
// Date moyenne
m_dhDateHeureMidVisible = PositionVersDate((nIndiceDer - nIndice1er) / 2)
// Sélectionne la police
dPolice(polPolice)
// Pour chaque "date" visible
POUR i = nIndice1er _A_ nIndiceDer
SI PAS (nX + nLargeurElt < 0 _OU_ nX + Décalage > m_nLargeurTimeLine) ALORS
// Récupère la date de l'élément courant
dhDate = PositionVersDate(i - nIndice1er)
// En fonction du zoom actuelle
SELON Zoom
// Décades
CAS zoomDécades
// On affiche la décade
sTexte = dhDate..Année
// Années
CAS zoomAnnées
// On affiche l'année
sTexte = dhDate..Année
// Mois
CAS zoomMois
// On affiche le mois et l'année
sTexte = DateVersChaîne(dhDate..PartieDate, "MMMM") + RC + DateVersChaîne(dhDate..PartieDate, "AAAA")
// Jours
CAS zoomJours
//************************AFFICHAGE JOUR
// On affiche la date
SI m_pclTimelineParente = Null ALORS
sTexte = DateVersJourEnLettre(dhDate..PartieDate) + RC + DateVersChaîne(dhDate..PartieDate, "JJ MMM AAAA")
SINON
sTexte = DateVersChaîne(dhDate..PartieDate, "JJ") + " " + DateVersJourEnLettre(dhDate..PartieDate)
FIN
// Heures
CAS zoomHeures
// On affiche la date et l'heure entière
SI m_pclTimelineParente = Null ALORS
sTexte = DateVersChaîne(dhDate..PartieDate, "JJ MMM AAAA") + RC + HeureVersChaîne(dhDate..PartieHeure, "HH:MM")
SINON
sTexte = HeureVersChaîne(dhDate..PartieHeure, "HH:MM")
FIN
// Dizaines de minutes
CAS zoomMinutes10
// On affiche la date et l'heure à la dizaine de minutes près
SI m_pclTimelineParente = Null ALORS
sTexte = DateVersChaîne(dhDate..PartieDate, "JJ MMM AAAA") + RC + HeureVersChaîne(dhDate..PartieHeure, "HH:MM")
SINON
sTexte = HeureVersChaîne(dhDate..PartieHeure, "HH:MM")
FIN
// Minutes
CAS zoomMinutes
// On affiche la date et l'heure
SI m_pclTimelineParente = Null ALORS
sTexte = DateVersChaîne(dhDate..PartieDate, "JJ MMM AAAA") + RC + HeureVersChaîne(dhDate..PartieHeure, "HH:MM")
SINON
sTexte = HeureVersChaîne(dhDate..PartieHeure, "HH:MM")
FIN
FIN
// Ligne verticale dégradée - DESSINE LES LIGNES VERTICALES DU PLANNING***************************
dRectangleDégradé(nX, 0, nX + 1, {m_sChamp, indChamp}..Hauteur, m_nCouleurFond, nCouleur, 90)
// Si le texte est sur deux lignes
SI ChaîneOccurrence(sTexte, RC) > 0 ALORS
// Affiche les deux lignes
dTexteAvancé(DC, (nX), ({m_sChamp, indChamp}..Hauteur - 28), (nX + nLargeurElt), ({m_sChamp, indChamp}..Hauteur - 14), ExtraitChaîne(sTexte, 1, RC), DT_CENTER + DT_VCENTER + DT_EDITCONTROL, nCouleur)
dTexteAvancé(DC, (nX), ({m_sChamp, indChamp}..Hauteur - 14), (nX + nLargeurElt), ({m_sChamp, indChamp}..Hauteur), ExtraitChaîne(sTexte, 2, RC), DT_CENTER + DT_VCENTER + DT_EDITCONTROL, nCouleurEclaircie)
nDecalageV = 32
SINON
// Affiche sur une ligne
dTexteAvancé(DC, (nX), ({m_sChamp, indChamp}..Hauteur - 14), (nX + nLargeurElt), ({m_sChamp, indChamp}..Hauteur), sTexte, DT_CENTER + DT_VCENTER + DT_EDITCONTROL, nCouleur)
nDecalageV = 18
FIN
FIN
// Prochaine position CALCUL L'INTERVALLE DES LIGNES VERTICALES
nX += nLargeurElt
// Ajuste la largeur totale
SI m_nLargeurMax < nX ALORS
m_nLargeurMax = nX
FIN
FIN
// Point de départ
nX = (m_bDéplacementAutorisé ? Décalage SINON 0)
// Si une date a été sélectionnée
SI m_dhDateHeureSelect <> "00000000000000000" ALORS
dhDate = m_dhDateHeureSelect
SINON
// Si aucune date n'a été sélectionnée, qu'on ne peut pas déplacer l'évenement et qu'on possède une timeline synchronisée
SI m_bDéplacementAutorisé = Faux _ET_ m_pclTimelineSynchronisée <> Null ALORS
// On récupère la première date visible de l'évenement synchronisée
dhDate = m_pclTimelineSynchronisée.PositionVersDate(-m_pclTimelineSynchronisée.Décalage, Vrai)
SINON
// Aujourd'hui
dhDate = DateDuJour + Maintenant
FIN
FIN
nX += DateVersPosition(dhDate, Vrai)
//****DESSINE LA LIGNE DU JOUR
SI PAS (nX + nLargeurElt < 0 _OU_ nX + Décalage > m_nLargeurTimeLine) ALORS
dRectangleDégradé(nX, 0, nX + 1, {m_sChamp, indChamp}..Hauteur - nDecalageV, m_nCouleurFond, m_nCouleurSélection, 90)
FIN
// Détermine si on peut afficher les cases complètes
bAffichageComplet = ({m_sChamp, indChamp}..Hauteur > HAUTEUR_FULLELT * 3)
// Point de départ
nX = (m_bDéplacementAutorisé ? Décalage SINON 0)
Trie(tabEvt, ttMembre, "+m_dhDateDébut")
// Pour chaque événement à afficher
POUR TOUT pclEvt DE tabEvt
// Largeur de l'événement en pixels
nLargeurEvt = (Max(3.0, DuréeVersPixels(pclEvt.DateDébut, pclEvt.DateFin)))
nLargeurElt = 256
// Rectangle de l'événement
stRect.x1 = nX + (DateVersPosition(pclEvt.DateDébut, Vrai))
SI bAffichageComplet ALORS
stRect.y1 = {m_sChamp, indChamp}..Hauteur - nDecalageV - HAUTEUR_FULLELT - HAUTEUR_ELT * 2
stRect.y2 = stRect.y1 + HAUTEUR_FULLELT / (pclEvt.Titre = "" ? 1.9 SINON 1)
// Calcule le rectangle de l'évenement
stRectComplet.x1 = stRect.x1 + HAUTEUR_ELT * 2 + 4
stRectComplet.x2 = stRect.x1 + nLargeurElt + HAUTEUR_ELT * 2 - 4
stRectComplet.y1 = stRect.y1 + HAUTEUR_ELT * 2 + 2
stRectComplet.y2 = stRect.y2 + HAUTEUR_ELT * 2 - 2
// Police
dPolice(polPolice)
// Largeur du texte
dTexteAvancé(DC, stRectComplet.x1, stRectComplet.y1, stRectComplet.x2, stRectComplet.y2, (pclEvt.Titre + Répète(" ", Taille(pclEvt.Titre) / 3) + [RC] + pclEvt.Description), DT_TOP + DT_LEFT + DT_CALCRECT + DT_EDITCONTROL)
nLargeurTex = Min(256, stRectComplet.x2 - stRectComplet.x1)
nLargeurElt = nLargeurTex + 12
// Recherche si un autre événement se trouve à la position
TANTQUE DétectionSuperposition(stRect, tabEvt, pclEvt)
stRect.y1 -= HAUTEUR_FULLELT + HAUTEUR_FULLELT / 2
stRect.y2 -= HAUTEUR_FULLELT + HAUTEUR_FULLELT / 2
FIN
stRect.x2 = stRect.x1 + nLargeurEvt
SINON
stRect.x2 = stRect.x1 + nLargeurEvt
stRect.y1 = {m_sChamp, indChamp}..Hauteur - nDecalageV - HAUTEUR_ELT
stRect.y2 = {m_sChamp, indChamp}..Hauteur - nDecalageV
// Recherche si un autre événement se trouve à la position
TANTQUE DétectionSuperposition(stRect, tabEvt, pclEvt)
stRect.y1 -= HAUTEUR_ELT + HAUTEUR_ELT / 2
stRect.y2 -= HAUTEUR_ELT + HAUTEUR_ELT / 2
FIN
FIN
// Transmet le rectangle
m_taRectangles[pclEvt.UID] = stRect
// Si le cadre de l'événement dépasse la largeur du cadre du planning, on abandonne son dessin
SI stRect.y2 < 0 ALORS CONTINUER
// En mode affichage complet ?
SI bAffichageComplet ALORS
// Petit rectangle
dRectangle(stRect.x1, stRect.y1, stRect.x2, stRect.y1 + HAUTEUR_ELT, pclEvt.Couleur, pclEvt.Couleur)
// Calcule le rectangle du dessin ** -- Optionnel vu que le dessin prend
// une place inutile sur la page.....mais bon..pour le savoir faire..
stRectComplet.x1 = stRect.x1 + HAUTEUR_ELT * 2
stRectComplet.x2 = stRect.x1 + nLargeurElt + HAUTEUR_ELT * 2
stRectComplet.y1 = stRect.y1 + HAUTEUR_ELT * 2
stRectComplet.y2 = stRect.y2 + HAUTEUR_ELT * 2
// Si un titre ou une description a été fournie
SI pclEvt.Description <> "" _OU_ pclEvt.Titre <> "" ALORS
// Conserve le rectangle du cartouche
m_taRectanglesComplet[pclEvt.UID] = stRectComplet
// DESSIN DU RECTANGLE DE L'EVENEMENT**********
//******** dRectangle(stRectComplet.x1 , stRectComplet.y1, stRectComplet.x2, stRectComplet.y2, m_nCouleurFond, GrisFoncé)
// Affiche le titre si il existe
SI pclEvt.Titre <> "" ALORS
// Police grasse
polPolice..Gras = Vrai
polPolice..Italique = Faux
dPolice(polPolice)
// Affiche le titre
dTexteAvancé(DC, stRectComplet.x1 + 4, stRectComplet.y1 + 2, stRectComplet.x2 - 4, stRectComplet.y1 + 14, (pclEvt.Titre), DT_TOP + DT_LEFT + DT_SINGLELINE + DT_MODIFYSTRING + DT_END_ELLIPSIS + DT_EDITCONTROL)
FIN
SI pclEvt.Description <> "" ALORS
// Police de la description
polPolice..Gras = Faux
polPolice..Italique = Vrai
dPolice(polPolice)
// Affiche la description
dTexteAvancé(DC, stRectComplet.x1 + 4, stRectComplet.y1 + 2 + (pclEvt.Titre <> "" ? 14 SINON 0), stRectComplet.x2 - 4, stRectComplet.y2 - 2, (pclEvt.Description), DT_TOP + DT_LEFT + DT_MODIFYSTRING + DT_END_ELLIPSIS + DT_EDITCONTROL)
FIN
FIN
SINON
// Petit rectangle
dRectangle(stRect.x1, stRect.y1, stRect.x2, stRect.y2, pclEvt.Couleur, pclEvt.Couleur)
FIN
FIN
// Conserve la liste des événements visibles
m_tabEvénementsVisibles = tabEvt
// Si on a une timeline synchronisée
SI m_pclTimelineSynchronisée <> Null ALORS
// Affecte les mêmes événements à la timeline synchronisée
m_pclTimelineSynchronisée.Evénements = Evénements
// Date et heure sélectionnée
m_pclTimelineSynchronisée.DateHeureSelect = m_dhDateHeureSelect
// Couleurs
m_pclTimelineSynchronisée.Couleur = Couleur
m_pclTimelineSynchronisée.CouleurFond = CouleurFond
// Police
m_pclTimelineSynchronisée.Police = m_polPolice
// Zoom de distance
m_pclTimelineSynchronisée.ZoomDistance = m_rZoomDist
// Callback
m_pclTimelineSynchronisée.p_sCallback = p_sCallback
// Etat
m_pclTimelineSynchronisée.Etat = (m_bDéplacementAutorisé ? Actif SINON Inactif)
// Affiche la timeline synchronisée
m_pclTimelineSynchronisée.Affiche()
FIN |
Partager