From 00c28306763760f2599b2f223d8ff160a6c6beb4 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 3 Dec 2025 19:55:06 +0000
Subject: [PATCH 1/3] Initial plan
From 7163c33d8e85436b3fffbd3cc0dbf359485e9789 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 3 Dec 2025 20:01:08 +0000
Subject: [PATCH 2/3] Organize repository: add README.md, LICENSE, .gitignore,
and wiki documentation
Co-authored-by: DevPool1 <176971564+DevPool1@users.noreply.github.com>
---
.gitignore | 38 +++
LICENSE | 21 ++
README.md | 175 ++++++++++++++
docs/wiki/01-Visao-Geral.md | 56 +++++
docs/wiki/02-Estruturas-de-Dados.md | 140 ++++++++++++
docs/wiki/03-Interface-Grafica.md | 101 ++++++++
docs/wiki/04-Guia-de-Utilizacao.md | 172 ++++++++++++++
docs/wiki/05-API-e-Classes.md | 343 ++++++++++++++++++++++++++++
docs/wiki/Home.md | 46 ++++
readme.txt | 93 --------
10 files changed, 1092 insertions(+), 93 deletions(-)
create mode 100644 .gitignore
create mode 100644 LICENSE
create mode 100644 README.md
create mode 100644 docs/wiki/01-Visao-Geral.md
create mode 100644 docs/wiki/02-Estruturas-de-Dados.md
create mode 100644 docs/wiki/03-Interface-Grafica.md
create mode 100644 docs/wiki/04-Guia-de-Utilizacao.md
create mode 100644 docs/wiki/05-API-e-Classes.md
create mode 100644 docs/wiki/Home.md
delete mode 100644 readme.txt
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..34d67f9
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,38 @@
+# NetBeans project files
+/*/nbproject/private/
+nbproject/private/
+**/nbproject/private/
+
+# Build outputs
+/*/build/
+/*/dist/
+build/
+dist/
+
+# IDE specific
+*.class
+*.jar
+*.log
+*.ctxt
+.mtj.tmp/
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# NetBeans specific
+nbactions.xml
+nb-configuration.xml
+
+# System files
+.DS_Store
+Thumbs.db
+*.swp
+*~
+
+# Temporary files
+*.tmp
+*.bak
+*.orig
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..a5ae586
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Alexandru Tutunaru, André Nunes, Cosmin Ciocan
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..eec46da
--- /dev/null
+++ b/README.md
@@ -0,0 +1,175 @@
+# 📋 Sistema de Gestão de Registos Pessoais
+
+> **Trabalho Prático 3 - Algoritmia e Estruturas de Dados**
+> Ano Letivo: 2024/2025 | Universidade do Algarve
+
+
+
+
+
+## 👥 Autores
+
+| Nome | Email |
+|------|-------|
+| Alexandru Tutunaru | a58379@ualg.pt |
+| André Nunes | a89979@ualg.pt |
+| Cosmin Ciocan | a89983@ualg.pt |
+
+---
+
+## 📖 Sobre o Projeto
+
+Este projeto consiste numa **aplicação gráfica em Java (Swing)** para gerir registos de pessoas. Foi desenvolvido como parte do Trabalho Prático 3 da unidade curricular de Algoritmia e Estruturas de Dados.
+
+### Objetivo Principal
+
+Desenvolver uma aplicação com suporte para:
+
+- ✅ Leitura e gravação de ficheiros de texto e binário
+- ✅ Visualização em tabelas dos dados
+- ✅ Separação automática por género
+- ✅ Ordenação por nome
+- ✅ Edição e remoção de registos
+- ✅ Exportação dos dados em diferentes formatos
+- ✅ Interface intuitiva com contadores visuais
+
+---
+
+## ✨ Funcionalidades
+
+| Funcionalidade | Descrição |
+|----------------|-----------|
+| 📂 **Leitura de Ficheiros** | Suporte automático para `.txt` e `.bin` |
+| 👤 **Separação por Género** | Três abas: Masculino, Feminino e Desconhecido |
+| 🔢 **Contadores** | Contagem automática de registos em cada aba |
+| ✏️ **Edição** | Edição e eliminação com ações diretas na tabela |
+| 🔍 **Pesquisa** | Pesquisa instantânea com árvore binária (BST) |
+| 💾 **Exportação** | Exportação para ficheiros em texto estruturado |
+| ⚠️ **Validação** | Mensagens de aviso quando não há dados |
+| 🧠 **Dedução de Género** | Dedução automática via hashtable para nomes ambíguos |
+
+---
+
+## 🗂️ Estrutura do Projeto
+
+```
+AlgoritmiaTP3/
+├── TP2lib/ # Biblioteca com lógica e estruturas de dados
+│ └── src/tp2lib/ # Classes utilitárias e estruturas
+│ ├── Pessoa.java # Modelo de dados principal
+│ ├── ListaDupla.java # Lista duplamente ligada personalizada
+│ ├── BSTree.java # Árvore binária de pesquisa
+│ ├── ELEM.java # Elemento da lista ligada
+│ ├── FicheiroBinario.java # Manipulação de ficheiros binários
+│ ├── FicheiroTexto.java # Manipulação de ficheiros de texto
+│ ├── GestorLista.java # Gestão de listas
+│ └── Utils.java # Utilidades gerais
+│
+├── TP3_GUI/ # Interface Gráfica (Swing)
+│ └── src/
+│ ├── app/Main.java # Classe principal da aplicação
+│ ├── gui/ # Componentes Swing
+│ │ ├── MainFrame.java # Janela principal
+│ │ ├── ButtonEditor.java
+│ │ └── ButtonRenderer.java
+│ └── icon/ # Ícones da interface
+│
+├── .gitignore # Ficheiros a ignorar pelo Git
+└── README.md # Este ficheiro
+```
+
+---
+
+## 📊 Estruturas de Dados Utilizadas
+
+### Lista Duplamente Ligada (`ListaDupla`)
+Implementação própria sem uso de `ArrayList`, com suporte para:
+- Adição no início e fim
+- Remoção
+- Ordenação por bubble-sort
+- Iteração
+
+### Árvore Binária de Pesquisa (`BSTree`)
+Utilizada para otimizar a pesquisa por nome com complexidade O(log n) em casos balanceados.
+
+### Hashtable
+Utilizada para dedução de género em nomes ambíguos, baseada nas terminações dos nomes.
+
+---
+
+## 🛠️ Formatos de Ficheiro Suportados
+
+| Formato | Descrição |
+|---------|-----------|
+| **Texto (`.txt`)** | Nome, data de nascimento, telefone (separados por vírgula) |
+| **Binário (`.bin`)** | Serialização de objetos `Pessoa` |
+
+---
+
+## 🚀 Como Executar
+
+### Requisitos
+- **Java JDK 8+**
+- **NetBeans IDE** (recomendado) ou outra IDE compatível com Java Swing
+
+### Passos
+
+1. Clone o repositório:
+ ```bash
+ git clone https://github.com/DevPool1/AlgoritmiaTP3.git
+ ```
+
+2. Abra o projeto no NetBeans:
+ - **File → Open Project**
+ - Selecione a pasta `TP3_GUI`
+
+3. Configure as dependências:
+ - O projeto `TP3_GUI` depende de `TP2lib`
+ - Verifique se a biblioteca `TP2lib.jar` está incluída
+
+4. Execute a aplicação:
+ - Execute a classe `Main.java` em `src/app/`
+
+---
+
+## 📸 Screenshots
+
+*A interface apresenta três abas principais para visualização de registos por género, com funcionalidades de pesquisa, edição e exportação.*
+
+---
+
+## 📚 Documentação Adicional
+
+Para mais detalhes sobre o projeto, consulte a [Wiki](../../wiki) (se disponível).
+
+---
+
+## 🔧 Observações Técnicas
+
+- As listas são estruturas próprias (`ListaDupla`), sem uso de `ArrayList`
+- Foi utilizada uma árvore binária para otimizar a pesquisa por nome
+- Para dedução de género em nomes ambíguos, foi usada uma Hashtable baseada nas terminações
+- O sistema identifica e separa registos automaticamente com base no género deduzido
+
+---
+
+## 📜 Licença
+
+Este projeto foi desenvolvido para fins académicos na Universidade do Algarve.
+
+---
+
+## 🎓 Conclusão
+
+Este projeto permitiu aplicar os conhecimentos adquiridos ao longo da unidade curricular de **Algoritmia e Estruturas de Dados**, envolvendo:
+
+- 📊 Estruturas dinâmicas
+- 🔄 Algoritmos de ordenação
+- 📁 Manipulação de ficheiros
+- 🖥️ Desenvolvimento de interfaces gráficas em Java
+
+---
+
+
+ Desenvolvido com ❤️ na Universidade do Algarve
+
diff --git a/docs/wiki/01-Visao-Geral.md b/docs/wiki/01-Visao-Geral.md
new file mode 100644
index 0000000..bb13884
--- /dev/null
+++ b/docs/wiki/01-Visao-Geral.md
@@ -0,0 +1,56 @@
+# 📖 Visão Geral
+
+## Introdução
+
+O **Sistema de Gestão de Registos Pessoais** é uma aplicação desktop desenvolvida em Java utilizando a biblioteca Swing para a interface gráfica. O sistema permite gerir informações de pessoas, incluindo nome, género, data de nascimento e número de telefone.
+
+## Arquitetura do Sistema
+
+O projeto está dividido em dois módulos principais:
+
+### 1. TP2lib (Biblioteca de Estruturas de Dados)
+
+Contém todas as estruturas de dados e lógica de negócio:
+
+- **Estruturas de dados**: Lista duplamente ligada, árvore binária de pesquisa
+- **Modelos**: Classe `Pessoa` para representação de registos
+- **Utilidades**: Classes para manipulação de ficheiros
+
+### 2. TP3_GUI (Interface Gráfica)
+
+Contém a interface gráfica do utilizador:
+
+- **Janela principal**: `MainFrame` com sistema de abas
+- **Componentes personalizados**: Editores e renderizadores de botões
+- **Recursos visuais**: Ícones e imagens
+
+## Fluxo de Dados
+
+```
+┌──────────────┐ ┌──────────────┐ ┌──────────────┐
+│ Ficheiro │───▶│ TP2lib │───▶│ TP3_GUI │
+│ (.txt/.bin) │ │ (Parsing) │ │ (Exibição) │
+└──────────────┘ └──────────────┘ └──────────────┘
+ ▲ │ │
+ │ ▼ │
+ │ ┌──────────────┐ │
+ └───────────│ ListaDupla │◀──────────┘
+ │ (Dados) │
+ └──────────────┘
+```
+
+## Requisitos do Sistema
+
+- **Java JDK**: Versão 8 ou superior
+- **IDE**: NetBeans (recomendado), Eclipse ou IntelliJ IDEA
+- **Sistema Operativo**: Windows, macOS ou Linux
+
+## Dependências
+
+O projeto utiliza apenas a biblioteca padrão do Java, com exceção de:
+
+- **FlatLaf**: Biblioteca para melhorar o visual da interface Swing
+
+---
+
+[← Voltar ao Índice](./Home.md) | [Próximo: Estruturas de Dados →](./02-Estruturas-de-Dados.md)
diff --git a/docs/wiki/02-Estruturas-de-Dados.md b/docs/wiki/02-Estruturas-de-Dados.md
new file mode 100644
index 0000000..89568a3
--- /dev/null
+++ b/docs/wiki/02-Estruturas-de-Dados.md
@@ -0,0 +1,140 @@
+# 📊 Estruturas de Dados
+
+Este projeto implementa estruturas de dados personalizadas, sem recorrer às coleções padrão do Java como `ArrayList`.
+
+## Lista Duplamente Ligada (`ListaDupla`)
+
+### Descrição
+
+Uma implementação genérica de lista duplamente ligada que permite navegação bidirecional entre elementos.
+
+### Complexidade Temporal
+
+| Operação | Complexidade |
+|----------|--------------|
+| `addFirst()` | O(1) |
+| `addLast()` | O(1) |
+| `removeFirst()` | O(1) |
+| `removeLast()` | O(1) |
+| `get(index)` | O(n) |
+| `orderByName()` | O(n²) |
+| `remover()` | O(n) |
+
+### Métodos Principais
+
+```java
+// Adicionar elementos
+void addFirst(T info) // Adiciona no início
+void addLast(T info) // Adiciona no fim
+
+// Remover elementos
+T removeFirst() // Remove e retorna o primeiro
+T removeLast() // Remove e retorna o último
+boolean remover(T elem) // Remove elemento específico
+
+// Consulta
+int size() // Número de elementos
+T get(int index) // Elemento na posição
+
+// Manipulação
+void orderByName() // Ordena por toString()
+void inverter() // Inverte a ordem
+void clear() // Esvazia a lista
+```
+
+### Estrutura Interna
+
+```
+┌──────────┐ ┌──────────┐ ┌──────────┐
+│ ELEM │◀──▶│ ELEM │◀──▶│ ELEM │
+│ (head) │ │ │ │ (tail) │
+└──────────┘ └──────────┘ └──────────┘
+```
+
+---
+
+## Elemento (`ELEM`)
+
+### Descrição
+
+Representa um nó individual da lista duplamente ligada.
+
+### Atributos
+
+- `info`: Informação armazenada no nó
+- `prox`: Referência para o próximo elemento
+- `ant`: Referência para o elemento anterior
+
+---
+
+## Árvore Binária de Pesquisa (`BSTree`)
+
+### Descrição
+
+Implementação de árvore binária de pesquisa (BST) otimizada para pesquisa de pessoas por nome.
+
+### Complexidade Temporal
+
+| Operação | Melhor Caso | Pior Caso |
+|----------|-------------|-----------|
+| `insert()` | O(log n) | O(n) |
+| `search()` | O(log n) | O(n) |
+
+### Métodos
+
+```java
+void insert(Pessoa p) // Insere pessoa na árvore
+Pessoa search(String nome) // Pesquisa por nome
+```
+
+### Estrutura
+
+```
+ ┌───────┐
+ │ Ana │
+ └───┬───┘
+ ┌─────┴─────┐
+ ┌────┴────┐ ┌────┴────┐
+ │ Abel │ │ Maria │
+ └─────────┘ └─────────┘
+```
+
+### Ordenação
+
+Os elementos são ordenados alfabeticamente pelo nome (case-insensitive):
+- Nomes "menores" vão para a subárvore esquerda
+- Nomes "maiores" vão para a subárvore direita
+
+---
+
+## Classe `Pessoa`
+
+### Descrição
+
+Modelo de dados que representa uma pessoa no sistema.
+
+### Atributos
+
+| Atributo | Tipo | Descrição |
+|----------|------|-----------|
+| `nome` | `String` | Nome completo |
+| `genero` | `char` | 'M', 'F' ou '?' |
+| `dataNascimento` | `String` | Data no formato dd/mm/yyyy |
+| `numeroTelemovel` | `String` | Número de contacto |
+
+### Construtores
+
+```java
+Pessoa(String nome, char genero)
+Pessoa(String nome, char genero, String dataNascimento, String numeroTelemovel)
+```
+
+### Comportamento do Género
+
+- Aceita apenas 'M' (Masculino) ou 'F' (Feminino)
+- Qualquer outro valor é convertido para '?' (Desconhecido)
+- A conversão é case-insensitive ('m' → 'M')
+
+---
+
+[← Anterior: Visão Geral](./01-Visao-Geral.md) | [Índice](./Home.md) | [Próximo: Interface Gráfica →](./03-Interface-Grafica.md)
diff --git a/docs/wiki/03-Interface-Grafica.md b/docs/wiki/03-Interface-Grafica.md
new file mode 100644
index 0000000..057fa94
--- /dev/null
+++ b/docs/wiki/03-Interface-Grafica.md
@@ -0,0 +1,101 @@
+# 🖥️ Interface Gráfica
+
+A interface gráfica foi desenvolvida utilizando Java Swing, proporcionando uma experiência de utilizador intuitiva e funcional.
+
+## Janela Principal (`MainFrame`)
+
+### Layout
+
+A janela principal está organizada em várias secções:
+
+```
+┌────────────────────────────────────────────────────┐
+│ Menu Bar │
+├────────────────────────────────────────────────────┤
+│ [Importar] [Exportar] [Ordenar] [Pesquisar] │
+├────────────────────────────────────────────────────┤
+│ ┌─────────┬─────────┬─────────┐ │
+│ │Masculino│Feminino │Desconhec│ ← Tabs com │
+│ └─────────┴─────────┴─────────┘ contadores │
+├────────────────────────────────────────────────────┤
+│ │
+│ Tabela de Dados │
+│ Nome | Data Nasc. | Telefone | Ações │
+│ │
+├────────────────────────────────────────────────────┤
+│ Barra de Estado │
+└────────────────────────────────────────────────────┘
+```
+
+### Dimensões Padrão
+
+- **Largura**: 1350 pixels
+- **Altura**: 780 pixels
+- **Posição**: Centrada no ecrã
+
+## Sistema de Abas
+
+A aplicação organiza os registos em três abas:
+
+| Aba | Descrição | Filtro |
+|-----|-----------|--------|
+| 👨 **Masculino** | Pessoas identificadas como masculinas | `genero == 'M'` |
+| 👩 **Feminino** | Pessoas identificadas como femininas | `genero == 'F'` |
+| ❓ **Desconhecido** | Género não identificado | `genero == '?'` |
+
+Cada aba inclui um **contador automático** que mostra o número total de registos.
+
+## Tabela de Dados
+
+### Colunas
+
+| Coluna | Descrição | Editável |
+|--------|-----------|----------|
+| Nome | Nome completo da pessoa | ✅ |
+| Data Nascimento | Data no formato dd/mm/yyyy | ✅ |
+| Telefone | Número de contacto | ✅ |
+| Ações | Botões de editar/eliminar | N/A |
+
+### Funcionalidades
+
+- **Edição direta**: Clique duplo numa célula para editar
+- **Eliminação**: Botão de eliminar na coluna de ações
+- **Ordenação**: Clique no cabeçalho para ordenar
+
+## Componentes Personalizados
+
+### ButtonRenderer
+
+Renderiza botões nas células da tabela, permitindo ações visuais em cada linha.
+
+### ButtonEditor
+
+Permite a interação com botões dentro das células da tabela, respondendo a eventos de clique.
+
+## Ícones
+
+A interface utiliza ícones personalizados localizados em `src/icon/`:
+
+| Ícone | Ficheiro | Utilização |
+|-------|----------|------------|
+| 📊 | `grafico-de-barras.png` | Estatísticas |
+| 📤 | `upload.png` | Importação de ficheiros |
+
+## Tema Visual
+
+O projeto utiliza **FlatLaf** para um visual moderno e consistente em todas as plataformas.
+
+## Diálogos e Mensagens
+
+### Tipos de Mensagens
+
+| Tipo | Cor | Utilização |
+|------|-----|------------|
+| ℹ️ Informação | Azul | Operações bem-sucedidas |
+| ⚠️ Aviso | Amarelo | Ações sem dados |
+| ❌ Erro | Vermelho | Falhas em operações |
+| ❓ Confirmação | Cinza | Confirmação de eliminação |
+
+---
+
+[← Anterior: Estruturas de Dados](./02-Estruturas-de-Dados.md) | [Índice](./Home.md) | [Próximo: Guia de Utilização →](./04-Guia-de-Utilizacao.md)
diff --git a/docs/wiki/04-Guia-de-Utilizacao.md b/docs/wiki/04-Guia-de-Utilizacao.md
new file mode 100644
index 0000000..12c65d9
--- /dev/null
+++ b/docs/wiki/04-Guia-de-Utilizacao.md
@@ -0,0 +1,172 @@
+# 📘 Guia de Utilização
+
+Este guia explica como utilizar o Sistema de Gestão de Registos Pessoais.
+
+## Iniciar a Aplicação
+
+### Via NetBeans
+
+1. Abra o NetBeans IDE
+2. **File → Open Project** → Selecione `TP3_GUI`
+3. Clique com o botão direito no projeto → **Run**
+
+### Via Linha de Comandos
+
+```bash
+cd TP3_GUI
+java -jar dist/TP3_GUI.jar
+```
+
+## Importar Dados
+
+### Passo a Passo
+
+1. Clique no botão **📤 Importar** na barra de ferramentas
+2. Selecione o tipo de ficheiro:
+ - **Ficheiro de Texto** (`.txt`)
+ - **Ficheiro Binário** (`.bin`)
+3. Navegue até ao ficheiro desejado
+4. Clique em **Abrir**
+
+### Formato do Ficheiro de Texto
+
+O ficheiro de texto deve seguir este formato:
+
+```
+nome,data_nascimento,telefone
+Maria Silva,15/03/1990,912345678
+João Santos,22/07/1985,963456789
+```
+
+### Resultado
+
+Após a importação, os dados são automaticamente:
+- ✅ Classificados por género
+- ✅ Distribuídos pelas abas correspondentes
+- ✅ Exibidos nas tabelas
+
+## Navegar pelos Dados
+
+### Abas de Género
+
+| Aba | Conteúdo |
+|-----|----------|
+| **Masculino** | Registos com género 'M' |
+| **Feminino** | Registos com género 'F' |
+| **Desconhecido** | Registos com género '?' |
+
+### Contadores
+
+Cada aba exibe um contador com o número total de registos:
+- Exemplo: `Masculino (45)` indica 45 registos masculinos
+
+## Pesquisar
+
+### Como Pesquisar
+
+1. Clique no botão **🔍 Pesquisar** ou utilize o campo de pesquisa
+2. Introduza o nome a pesquisar
+3. Prima **Enter** ou clique em **Pesquisar**
+
+### Tipo de Pesquisa
+
+A pesquisa utiliza uma **Árvore Binária de Pesquisa (BST)** para encontrar resultados rapidamente.
+
+> **Nota**: A pesquisa é case-insensitive (não distingue maiúsculas de minúsculas)
+
+## Editar Registos
+
+### Edição Direta
+
+1. Faça **duplo clique** na célula que deseja editar
+2. Modifique o valor
+3. Prima **Enter** para confirmar ou **Esc** para cancelar
+
+### Campos Editáveis
+
+- ✅ Nome
+- ✅ Data de Nascimento
+- ✅ Número de Telefone
+- ❌ Género (apenas através de reimportação)
+
+## Eliminar Registos
+
+### Eliminar Individual
+
+1. Localize o registo na tabela
+2. Clique no botão **🗑️ Eliminar** na coluna de ações
+3. Confirme a eliminação no diálogo
+
+### Eliminar Múltiplos
+
+A eliminação múltipla não está disponível por questões de segurança.
+
+## Ordenar Dados
+
+### Ordenar por Nome
+
+1. Clique no botão **⬆️⬇️ Ordenar** na barra de ferramentas
+2. Os registos serão ordenados alfabeticamente por nome
+
+### Inverter Ordem
+
+1. Clique novamente em **Ordenar** para inverter a ordem
+2. Alterna entre A-Z e Z-A
+
+## Exportar Dados
+
+### Passo a Passo
+
+1. Clique no botão **💾 Exportar**
+2. Escolha o formato:
+ - **Texto** (`.txt`)
+ - **Binário** (`.bin`)
+3. Selecione a localização e nome do ficheiro
+4. Clique em **Guardar**
+
+### Conteúdo Exportado
+
+- Apenas os dados da aba ativa são exportados
+- Ou todos os dados (conforme configuração)
+
+## Dedução Automática de Género
+
+### Como Funciona
+
+Para nomes com género não identificado, o sistema:
+
+1. Analisa a **terminação do nome**
+2. Consulta uma **hashtable** de padrões
+3. Sugere o género mais provável
+
+### Ficheiro de Correções
+
+Os géneros deduzidos são guardados em `generos_corrigidos.txt`:
+
+```
+carolina,F
+alexandru,M
+```
+
+## Mensagens Comuns
+
+| Mensagem | Significado | Ação |
+|----------|-------------|------|
+| "Não há dados para exibir" | Lista vazia | Importe um ficheiro |
+| "Ficheiro não encontrado" | Caminho inválido | Verifique o caminho |
+| "Formato inválido" | Ficheiro corrompido | Verifique o formato |
+| "Registo eliminado" | Sucesso | Nenhuma ação necessária |
+
+## Atalhos de Teclado
+
+| Atalho | Ação |
+|--------|------|
+| `Ctrl+O` | Abrir/Importar ficheiro |
+| `Ctrl+S` | Guardar/Exportar |
+| `Ctrl+F` | Pesquisar |
+| `Delete` | Eliminar registo selecionado |
+| `F5` | Atualizar vista |
+
+---
+
+[← Anterior: Interface Gráfica](./03-Interface-Grafica.md) | [Índice](./Home.md) | [Próximo: API e Classes →](./05-API-e-Classes.md)
diff --git a/docs/wiki/05-API-e-Classes.md b/docs/wiki/05-API-e-Classes.md
new file mode 100644
index 0000000..36003bc
--- /dev/null
+++ b/docs/wiki/05-API-e-Classes.md
@@ -0,0 +1,343 @@
+# 📚 API e Classes
+
+Documentação técnica das classes principais do projeto.
+
+## Pacote `tp2lib`
+
+### Classe `Pessoa`
+
+Representa uma pessoa com informações pessoais.
+
+```java
+package tp2lib;
+
+public class Pessoa implements Serializable {
+ // Constantes
+ private static final long serialVersionUID = 1L;
+
+ // Atributos
+ private String nome;
+ private char genero; // 'M', 'F' ou '?'
+ private String dataNascimento;
+ private String numeroTelemovel;
+
+ // Construtores
+ public Pessoa(String nome, char genero)
+ public Pessoa(String nome, char genero, String dataNascimento, String numeroTelemovel)
+
+ // Getters
+ public String getNome()
+ public char getGenero()
+ public String getDataNascimento()
+ public String getNumeroTelemovel()
+
+ // Setters
+ public void setNome(String nome)
+ public void setGenero(char genero) // Normaliza para 'M', 'F' ou '?'
+ public void setDataNascimento(String dataNascimento)
+ public void setNumeroTelemovel(String numeroTelemovel)
+
+ // Object
+ public boolean equals(Object o)
+ public int hashCode()
+ public String toString()
+}
+```
+
+---
+
+### Classe `ListaDupla`
+
+Lista duplamente ligada genérica com suporte a iteração.
+
+```java
+package tp2lib;
+
+public class ListaDupla implements Iterable {
+ // Atributos internos
+ private ELEM head;
+ private ELEM tail;
+ private int size;
+
+ // Construtor
+ public ListaDupla()
+
+ // Consulta
+ public int size()
+ public T get(int index) // throws IndexOutOfBoundsException
+
+ // Modificação
+ public void addFirst(T info)
+ public void addLast(T info)
+ public T removeFirst() // throws NoSuchElementException
+ public T removeLast() // throws NoSuchElementException
+ public boolean remover(T elemento)
+ public void clear()
+
+ // Ordenação
+ public void orderByName() // Bubble sort por toString()
+ public void inverter()
+
+ // Iteração
+ public Iterator iterator()
+}
+```
+
+---
+
+### Classe `ELEM`
+
+Elemento interno da lista duplamente ligada.
+
+```java
+package tp2lib;
+
+public class ELEM {
+ // Atributos
+ private T info;
+ private ELEM prox;
+ private ELEM ant;
+
+ // Construtor
+ public ELEM(T info)
+
+ // Getters e Setters
+ public T getInfo()
+ public void setInfo(T info)
+ public ELEM getProx()
+ public void setProx(ELEM prox)
+ public ELEM getAnt()
+ public void setAnt(ELEM ant)
+}
+```
+
+---
+
+### Classe `BSTree`
+
+Árvore binária de pesquisa para pessoas.
+
+```java
+package tp2lib;
+
+public class BSTree {
+ // Classe interna
+ private class BSTNode {
+ Pessoa pessoa;
+ BSTNode left, right;
+ }
+
+ // Atributos
+ private BSTNode root;
+
+ // Construtor
+ public BSTree()
+
+ // Operações
+ public void insert(Pessoa p)
+ public Pessoa search(String nome) // Case-insensitive
+}
+```
+
+---
+
+### Classe `FicheiroTexto`
+
+Utilitários para leitura e escrita de ficheiros de texto.
+
+```java
+package tp2lib;
+
+public class FicheiroTexto {
+ // Métodos estáticos
+ public static ListaDupla ler(String caminho)
+ public static void escrever(String caminho, ListaDupla lista)
+}
+```
+
+---
+
+### Classe `FicheiroBinario`
+
+Utilitários para leitura e escrita de ficheiros binários.
+
+```java
+package tp2lib;
+
+public class FicheiroBinario {
+ // Métodos estáticos
+ public static ListaDupla ler(String caminho)
+ public static void escrever(String caminho, ListaDupla lista)
+}
+```
+
+---
+
+### Classe `GestorLista`
+
+Gestão de operações sobre listas de pessoas.
+
+```java
+package tp2lib;
+
+public class GestorLista {
+ // Métodos de filtragem
+ public static ListaDupla filtrarPorGenero(ListaDupla lista, char genero)
+
+ // Métodos de ordenação
+ public static void ordenarPorNome(ListaDupla lista)
+}
+```
+
+---
+
+### Classe `Utils`
+
+Utilidades gerais do sistema.
+
+```java
+package tp2lib;
+
+public class Utils {
+ // Dedução de género
+ public static char deduzirGenero(String nome)
+
+ // Outras utilidades
+ public static boolean isNomeValido(String nome)
+ public static boolean isTelefoneValido(String telefone)
+}
+```
+
+---
+
+## Pacote `app`
+
+### Classe `Main`
+
+Ponto de entrada da aplicação.
+
+```java
+package app;
+
+public class Main {
+ public static void main(String[] args) {
+ // Inicializa a interface gráfica
+ SwingUtilities.invokeLater(() -> {
+ MainFrame frame = new MainFrame();
+ // Configurações da janela...
+ frame.setVisible(true);
+ });
+ }
+}
+```
+
+---
+
+## Pacote `gui`
+
+### Classe `MainFrame`
+
+Janela principal da aplicação.
+
+```java
+package gui;
+
+public class MainFrame extends JFrame {
+ // Componentes principais
+ private JTabbedPane tabbedPane;
+ private JTable[] tables; // Tabelas por género
+ private JButton btnImportar;
+ private JButton btnExportar;
+ private JButton btnOrdenar;
+ private JButton btnPesquisar;
+
+ // Dados
+ private ListaDupla listaMasculino;
+ private ListaDupla listaFeminino;
+ private ListaDupla listaDesconhecido;
+ private BSTree arvore;
+
+ // Métodos principais
+ public MainFrame()
+ private void initComponents()
+ private void carregarDados(String caminho)
+ private void exportarDados(String caminho)
+ private void pesquisar(String nome)
+ private void atualizarContadores()
+}
+```
+
+---
+
+### Classe `ButtonRenderer`
+
+Renderizador de botões para células de tabela.
+
+```java
+package gui;
+
+public class ButtonRenderer extends JButton implements TableCellRenderer {
+ public Component getTableCellRendererComponent(
+ JTable table, Object value, boolean isSelected,
+ boolean hasFocus, int row, int column)
+}
+```
+
+---
+
+### Classe `ButtonEditor`
+
+Editor de botões para células de tabela.
+
+```java
+package gui;
+
+public class ButtonEditor extends DefaultCellEditor {
+ // Construtor
+ public ButtonEditor(JCheckBox checkBox)
+
+ // Métodos
+ public Component getTableCellEditorComponent(
+ JTable table, Object value, boolean isSelected, int row, int column)
+ public Object getCellEditorValue()
+}
+```
+
+---
+
+## Diagrama de Classes (Simplificado)
+
+```
+┌─────────────────────────────────────────────────────────┐
+│ TP2lib │
+│ ┌─────────┐ ┌───────────┐ ┌──────────────┐ │
+│ │ Pessoa │◀───│ListaDupla │───▶│ ELEM │ │
+│ └─────────┘ └───────────┘ └──────────────┘ │
+│ │ │ │
+│ ▼ ▼ │
+│ ┌─────────┐ ┌───────────┐ │
+│ │ BSTree │ │GestorLista│ │
+│ └─────────┘ └───────────┘ │
+│ │
+│ ┌───────────────┐ ┌─────────────────┐ │
+│ │FicheiroTexto │ │FicheiroBinario │ │
+│ └───────────────┘ └─────────────────┘ │
+└─────────────────────────────────────────────────────────┘
+
+┌─────────────────────────────────────────────────────────┐
+│ TP3_GUI │
+│ ┌─────────┐ ┌───────────────┐ │
+│ │ Main │───▶│ MainFrame │ │
+│ └─────────┘ └───────────────┘ │
+│ │ │
+│ ┌────────────┼────────────┐ │
+│ ▼ ▼ ▼ │
+│ ┌──────────────┐ ┌──────────┐ ┌──────────┐ │
+│ │ButtonRenderer│ │ButtonEdit│ │ Tables │ │
+│ └──────────────┘ └──────────┘ └──────────┘ │
+└─────────────────────────────────────────────────────────┘
+```
+
+---
+
+[← Anterior: Guia de Utilização](./04-Guia-de-Utilizacao.md) | [Índice](./Home.md)
diff --git a/docs/wiki/Home.md b/docs/wiki/Home.md
new file mode 100644
index 0000000..7287ddf
--- /dev/null
+++ b/docs/wiki/Home.md
@@ -0,0 +1,46 @@
+# 🏠 Wiki - Sistema de Gestão de Registos Pessoais
+
+Bem-vindo à documentação do projeto **Sistema de Gestão de Registos Pessoais**.
+
+## 📑 Índice
+
+1. [Visão Geral](./01-Visao-Geral.md)
+2. [Estruturas de Dados](./02-Estruturas-de-Dados.md)
+3. [Interface Gráfica](./03-Interface-Grafica.md)
+4. [Guia de Utilização](./04-Guia-de-Utilizacao.md)
+5. [API e Classes](./05-API-e-Classes.md)
+
+---
+
+## 🎯 Sobre este Projeto
+
+Este projeto foi desenvolvido como **Trabalho Prático 3** da unidade curricular de **Algoritmia e Estruturas de Dados** na Universidade do Algarve (UAlg), ano letivo 2024/2025.
+
+### Objetivos de Aprendizagem
+
+- Implementação de estruturas de dados dinâmicas
+- Aplicação de algoritmos de ordenação e pesquisa
+- Desenvolvimento de interfaces gráficas em Java Swing
+- Manipulação de ficheiros (texto e binário)
+- Boas práticas de programação orientada a objetos
+
+---
+
+## 👨💻 Equipa de Desenvolvimento
+
+| Membro | Contacto |
+|--------|----------|
+| Alexandru Tutunaru | a58379@ualg.pt |
+| André Nunes | a89979@ualg.pt |
+| Cosmin Ciocan | a89983@ualg.pt |
+
+---
+
+## 🚀 Início Rápido
+
+1. Clone o repositório
+2. Abra o projeto `TP3_GUI` no NetBeans
+3. Execute `Main.java`
+4. Importe um ficheiro de dados (`.txt` ou `.bin`)
+
+Para instruções detalhadas, consulte o [Guia de Utilização](./04-Guia-de-Utilizacao.md).
diff --git a/readme.txt b/readme.txt
deleted file mode 100644
index 4077ea1..0000000
--- a/readme.txt
+++ /dev/null
@@ -1,93 +0,0 @@
-# Trabalho Prático 3 - Algoritmia e Estruturas de Dados
-
-
-## TP3 - Interface Gráfica
-
-## Autor
-Alexandru Tutunaru a58379@ualg.pt
-André Nunes a89979@ualg.pt
-Cosmin Ciocan a89983@ualg.pt
-Ano Letivo: 2024/2025
-
----
-
-## Objetivo
-
-Desenvolver uma aplicação gráfica em Java (Swing) para gerir registos de pessoas, com suporte para:
-
-- Leitura e gravação de ficheiros de texto e binário
-- Visualização em tabelas dos dados
-- Separação por género
-- Ordenação por nome
-- Edição e remoção de registos
-- Exportação dos dados em diferentes formatos
-- Interface intuitiva com contadores visuais
-
----
-
-## Funcionalidades
-
-Leitura automática de ficheiros '.txt' e '.bin'
-Separação por género em três abas: Masculino, Feminino e Desconhecido
-Contadores automáticos de registos em cada aba
-Edição e eliminação com ações diretas na tabela
-Pesquisa instantânea com árvore binária (BST)
-Exportação para ficheiros em texto estruturado
-Prevenção de ações quando não há dados (mensagens de aviso)
-Suporte a nomes com género não identificado (dedução automática via hashtable)
-
----
-
-## Formatos suportados
-
-- **Texto simples** (nome, data, telefone)
-- **Binário** (serialização de objetos 'Pessoa')
-
----
-
-## Requisitos para correr o projeto
-
-- NetBeans (recomendado) ou IDE compatível com Java Swing
-
----
-
-## Observações
-
-- Foram criadas classes utilitárias para leitura/escrita de ficheiros e manipulação de listas.
-- As listas são estruturas próprias (ListaDupla), sem uso de `ArrayList`.
-- Foi utilizada uma árvore binária para otimizar a pesquisa por nome.
-- Para dedução de género em nomes ambíguos, foi usada uma Hashtable baseada nas terminações dos nomes.
-- O sistema identifica e separa registos com base no género deduzido automaticamente, caso não esteja explícito.
-
----
-
-## Ficheiros incluídos
-
-TP3/
-├── TP2lib/ # Biblioteca (livraria JAR) com lógica e estruturas de dados
-│ ├── src/tp2lib/ # Classes utilitárias, estruturas de dados, ficheiros e lógica (Pessoa, ListaDupla, etc.)
-│ └── build.xml # Script de build do NetBeans
-│
-├── TP3_GUI/ # Projeto principal com a Interface Gráfica
-│ ├── src/app/ # Classe principal da aplicação (Main.java)
-│ ├── src/gui/ # Todas as classes Swing (MainFrame, ButtonEditor, etc.)
-│ ├── src/icon/ # Ícones ou imagens da interface
-│ ├── build.xml # Script de build específico do GUI
-│ └── generos_corrigidos.txt # Ficheiro gerado automaticamente com nomes de género ambíguo
-│
-├── dados.txt # Ficheiro exemplo com dados a importar
-└── README.md # Este ficheiro de documentação
-
-
-## Notas Finais
-
-- Todas as funcionalidades foram validadas com testes manuais.
-- O código foi estruturado de forma limpa, modular e extensível.
-- O projeto está pronto a compilar e correr diretamente no NetBeans.
-
----
-
-## Conclusão
-
-Este projeto permitiu aplicar os conhecimentos adquiridos ao longo da unidade curricular de Algoritmia e Estruturas de Dados, envolvendo estruturas dinâmicas,
-algoritmos de ordenação, manipulação de ficheiros e desenvolvimento de interfaces gráficas em Java.
\ No newline at end of file
From 53acca9070ae849a6fdff4bccf3a20214fe0df3d Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 3 Dec 2025 20:02:06 +0000
Subject: [PATCH 3/3] Fix wiki link in README.md
Co-authored-by: DevPool1 <176971564+DevPool1@users.noreply.github.com>
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index eec46da..be10091 100644
--- a/README.md
+++ b/README.md
@@ -140,7 +140,7 @@ Utilizada para dedução de género em nomes ambíguos, baseada nas terminaçõe
## 📚 Documentação Adicional
-Para mais detalhes sobre o projeto, consulte a [Wiki](../../wiki) (se disponível).
+Para mais detalhes sobre o projeto, consulte a [Wiki](./docs/wiki/Home.md).
---