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
|
//////////////////////////////////////////////////////////////////////////
//
// pgAdmin III - PostgreSQL Tools
//
// Copyright (C) 2002 - 2014, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// ddRelationshipItem.cpp - Items (fk columns) inside a relationship figure hashmap
//
//////////////////////////////////////////////////////////////////////////
#include "pgAdmin3.h"
// wxWindows headers
#include <wx/wx.h>
#include <wx/dcbuffer.h>
// App headers
#include "dd/dditems/figures/ddRelationshipItem.h"
#include "dd/dditems/figures/ddRelationshipFigure.h"
#include "hotdraw/main/hdDrawingView.h"
#include "dd/dditems/utilities/ddDataType.h"
ddRelationshipItem::ddRelationshipItem()
{
ownerRel = NULL;
original = NULL;
destinationTable = NULL;
}
ddRelationshipItem::ddRelationshipItem(ddRelationshipFigure *owner, ddColumnFigure *originalColumn, ddTableFigure *destination, ddColumnOptionType type, ddColumnType colType, ddColumnFigure *existingColumn)
{
ownerRel = owner;
original = originalColumn;
originalStartColName = original->getColumnName(false);
destinationTable = destination;
if(existingColumn == NULL) //Fk destination column will be automatically generated
{
generatedName = autoGenerateNameForFk();
fkColumn = new ddColumnFigure( generatedName, destinationTable, this);
fkColumn->setColumnOption(type);
fkColumn->toggleColumnKind(colType);
fkColumn->activateGenFkName(); //By default fk name is generate by using ( alias | tableName) . ColumnName combination
fkIsAutoGenerated = true;
}
else //using existing column as fk destination (Validation Required at user choices compatibility of types, precision and scale)
{
generatedName = wxEmptyString;
fkColumn = existingColumn;
fkColumn->setAsUserCreatedFk(this);
fkColumn->deactivateGenFkName();
fkIsAutoGenerated = false;
}
fkColumn->setRightIconForColumn();
}
ddRelationshipItem::~ddRelationshipItem()
{
}
void ddRelationshipItem::initRelationshipItemValues(ddRelationshipFigure *owner, ddTableFigure *destination, bool fromExistingColumn, ddColumnFigure *fkCol, ddColumnFigure *sourceCol, wxString initialColName)
{
ownerRel = owner;
destinationTable = destination;
fkIsAutoGenerated = fromExistingColumn;
original = sourceCol;
fkColumn = fkCol;
originalStartColName = initialColName;
if(fkIsAutoGenerated)
fkColumn->setFkSource(this);
else
fkColumn->setAsUserCreatedFk(this);
fkColumn->setRightIconForColumn();
}
bool ddRelationshipItem::isAutomaticallyGenerated()
{
return fkIsAutoGenerated;
}
wxString ddRelationshipItem::autoGenerateNameForFk()
{
wxString newName;
newName = original->getOwnerTable()->getTableName();
newName.append(wxT("_"));
newName.append(originalStartColName);
return newName;
}
void ddRelationshipItem::syncAutoFkName()
{
originalStartColName = original->getColumnName(false); //Because original name was probably changed, now I should update it.
if(fkColumn->isGeneratedForeignKey() && fkColumn->isFkNameGenerated() )
{
fkColumn->setColumnName(autoGenerateNameForFk());
//Update all connections, but need to be notified to all views only doing it right now for first view
ownerRel->updateConnection(0);
}
}
bool ddRelationshipItem::relationIsIdentifying()
{
return ownerRel->getIdentifying();
}
bool ddRelationshipItem::relationIsMandatory()
{
return ownerRel->getMandatory();
}
wxString ddRelationshipItem::sourceTableName()
{
return original->getOwnerTable()->getTableName();
}
wxString ddRelationshipItem::destTableName()
{
return destinationTable->getTableName();
}
bool ddRelationshipItem::isForeignKeyFromPk()
{
if(ownerRel)
{
return ownerRel->isForeignKeyFromPk();
}
return false;
}
|