Krav på uppgift - OliviaImner/AssignmentMap GitHub Wiki

Specifikationer för inlämning: Karta:

  • Visas med menyn Archive nedfällt
  • New Map så visas en fildialog där användaren kan välja en bild
  • Bilden ska laddas in och visas i fönstret
  • Om bilden är större än fönstret ska rulllistor visas så att man ska kunna scrolla kartan
  • Kunna förstora fönstret genom att dra ut det.

Position:

  • Varje plats har ett namn som anges då platsen skapas, en position och en färg (som bestäms av kategorin).
  • Positionen anger helt enkelt platsens pixelkoordinater och ska representeras med en egenskriven klass med namnet Position.
  • Position-klassen ska därför förberedas så att dess objekt ska fungera väl som nycklar i hash tabeller.
  • Obs den lilla komplikationen att platsens grafiska area räknas från dess övre vänstra hörn, medan platsens position enligt denna tillämpning är triangelns nedre spets. Det kräver lite omräkning av koordinater.

Platser:

  • I uppgiften ingår att det ska finnas två typer av platser: NamedPlace som (förutom koordinater, kategori osv) har bara ett namn och en DescribedPlace som (förutom koordinater, kategori osv) har både ett namn och en beskrivande text.
  • En plats skapas genom att användaren väljer kategori i listan till höger
  • Väljer platstypen med hjälp av radioknapparna vid New-knappen och trycker på knappen New
  • Då ska markören över kartan ändras till ett kors (för att markera att nästa klick på kartan skapar en plats)
  • och en klick på kartan skapar en plats på den klickade positionen. Obs att det är tänkt att den nedre triangelspetsen visar var platsen finns, så det behövs en viss justering av koordinater för platsen.
  • Om ingen kategori är markerad när en plats skapas blir platsen kategorilös och dess färg blir svart.
  • Om det redan finns en plats på den klickade punkten ska ett felmeddelande ges – det är endast tillåtet med en plats per position.
  • Efter att platsen är skapad ska inte kartan vara mottaglig för klickning förrän användaren trycker på knappen New igen.
  • När en NamedPlace skapas ska användaren ange platsens namn, vilket kan ordnas med en JOptionPane.showInputDialog.
  • När en DescribedPlace skapas ska användaren dels ange namnet, dels en beskrivning som (av tekniska skäl) består av bara en rad – detta kan ordnas med en dialog med ett litet formulär (en JPanel).
  • En plats ska kunna vara synlig eller gömd (man kan gömma platser man är ointresserad av för att göra kartan mer överskådlig).
  • Platsen ska kunna vara markerad eller ej.
  • Användaren kunna högerklicka på en plats och då få se dess information i en dialogruta.
  • Hantering av om platsen är synlig eller inte kan implementeras med anrop till Swings grafiska komponenters setVisible-metod (Plats-klassen bör givetvis ärva från JComponent). Om platsen visas markerad eller inte ska implementeras i Plats-klassen.
  • Användaren ska kunna markera/avmarkera en plats genom att klicka på den med vänster musknapp3. Flera platser ska kunna vara markerade samtidigt. Hur en markerad plats visas kan du bestämma själv, exempelvis kan markerade platser visas med en omgivande röd rektangel.
  • Användaren ska kunna klicka på en plats med höger musknapp och då få se information om platsen. Informationen visas i en dialogruta placerad över platsen. Vilken information som visas beror på platstypen: för en NamedPlace visas namnet och koordinaterna och för en DescribedPlace visas namnet med koordinater, samt beskrivningen.
  • Programmet måste kunna hålla reda på vilka platser som är markerade – operationerna Hide och Remove arbetar på de markerade platserna.

Search

  • Den börjar med att avmarkera ev. platser som är markerade före sökningen, hämtar den söksträngen från sökfältet, och gör alla platser som har detta namn synliga och markerade.
  • Resultatet av sökningen presenteras alltså genom att platser med detta namn blir markerade (och synliga om de var gömda förut).
  • Search-operationen förutsätter att man snabbt kan få fram alla platser som har angivet namn. Det behövs en lämplig datastruktur som gör det möjligt. Obs att vi låtsas som om antalet platser kan vara mycket stort, sekvensiell genomgång av olämpliga datastrukturer kan därför inte accepteras.

Hide

  • Operationen Hide gömmer alla markerade platser och gör dem avmarkerade. Även denna operation borde stödjas av någon lämplig datastruktur så att man inte behöver gå igenom alla platser utan bara de som är markerade.

Remove

  • Operationen Remove tar bort alla markerade platser – inte bara så att de inte syns på kartan utan objekten ska tas bort från alla datastrukturer där de kan finnas.

Coordinates

  • Användaren ska kunna fråga om vad som finns på en viss position på kartan genom att klicka på knappen Coordinates. Detta öppnar en lite dialogruta: där användaren kan mata in koordinater och ska innehåla:
  • Om det finns en plats på dessa koordinater så ska platsen göras synlig (om den var osynlig) och markerad.
  • Eventuella platser som var markerade innan ska avmarkeras.
  • Om det inte finns någon plats på dessa koordinater ska en dialogruta med meddelande om detta visas.
  • I den här dialogen bör det kontrolleras att de inmatade värdena är numeriska. (Obs igen att vi tänker oss att antalet platser är stort, så denna operation behöver också en lämplig datastruktur där man snabbt kan få fram en plats med hjälp av dess position (eller få veta att det inte finns någon plats där). Denna datastruktur behövs även vid skapande av platser, för att kontrollera att det inte redan finns en plats på den klickade positionen.)

Kategorier

  • Platserna kan som sagt tillhöra en av de tre kategorierna (eller vara kategorilösa).
  • Kategorierna visas i listan i högra panelen.
  • Platsen tillhör den kategori som är vald när platsen skapas, om ingen kategori är vald då blir platsen kategorilös. Till varje kategori hör en färg, platsen färg (som triangeln ritas ut i) är kategorins färg. Färgerna är: Bus = Color.RED, Underground = Color.BLUE, Train = Color.GREEN. Kategorilösa platser är svarta.
  • Om man vill gömma alla platser som hör till en viss kategori så väljer man kategorin i kategorilistan och klickar på knappen Hide category – platser som hör till denna kategori ska göras osynliga. Om man vill göra alla platser som hör till en viss kategori synliga så räcker det att markera kategorin i listan.

Arkiv-menyn

  • Programmets data ska kunna sparas på fil

  • Operationerna i menyn är New Map, Load Places, Save och Exit.

  • Själva kartbilden ligger på sin fil och ändras inte av programmet, så den behöver inte sparas. Platserna däremot ska kunna sparas (Save) och laddas in (Load Places).

  • Platserna ska sparas på en textfil, med en plats per rad. På varje rad ska platsens värden skrivas ut i en kommaseparerad lista, med platsens typ (Named eller Described), platsens kategori (Bus, Underground, Train eller None om platsen saknar kategori), x-koordinaten, y-koordinaten, platsens namn och (om platsen är av typen Described) dess beskrivning.

  • Både Load Places och Save ska visa en filöppningsdialog och fråga användaren om filnamnet där platserna ska sparas/därifrån platserna ska läsas in.

  • Exit ska avsluta programexekveringen. Programmet ska även kunna avslutas via stängningsrutan. Om det finns osparade förändringar ska det visas en dialogruta som varnar om att det finns osparade ändringar och frågar om man ändå vill avsluta – användaren har då möjligheten att avbryta operationen.

  • Obs att både New Map och Load Places kan väljas även när man har en karta inladdad och platser skapade. I så fall måste det aktuella ”dokumentet” avslutas innan det nya kan användas. Användaren bör ges samma varning som vid Exit i fall det finns osparade ändringar. Dessutom måste alla datastrukturer som innehåller platser tömmas, så att de nya kan skapas/laddas in.