Il mio progetto attuale consiste nell'implementare una specie di clone di WinMerge per confrontare due file.
Sto usando C ++ con l'API Win32 (WTL, ATL, quella roba), e ho già progettato un'interfaccia utente per questo. Tuttavia, ora sono seduto qui, pensando a un progetto su come gestire l'intero confronto di file e il flusso di dati.
Problema successivo:
Ho un controllo personalizzato per ciascuno dei 2 controlli di modifica, che mostrano il rispettivo contenuto del file. Certo, potrei semplicemente aggiungere un metodo per far caricare i loro file e visualizzarli, ma ciò non aiuterà, dato che non sto scrivendo un editor, ma piuttosto uno strumento di confronto.
Potrei aggiungere un riferimento al file che voglio confrontare con il file originale nella classe del file originale, ma preferirei avere una classe dedicata responsabile della gestione e del confronto.
L'implementazione corrente che ho in mente ha il seguente aspetto:
Ogni controllo di modifica è un oggetto di "FileEdit". Questa classe è la classe GUI allo stesso tempo e riceve eventi come la pressione di un pulsante, i clic, ecc. Questo mi dà una base su cui basare se voglio aggiungere alcune caratteristiche di tasti in seguito.
Entrambi i FileEdit sono gestiti da un "FileManager". FileManager riceve sia FileEdits dalla classe principale che è la classe GUI per l'intera finestra di dialogo.
Non appena i file vengono inseriti nei controlli dedicati a questo, il file manager riceve i percorsi e inizia a caricare i file per entrambi i FileEdits. Considerando che il processo di aggiunta per i controlli di modifica è relativamente lento, ho deciso di caricare 500 righe e quindi aggiungere l'intero pacchetto in una sola volta.
Pertanto, vorrei leggere 500 righe per entrambi i file all'interno del FileManager. Per ogni riga letta, il gestore confronta le linee, controlla le differenze e crea una struttura, contenente il contenuto della linea e lo stato (uguale, diverso, errore ... ecc.).
Dopo aver letto 500 righe, il gestore invia ad ogni file un vettore contenente le 500 strutture, quindi FileEdit aggiungerà effettivamente le righe nel pacchetto al controllo di modifica.
Questa è una specie di idea che mi sta turbinando nella testa proprio ora. Il problema sarebbe comunque la gestione dell'input dell'utente reale. Considerando che gli oggetti FileEdit sono gestiti da FileManager, ma in realtà ricevono gli stessi eventi di input - come potrebbe essere informato il FileManager da questo input?
EDIT: Forse ha senso lasciare che entrambi gli Edits caricino da soli i file e gestiscano un vettore di strutture per ogni riga, contenente tutte le informazioni, e quindi lasciando che il gestore recuperi le informazioni per il confronto dagli oggetti Modifica.
Oppure, ancora meglio, rendere il gestore del confronto un membro di entrambi gli edit. In questo modo, gli eventi possono attivare un confronto per conto proprio.
Qualcuno ha implementato qualcosa del genere e potrebbe darmi un'idea di come farlo?