From 5f7d201167d6135a2485dc345611d8610b8ea7eb Mon Sep 17 00:00:00 2001 From: Jerson Date: Thu, 28 Dec 2023 13:16:29 +0800 Subject: [PATCH 1/8] material 3, update project --- app/build.gradle | 21 +- app/src/main/AndroidManifest.xml | 3 +- .../controller/MainActivity.java | 474 ++++++------- .../motus/umlclasseditor/model/UmlClass.java | 174 ++--- .../umlclasseditor/model/UmlProject.java | 9 +- .../umlclasseditor/view/GraphFragment.java | 16 + .../motus/umlclasseditor/view/GraphView.java | 649 +++++++++--------- app/src/main/res/drawable/ic_add.xml | 5 + app/src/main/res/drawable/ic_cancel.xml | 5 + app/src/main/res/drawable/ic_check.xml | 5 + .../res/drawable/ic_create_new_folder.xml | 5 + app/src/main/res/drawable/ic_delete.xml | 5 + app/src/main/res/drawable/ic_export.xml | 5 + app/src/main/res/drawable/ic_folder_copy.xml | 6 + app/src/main/res/drawable/ic_help.xml | 5 + app/src/main/res/drawable/ic_import.xml | 5 + app/src/main/res/drawable/ic_merge.xml | 5 + app/src/main/res/drawable/ic_save.xml | 5 + .../res/drawable/new_class_locate_layout.xml | 9 + app/src/main/res/layout/activity_main.xml | 18 +- .../res/layout/fragment_attribute_editor.xml | 354 +++++----- .../main/res/layout/fragment_class_editor.xml | 204 +++--- app/src/main/res/layout/fragment_graph.xml | 185 +++-- .../res/layout/fragment_method_editor.xml | 338 ++++----- .../res/layout/fragment_parameter_editor.xml | 120 ++-- .../activity_main_navigation_view_menu.xml | 44 +- .../res/menu/activity_main_toolbar_menu.xml | 68 +- app/src/main/res/raw/help_pt_rBR_html.txt | 9 - app/src/main/res/values/styles.xml | 2 +- build.gradle | 6 +- gradle.properties | 3 +- gradle/wrapper/gradle-wrapper.jar | Bin 54329 -> 59536 bytes gradle/wrapper/gradle-wrapper.properties | 3 +- gradlew | 282 +++++--- gradlew.bat | 43 +- 35 files changed, 1677 insertions(+), 1413 deletions(-) create mode 100644 app/src/main/res/drawable/ic_add.xml create mode 100644 app/src/main/res/drawable/ic_cancel.xml create mode 100644 app/src/main/res/drawable/ic_check.xml create mode 100644 app/src/main/res/drawable/ic_create_new_folder.xml create mode 100644 app/src/main/res/drawable/ic_delete.xml create mode 100644 app/src/main/res/drawable/ic_export.xml create mode 100644 app/src/main/res/drawable/ic_folder_copy.xml create mode 100644 app/src/main/res/drawable/ic_help.xml create mode 100644 app/src/main/res/drawable/ic_import.xml create mode 100644 app/src/main/res/drawable/ic_merge.xml create mode 100644 app/src/main/res/drawable/ic_save.xml create mode 100644 app/src/main/res/drawable/new_class_locate_layout.xml delete mode 100644 app/src/main/res/raw/help_pt_rBR_html.txt diff --git a/app/build.gradle b/app/build.gradle index ea70d69..d12fe98 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 29 + compileSdkVersion 33 defaultConfig { applicationId "com.nathaniel.motus.umlclasseditor" - minSdkVersion 19 - targetSdkVersion 29 + minSdkVersion 21 + targetSdkVersion 33 versionCode 2 versionName "1.1" @@ -19,17 +19,20 @@ android { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + buildFeatures{ + viewBinding true + } } dependencies { - implementation fileTree(dir: "libs", include: ["*.jar"]) - implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation 'androidx.legacy:legacy-support-v4:1.0.0' - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test.ext:junit:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' - implementation 'com.google.android.material:material:1.2.1' + implementation 'com.google.android.material:material:1.7.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e329be2..4a9b95a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,7 +12,8 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> - + diff --git a/app/src/main/java/com/nathaniel/motus/umlclasseditor/controller/MainActivity.java b/app/src/main/java/com/nathaniel/motus/umlclasseditor/controller/MainActivity.java index 72e550c..2a716a8 100644 --- a/app/src/main/java/com/nathaniel/motus/umlclasseditor/controller/MainActivity.java +++ b/app/src/main/java/com/nathaniel/motus/umlclasseditor/controller/MainActivity.java @@ -1,7 +1,6 @@ package com.nathaniel.motus.umlclasseditor.controller; import android.Manifest; -import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -15,6 +14,7 @@ import android.util.SparseBooleanArray; import android.view.Menu; import android.view.MenuItem; +import android.view.View; import android.widget.AbsListView; import android.widget.ArrayAdapter; import android.widget.EditText; @@ -29,6 +29,7 @@ import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import androidx.appcompat.app.ActionBarDrawerToggle; +import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.core.view.GravityCompat; @@ -36,6 +37,7 @@ import androidx.drawerlayout.widget.DrawerLayout; import androidx.fragment.app.Fragment; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.navigation.NavigationView; import com.nathaniel.motus.umlclasseditor.R; import com.nathaniel.motus.umlclasseditor.model.TypeNameComparator; @@ -50,6 +52,8 @@ import com.nathaniel.motus.umlclasseditor.view.MethodEditorFragment; import com.nathaniel.motus.umlclasseditor.view.ParameterEditorFragment; +import org.w3c.dom.Text; + import java.io.File; import java.util.ArrayList; import java.util.Calendar; @@ -58,26 +62,28 @@ public class MainActivity extends AppCompatActivity implements FragmentObserver, GraphView.GraphViewObserver, - NavigationView.OnNavigationItemSelectedListener{ + NavigationView.OnNavigationItemSelectedListener { private UmlProject mProject; - private boolean mExpectingTouchLocation=false; - private Purpose mPurpose= FragmentObserver.Purpose.NONE; + private boolean mExpectingTouchLocation = false; + private Purpose mPurpose = FragmentObserver.Purpose.NONE; private Toolbar mToolbar; + private static Toolbar staticToolbar; private DrawerLayout mDrawerLayout; private NavigationView mNavigationView; private TextView mMenuHeaderProjectNameText; - private static boolean sWriteExternalStoragePermission =true; - private static boolean sReadExternalStoragePermission=true; - private static final int WRITE_EXTERNAL_STORAGE_INDEX=0; - private static final int READ_EXTERNAL_STORAGE_INDEX=1; + private static boolean sWriteExternalStoragePermission = true; + private static boolean sReadExternalStoragePermission = true; + private static final int WRITE_EXTERNAL_STORAGE_INDEX = 0; + private static final int READ_EXTERNAL_STORAGE_INDEX = 1; - private long mFirstBackPressedTime =0; - private static long DOUBLE_BACK_PRESSED_DELAY=2000; + private long mFirstBackPressedTime = 0; + private static long DOUBLE_BACK_PRESSED_DELAY = 2000; private OnBackPressedCallback mOnBackPressedCallback; + private AlertDialog dialog = null; -// ********************************************************************************************** + // ********************************************************************************************** // Fragments declaration // ********************************************************************************************** private GraphFragment mGraphFragment; @@ -86,22 +92,22 @@ public class MainActivity extends AppCompatActivity implements FragmentObserver, private MethodEditorFragment mMethodEditorFragment; private ParameterEditorFragment mParameterEditorFragment; - private static final String GRAPH_FRAGMENT_TAG="graphFragment"; - private static final String CLASS_EDITOR_FRAGMENT_TAG="classEditorFragment"; - private static final String ATTRIBUTE_EDITOR_FRAGMENT_TAG="attributeEditorFragment"; - private static final String METHOD_EDITOR_FRAGMENT_TAG="methodEditorFragment"; - private static final String PARAMETER_EDITOR_FRAGMENT_TAG="parameterEditorFragment"; + private static final String GRAPH_FRAGMENT_TAG = "graphFragment"; + private static final String CLASS_EDITOR_FRAGMENT_TAG = "classEditorFragment"; + private static final String ATTRIBUTE_EDITOR_FRAGMENT_TAG = "attributeEditorFragment"; + private static final String METHOD_EDITOR_FRAGMENT_TAG = "methodEditorFragment"; + private static final String PARAMETER_EDITOR_FRAGMENT_TAG = "parameterEditorFragment"; - private static final String SHARED_PREFERENCES_PROJECT_NAME="sharedPreferencesProjectName"; + private static final String SHARED_PREFERENCES_PROJECT_NAME = "sharedPreferencesProjectName"; - private static final int INTENT_CREATE_DOCUMENT_EXPORT_PROJECT =1000; - private static final int INTENT_OPEN_DOCUMENT_IMPORT_PROJECT =2000; - private static final int INTENT_CREATE_DOCUMENT_EXPORT_CUSTOM_TYPES=3000; - private static final int INTENT_OPEN_DOCUMENT_IMPORT_CUSTOM_TYPES=4000; + private static final int INTENT_CREATE_DOCUMENT_EXPORT_PROJECT = 1000; + private static final int INTENT_OPEN_DOCUMENT_IMPORT_PROJECT = 2000; + private static final int INTENT_CREATE_DOCUMENT_EXPORT_CUSTOM_TYPES = 3000; + private static final int INTENT_OPEN_DOCUMENT_IMPORT_CUSTOM_TYPES = 4000; - private static final int REQUEST_PERMISSION=5000; + private static final int REQUEST_PERMISSION = 5000; -// ********************************************************************************************** + // ********************************************************************************************** // Views declaration // ********************************************************************************************** private FrameLayout mMainActivityFrame; @@ -114,7 +120,7 @@ protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); //Instantiate views - mMainActivityFrame=findViewById(R.id.activity_main_frame); + mMainActivityFrame = findViewById(R.id.activity_main_frame); UmlType.clearUmlTypes(); UmlType.initializePrimitiveUmlTypes(this); @@ -130,8 +136,8 @@ protected void onCreate(Bundle savedInstanceState) { @Override public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.activity_main_toolbar_menu,menu); - MenuCompat.setGroupDividerEnabled(menu,true); + getMenuInflater().inflate(R.menu.activity_main_toolbar_menu, menu); + MenuCompat.setGroupDividerEnabled(menu, true); return super.onCreateOptionsMenu(menu); } @@ -139,9 +145,9 @@ public boolean onCreateOptionsMenu(Menu menu) { protected void onStart() { super.onStart(); - mGraphView=findViewById(R.id.graphview); + mGraphView = findViewById(R.id.graphview); mGraphView.setUmlProject(mProject); - Log.i("TEST","onStart"); + Log.i("TEST", "onStart"); } @Override @@ -149,11 +155,11 @@ protected void onDestroy() { super.onDestroy(); mProject.save(getApplicationContext()); - Log.i("TEST","save : project"); + Log.i("TEST", "save : project"); savePreferences(); Log.i("TEST", "save : preferences"); UmlType.saveCustomUmlTypes(this); - Log.i("TEST","save : custom types"); + Log.i("TEST", "save : custom types"); } @RequiresApi(api = Build.VERSION_CODES.M) @@ -168,22 +174,40 @@ protected void onResume() { // ********************************************************************************************** private void configureToolbar() { - mToolbar=findViewById(R.id.main_activity_toolbar); + mToolbar = findViewById(R.id.main_activity_toolbar); + staticToolbar = mToolbar; setSupportActionBar(mToolbar); } private void configureDrawerLayout() { - mDrawerLayout=findViewById(R.id.activity_main_drawer); + mDrawerLayout = findViewById(R.id.activity_main_drawer); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, mDrawerLayout, mToolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); mDrawerLayout.addDrawerListener(toggle); toggle.syncState(); } private void configureNavigationView() { - mNavigationView=findViewById(R.id.activity_main_navigation_view); - mMenuHeaderProjectNameText= mNavigationView.getHeaderView(0).findViewById(R.id.activity_main_navigation_view_header_project_name_text); + mNavigationView = findViewById(R.id.activity_main_navigation_view); + mMenuHeaderProjectNameText = mNavigationView.getHeaderView(0).findViewById(R.id.activity_main_navigation_view_header_project_name_text); updateNavigationView(); mNavigationView.setNavigationItemSelectedListener(this); + + // project name click listener + mMenuHeaderProjectNameText.setOnClickListener(v->{ + final EditText editText = new EditText(this); + String oldName = mProject.getName(); + editText.setText(mProject.getName()); + dialog = new MaterialAlertDialogBuilder(this) + .setTitle("Rename") + .setMessage("Enter new name :") + .setView(editText) + .setNegativeButton("CANCEL", (d, i) -> dialog.dismiss()) + .setPositiveButton("OK", (d, i) -> { + renameProject(oldName,editText.getText().toString()); + updateNavigationView(); + }) + .show(); + }); } private void updateNavigationView() { @@ -192,24 +216,24 @@ private void updateNavigationView() { private void savePreferences() { SharedPreferences preferences = getPreferences(MODE_PRIVATE); - SharedPreferences.Editor editor=preferences.edit(); - editor.putString(SHARED_PREFERENCES_PROJECT_NAME,mProject.getName()); + SharedPreferences.Editor editor = preferences.edit(); + editor.putString(SHARED_PREFERENCES_PROJECT_NAME, mProject.getName()); editor.apply(); } private void getPreferences() { - SharedPreferences preferences=getPreferences(MODE_PRIVATE); - String projectName=preferences.getString(SHARED_PREFERENCES_PROJECT_NAME,null); - Log.i("TEST","Loaded preferences"); + SharedPreferences preferences = getPreferences(MODE_PRIVATE); + String projectName = preferences.getString(SHARED_PREFERENCES_PROJECT_NAME, null); + Log.i("TEST", "Loaded preferences"); if (projectName != null) { mProject = UmlProject.load(getApplicationContext(), projectName); } else { - mProject=new UmlProject("NewProject",getApplicationContext()); + mProject = new UmlProject("NewProject", getApplicationContext()); } } private void createOnBackPressedCallback() { - mOnBackPressedCallback=new OnBackPressedCallback(true) { + mOnBackPressedCallback = new OnBackPressedCallback(true) { @Override public void handleOnBackPressed() { onBackButtonPressed(); @@ -218,41 +242,40 @@ public void handleOnBackPressed() { } private void setOnBackPressedCallback() { - this.getOnBackPressedDispatcher().addCallback(this,mOnBackPressedCallback); + this.getOnBackPressedDispatcher().addCallback(this, mOnBackPressedCallback); } private void onBackButtonPressed() { if (Calendar.getInstance().getTimeInMillis() - mFirstBackPressedTime > DOUBLE_BACK_PRESSED_DELAY) { - mFirstBackPressedTime=Calendar.getInstance().getTimeInMillis(); - Toast.makeText(this,"Press back again to leave",Toast.LENGTH_SHORT).show(); - }else + mFirstBackPressedTime = Calendar.getInstance().getTimeInMillis(); + Toast.makeText(this, "Press back again to leave", Toast.LENGTH_SHORT).show(); + } else finish(); } -// ********************************************************************************************** + // ********************************************************************************************** // Fragment management // ********************************************************************************************** - private void configureAndDisplayGraphFragment(int viewContainerId){ + private void configureAndDisplayGraphFragment(int viewContainerId) { //handle graph fragment // mGraphFragment=new GraphFragment(); - mGraphFragment=GraphFragment.newInstance(); + mGraphFragment = GraphFragment.newInstance(); getSupportFragmentManager().beginTransaction() - .replace(viewContainerId,mGraphFragment,GRAPH_FRAGMENT_TAG) + .replace(viewContainerId, mGraphFragment, GRAPH_FRAGMENT_TAG) .commitNow(); } - private void configureAndDisplayClassEditorFragment(int viewContainerId,float xLocation,float yLocation,int classOrder) { + private void configureAndDisplayClassEditorFragment(int viewContainerId, float xLocation, float yLocation, int classOrder) { //handle class editor fragment - if (mClassEditorFragment==null) { + if (mClassEditorFragment == null) { mClassEditorFragment = ClassEditorFragment.newInstance(xLocation, yLocation, classOrder); getSupportFragmentManager().beginTransaction() .hide(mGraphFragment) .add(viewContainerId, mClassEditorFragment, CLASS_EDITOR_FRAGMENT_TAG) .commitNow(); - } - else { + } else { mClassEditorFragment.updateClassEditorFragment(xLocation, yLocation, classOrder); getSupportFragmentManager().beginTransaction() .hide(mGraphFragment) @@ -261,7 +284,7 @@ private void configureAndDisplayClassEditorFragment(int viewContainerId,float xL } } - private void configureAndDisplayAttributeEditorFragment(int viewContainerId,int attributeOrder,int classOrder) { + private void configureAndDisplayAttributeEditorFragment(int viewContainerId, int attributeOrder, int classOrder) { if (mAttributeEditorFragment == null) { mAttributeEditorFragment = AttributeEditorFragment.newInstance(mClassEditorFragment.getTag(), attributeOrder, classOrder); @@ -270,15 +293,15 @@ private void configureAndDisplayAttributeEditorFragment(int viewContainerId,int .add(viewContainerId, mAttributeEditorFragment, ATTRIBUTE_EDITOR_FRAGMENT_TAG) .commitNow(); } else { - mAttributeEditorFragment.updateAttributeEditorFragment(attributeOrder,classOrder); + mAttributeEditorFragment.updateAttributeEditorFragment(attributeOrder, classOrder); getSupportFragmentManager().beginTransaction() .hide(mClassEditorFragment) .show(mAttributeEditorFragment) - .commitNow(); + .commitNow(); } } - private void configureAndDisplayMethodEditorFragment(int viewContainerId, int methodOrder,int classOrder) { + private void configureAndDisplayMethodEditorFragment(int viewContainerId, int methodOrder, int classOrder) { if (mMethodEditorFragment == null) { mMethodEditorFragment = MethodEditorFragment.newInstance(mClassEditorFragment.getTag(), methodOrder, classOrder); getSupportFragmentManager().beginTransaction() @@ -286,7 +309,7 @@ private void configureAndDisplayMethodEditorFragment(int viewContainerId, int me .add(viewContainerId, mMethodEditorFragment, METHOD_EDITOR_FRAGMENT_TAG) .commitNow(); } else { - mMethodEditorFragment.updateMethodEditorFragment(methodOrder,classOrder); + mMethodEditorFragment.updateMethodEditorFragment(methodOrder, classOrder); getSupportFragmentManager().beginTransaction() .hide(mClassEditorFragment) .show(mMethodEditorFragment) @@ -294,7 +317,7 @@ private void configureAndDisplayMethodEditorFragment(int viewContainerId, int me } } - private void configureAndDisplayParameterEditorFragment(int viewContainerId, int parameterOrder,int methodOrder,int classOrder) { + private void configureAndDisplayParameterEditorFragment(int viewContainerId, int parameterOrder, int methodOrder, int classOrder) { if (mParameterEditorFragment == null) { mParameterEditorFragment = ParameterEditorFragment.newInstance(mMethodEditorFragment.getTag(), parameterOrder, methodOrder, classOrder); getSupportFragmentManager().beginTransaction() @@ -302,7 +325,7 @@ private void configureAndDisplayParameterEditorFragment(int viewContainerId, int .add(viewContainerId, mParameterEditorFragment, PARAMETER_EDITOR_FRAGMENT_TAG) .commitNow(); } else { - mParameterEditorFragment.updateParameterEditorFragment(parameterOrder,methodOrder,classOrder); + mParameterEditorFragment.updateParameterEditorFragment(parameterOrder, methodOrder, classOrder); getSupportFragmentManager().beginTransaction() .hide(mMethodEditorFragment) .show(mParameterEditorFragment) @@ -326,7 +349,7 @@ public void setProject(UmlProject project) { @Override public void setPurpose(Purpose purpose) { - mPurpose=purpose; + mPurpose = purpose; } @Override @@ -366,18 +389,18 @@ public void closeParameterEditorFragment(Fragment fragment) { } @Override - public void openAttributeEditorFragment(int attributeOrder,int classOrder) { - configureAndDisplayAttributeEditorFragment(R.id.activity_main_frame,attributeOrder,classOrder); + public void openAttributeEditorFragment(int attributeOrder, int classOrder) { + configureAndDisplayAttributeEditorFragment(R.id.activity_main_frame, attributeOrder, classOrder); } @Override - public void openMethodEditorFragment(int methodOrder,int classOrder) { - configureAndDisplayMethodEditorFragment(R.id.activity_main_frame,methodOrder,classOrder); + public void openMethodEditorFragment(int methodOrder, int classOrder) { + configureAndDisplayMethodEditorFragment(R.id.activity_main_frame, methodOrder, classOrder); } @Override - public void openParameterEditorFragment(int parameterOrder,int methodOrder,int classOrder) { - configureAndDisplayParameterEditorFragment(R.id.activity_main_frame,parameterOrder,methodOrder,classOrder); + public void openParameterEditorFragment(int parameterOrder, int methodOrder, int classOrder) { + configureAndDisplayParameterEditorFragment(R.id.activity_main_frame, parameterOrder, methodOrder, classOrder); } @Override @@ -394,18 +417,18 @@ public boolean isExpectingTouchLocation() { @Override public void createClass(float xLocation, float yLocation) { - configureAndDisplayClassEditorFragment(R.id.activity_main_frame,xLocation,yLocation,-1); + configureAndDisplayClassEditorFragment(R.id.activity_main_frame, xLocation, yLocation, -1); } @Override public void editClass(UmlClass umlClass) { - configureAndDisplayClassEditorFragment(R.id.activity_main_frame,0,0,umlClass.getClassOrder()); + configureAndDisplayClassEditorFragment(R.id.activity_main_frame, 0, 0, umlClass.getClassOrder()); } @Override public void createRelation(UmlClass startClass, UmlClass endClass, UmlRelation.UmlRelationType relationType) { - if (!mProject.relationAlreadyExistsBetween(startClass,endClass)) - mProject.addUmlRelation(new UmlRelation(startClass,endClass,relationType)); + if (!mProject.relationAlreadyExistsBetween(startClass, endClass)) + mProject.addUmlRelation(new UmlRelation(startClass, endClass, relationType)); } // ********************************************************************************************** @@ -414,7 +437,7 @@ public void createRelation(UmlClass startClass, UmlClass endClass, UmlRelation.U @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { - int menuId=item.getItemId(); + int menuId = item.getItemId(); if (menuId == R.id.drawer_menu_new_project) { drawerMenuNewProject(); } else if (menuId == R.id.drawer_menu_load_project) { @@ -436,32 +459,13 @@ public boolean onNavigationItemSelected(@NonNull MenuItem item) { // ********************************************************************************************** private void drawerMenuSaveAs() { - AlertDialog.Builder builder=new AlertDialog.Builder(this); - final EditText editText=new EditText(this); - editText.setText(mProject.getName()); - builder.setTitle("Save as") - .setMessage("Enter new name :") - .setView(editText) - .setNegativeButton("CANCEL", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - - } - }) - .setPositiveButton("OK", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - saveAs(editText.getText().toString()); - } - }) - .create() - .show(); + saveAs(); } private void drawerMenuNewProject() { mProject.save(this); UmlType.clearProjectUmlTypes(); - mProject=new UmlProject("NewProject",this); + mProject = new UmlProject("NewProject", this); mGraphView.setUmlProject(mProject); updateNavigationView(); } @@ -469,118 +473,81 @@ private void drawerMenuNewProject() { private void drawerMenuLoadProject() { mProject.save(this); - final Spinner spinner=new Spinner(this); + final Spinner spinner = new Spinner(this); spinner.setAdapter(projectDirectoryAdapter()); - AlertDialog.Builder builder=new AlertDialog.Builder(this); - builder.setTitle("Load project") + dialog = new MaterialAlertDialogBuilder(this) + .setTitle("Load project") .setMessage("Choose project to load :") .setView(spinner) - .setNegativeButton("CANCEL", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - - } - }) - .setPositiveButton("OK", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - String fileName=spinner.getSelectedItem().toString(); - if (fileName!=null) { - UmlType.clearProjectUmlTypes(); - mProject = UmlProject.load(getApplicationContext(), fileName); - mGraphView.setUmlProject(mProject); - updateNavigationView(); - } + .setNegativeButton("CANCEL", (d, i) -> dialog.dismiss()) + .setPositiveButton("OK", (d, i) -> { + String fileName = spinner.getSelectedItem().toString(); + if (fileName != null) { + UmlType.clearProjectUmlTypes(); + mProject = UmlProject.load(getApplicationContext(), fileName); + mGraphView.setUmlProject(mProject); + updateNavigationView(); + dialog.dismiss(); } }) - .create() .show(); } private void drawerMenuDeleteProject() { - - final Context context=this; - - final Spinner spinner=new Spinner(this); + final Spinner spinner = new Spinner(this); spinner.setAdapter(projectDirectoryAdapter()); - - AlertDialog.Builder builder=new AlertDialog.Builder(this); - builder.setTitle("Delete project") + dialog = new MaterialAlertDialogBuilder(this) + .setTitle("Delete project") .setMessage("Choose project to delete :") .setView(spinner) - .setNegativeButton("CANCEL", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { + .setNegativeButton("Cancel", (dialogInterface, i) -> { - } }) - .setPositiveButton("OK", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - String fileName=spinner.getSelectedItem().toString(); - if (fileName!=null) { - File pathName=new File(getFilesDir(),UmlProject.PROJECT_DIRECTORY); - final File file=new File(pathName,fileName); - AlertDialog.Builder alert=new AlertDialog.Builder(context); - alert.setTitle("Delete Project") - .setMessage("Are you sure you want to delete "+fileName+" ?") - .setNegativeButton("NO", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - - } - }) - .setPositiveButton("YES", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - file.delete(); - } - }) - .create() - .show(); - } + .setPositiveButton("OK", (dialogInterface, i) -> { + String fileName = spinner.getSelectedItem().toString(); + if (fileName != null) { + File pathName = new File(getFilesDir(), UmlProject.PROJECT_DIRECTORY); + final File file = new File(pathName, fileName); + dialog = new MaterialAlertDialogBuilder(this) + .setTitle("Delete Project") + .setMessage("Are you sure you want to delete " + fileName + " ?") + .setNegativeButton("NO", (d, i12) -> dialog.dismiss()) + .setPositiveButton("YES", (d, i1) -> { + if(file.delete()) dialog.dismiss(); + }) + .show(); } }) - .create() .show(); } private void drawerMenuMerge() { - final Spinner spinner=new Spinner(this); + final Spinner spinner = new Spinner(this); spinner.setAdapter(projectDirectoryAdapter()); - final Context currentContext=this; - - AlertDialog.Builder builder=new AlertDialog.Builder(this); - builder.setTitle("Merge project") + new MaterialAlertDialogBuilder(this) + .setTitle("Merge project") .setMessage("Choose project to merge") .setView(spinner) - .setNegativeButton("CANCEL", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - - } + .setNegativeButton("Cancel", (d, i) -> { + d.dismiss(); }) - .setPositiveButton("OK", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - String fileName=spinner.getSelectedItem().toString(); - if (fileName!=null) { - UmlProject project = UmlProject.load(getApplicationContext(), fileName); - mProject.mergeWith(project); - mGraphView.invalidate(); - } - + .setPositiveButton("OK", (d, i) -> { + String fileName = spinner.getSelectedItem().toString(); + if (fileName != null) { + UmlProject project = UmlProject.load(getApplicationContext(), fileName); + mProject.mergeWith(project); + mGraphView.invalidate(); } + }) - .create() .show(); } private ArrayAdapter projectDirectoryAdapter() { //Create an array adapter to set a spinner with all project file names - ArrayAdapter adapter=new ArrayAdapter<>(this, android.R.layout.simple_spinner_item,IOUtils.sortedFiles(new File(getFilesDir(),UmlProject.PROJECT_DIRECTORY))); + ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, IOUtils.sortedFiles(new File(getFilesDir(), UmlProject.PROJECT_DIRECTORY))); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); return adapter; } @@ -592,7 +559,7 @@ private ArrayAdapter projectDirectoryAdapter() { public boolean onOptionsItemSelected(MenuItem menuItem) { int itemId = menuItem.getItemId(); if (itemId == R.id.toolbar_menu_export) { - if(sWriteExternalStoragePermission) + if (sWriteExternalStoragePermission) menuItemExport(); } else if (itemId == R.id.toolbar_menu_import) { if (sReadExternalStoragePermission) @@ -618,112 +585,92 @@ public boolean onOptionsItemSelected(MenuItem menuItem) { // ********************************************************************************************** private void menuItemExport() { - Intent intent=new Intent(Intent.ACTION_CREATE_DOCUMENT); + Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT); intent.setType("text/*"); startActivityForResult(intent, INTENT_CREATE_DOCUMENT_EXPORT_PROJECT); } private void menuItemImport() { - Intent intent=new Intent(Intent.ACTION_OPEN_DOCUMENT); + Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.setType("*/*"); startActivityForResult(intent, INTENT_OPEN_DOCUMENT_IMPORT_PROJECT); } private void menuCreateCustomType() { - final EditText editText=new EditText(this); - final Context context=getApplicationContext(); - AlertDialog.Builder adb=new AlertDialog.Builder(this); - adb.setTitle("Create custom type") + final EditText editText = new EditText(this); + final Context context = getApplicationContext(); + dialog = new MaterialAlertDialogBuilder(this) + .setTitle("Create custom type") .setMessage("Enter custom type name :") .setView(editText) - .setNegativeButton("CANCEL", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - + .setNegativeButton("Cancel", (d, i) -> dialog.dismiss()) + .setPositiveButton("Ok", (d, i) -> { + String typeName = editText.getText().toString(); + if (typeName.equals("")) + Toast.makeText(context, "Failed : name cannot be blank", Toast.LENGTH_SHORT).show(); + else if (UmlType.containsUmlTypeNamed(typeName)) + Toast.makeText(context, "Failed : this name is already used", Toast.LENGTH_SHORT).show(); + else { + UmlType.createUmlType(typeName, UmlType.TypeLevel.CUSTOM); + Toast.makeText(context, "Custom type created", Toast.LENGTH_SHORT).show(); + dialog.dismiss(); } }) - .setPositiveButton("OK", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - String typeName=editText.getText().toString(); - if (typeName.equals("")) - Toast.makeText(context,"Failed : name cannot be blank",Toast.LENGTH_SHORT).show(); - else if (UmlType.containsUmlTypeNamed(typeName)) - Toast.makeText(context,"Failed : this name is already used",Toast.LENGTH_SHORT).show(); - else{ - UmlType.createUmlType(typeName, UmlType.TypeLevel.CUSTOM); - Toast.makeText(context,"Custom type created",Toast.LENGTH_SHORT).show(); - } - } - }) - .create() .show(); } private void menuDeleteCustomTypes() { - final ListView listView=new ListView(this); - List listArray=new ArrayList<>(); - for (UmlType t:UmlType.getUmlTypes()) + final ListView listView = new ListView(this); + List listArray = new ArrayList<>(); + for (UmlType t : UmlType.getUmlTypes()) if (t.isCustomUmlType()) listArray.add(t.getName()); - Collections.sort(listArray,new TypeNameComparator()); - ArrayAdapter adapter=new ArrayAdapter<>(this, android.R.layout.simple_list_item_multiple_choice,listArray); + Collections.sort(listArray, new TypeNameComparator()); + ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_multiple_choice, listArray); listView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE); listView.setAdapter(adapter); - AlertDialog.Builder adb=new AlertDialog.Builder(this); - adb.setTitle("Delete custom types") - .setMessage("Check custom types to delete") + dialog = new MaterialAlertDialogBuilder(this) + .setTitle("Delete custom types") + .setMessage("Check custom types to delete\nCustom Types: "+listArray.size()+"\n") .setView(listView) - .setNegativeButton("CANCEL", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - - } - }) - .setPositiveButton("OK", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - SparseBooleanArray checkMapping=listView.getCheckedItemPositions(); - UmlType t; - for (int j = 0; j < checkMapping.size(); j++) { - if (checkMapping.valueAt(j)) { - t=UmlType.valueOf(listView.getItemAtPosition(checkMapping.keyAt(j)).toString(),UmlType.getUmlTypes()); - UmlType.removeUmlType(t); - mProject.removeParametersOfType(t); - mProject.removeMethodsOfType(t); - mProject.removeAttributesOfType(t); - mGraphView.invalidate(); - } + .setNegativeButton("CANCEL", (d, i) -> dialog.dismiss()) + .setPositiveButton("OK", (d, i) -> { + SparseBooleanArray checkMapping = listView.getCheckedItemPositions(); + UmlType t; + for (int j = 0; j < checkMapping.size(); j++) { + if (checkMapping.valueAt(j)) { + t = UmlType.valueOf(listView.getItemAtPosition(checkMapping.keyAt(j)).toString(), UmlType.getUmlTypes()); + UmlType.removeUmlType(t); + mProject.removeParametersOfType(t); + mProject.removeMethodsOfType(t); + mProject.removeAttributesOfType(t); + mGraphView.invalidate(); + dialog.dismiss(); } } }) - .create() .show(); } private void menuExportCustomTypes() { - Intent intent=new Intent(Intent.ACTION_CREATE_DOCUMENT); + Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT); intent.setType("text/*"); - startActivityForResult(intent,INTENT_CREATE_DOCUMENT_EXPORT_CUSTOM_TYPES); + startActivityForResult(intent, INTENT_CREATE_DOCUMENT_EXPORT_CUSTOM_TYPES); } private void menuImportCustomTypes() { - Intent intent=new Intent(Intent.ACTION_OPEN_DOCUMENT); + Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.setType("*/*"); - startActivityForResult(intent,INTENT_OPEN_DOCUMENT_IMPORT_CUSTOM_TYPES); + startActivityForResult(intent, INTENT_OPEN_DOCUMENT_IMPORT_CUSTOM_TYPES); } private void menuHelp() { - AlertDialog.Builder adb=new AlertDialog.Builder(this); - adb.setTitle("Help") - .setMessage(Html.fromHtml(IOUtils.readRawHtmlFile(this,R.raw.help_html))) - .setPositiveButton("OK", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - - } + new MaterialAlertDialogBuilder(this) + .setTitle("Help") + .setMessage(Html.fromHtml(IOUtils.readRawHtmlFile(this, R.raw.help_html))) + .setPositiveButton("OK", (dialog, which) -> { + dialog.dismiss(); }) - .create() .show(); } @@ -735,19 +682,19 @@ public void onClick(DialogInterface dialog, int which) { protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { if (requestCode == INTENT_CREATE_DOCUMENT_EXPORT_PROJECT && resultCode == RESULT_OK) { - Uri fileNameUri=data.getData(); - mProject.exportProject(this,fileNameUri); + Uri fileNameUri = data.getData(); + mProject.exportProject(this, fileNameUri); } else if (requestCode == INTENT_OPEN_DOCUMENT_IMPORT_PROJECT && resultCode == RESULT_OK) { - Uri fileNameUri=data.getData(); + Uri fileNameUri = data.getData(); UmlType.clearProjectUmlTypes(); - mProject=UmlProject.importProject(this,fileNameUri); + mProject = UmlProject.importProject(this, fileNameUri); mGraphView.setUmlProject(mProject); } else if (requestCode == INTENT_CREATE_DOCUMENT_EXPORT_CUSTOM_TYPES && resultCode == RESULT_OK) { - Uri fileNameUri=data.getData(); - UmlType.exportCustomUmlTypes(this,fileNameUri); + Uri fileNameUri = data.getData(); + UmlType.exportCustomUmlTypes(this, fileNameUri); } else if (requestCode == INTENT_OPEN_DOCUMENT_IMPORT_CUSTOM_TYPES && resultCode == RESULT_OK) { - Uri fileNameUri=data.getData(); - UmlType.importCustomUmlTypes(this,fileNameUri); + Uri fileNameUri = data.getData(); + UmlType.importCustomUmlTypes(this, fileNameUri); } super.onActivityResult(requestCode, resultCode, data); } @@ -755,25 +702,30 @@ protected void onActivityResult(int requestCode, int resultCode, @Nullable Inten @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); - if (requestCode == REQUEST_PERMISSION && grantResults[WRITE_EXTERNAL_STORAGE_INDEX]==PackageManager.PERMISSION_GRANTED) - sWriteExternalStoragePermission =true; + if (requestCode == REQUEST_PERMISSION && grantResults[WRITE_EXTERNAL_STORAGE_INDEX] == PackageManager.PERMISSION_GRANTED) + sWriteExternalStoragePermission = true; else - sWriteExternalStoragePermission =false; + sWriteExternalStoragePermission = false; - if (requestCode == REQUEST_PERMISSION && grantResults[READ_EXTERNAL_STORAGE_INDEX]==PackageManager.PERMISSION_GRANTED) - sReadExternalStoragePermission =true; + if (requestCode == REQUEST_PERMISSION && grantResults[READ_EXTERNAL_STORAGE_INDEX] == PackageManager.PERMISSION_GRANTED) + sReadExternalStoragePermission = true; else - sReadExternalStoragePermission =false; + sReadExternalStoragePermission = false; } // ********************************************************************************************** // Project management methods // ********************************************************************************************** - private void saveAs(String projectName) { - mProject.setName(projectName); + private void renameProject(String oldName,String newName){ + mProject.setName(newName); + mProject.rename(getApplicationContext(),oldName); + } + + private void saveAs() { updateNavigationView(); mProject.save(getApplicationContext()); + Toast.makeText(getApplicationContext(), "Project saved!", Toast.LENGTH_SHORT).show(); } // ********************************************************************************************** @@ -785,13 +737,17 @@ private void checkPermissions() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - String[] permissionString={Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE}; + String[] permissionString = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}; - if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED - || checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED) + if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED + || checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) requestPermissions(permissionString, REQUEST_PERMISSION); } } + public static void hideToolBar(boolean is_locate){ + staticToolbar.setVisibility(is_locate?View.GONE:View.VISIBLE); + } + } diff --git a/app/src/main/java/com/nathaniel/motus/umlclasseditor/model/UmlClass.java b/app/src/main/java/com/nathaniel/motus/umlclasseditor/model/UmlClass.java index 9d64f4c..3b44356 100644 --- a/app/src/main/java/com/nathaniel/motus/umlclasseditor/model/UmlClass.java +++ b/app/src/main/java/com/nathaniel/motus/umlclasseditor/model/UmlClass.java @@ -1,5 +1,7 @@ package com.nathaniel.motus.umlclasseditor.model; +import android.graphics.Paint; + import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -8,9 +10,9 @@ public class UmlClass extends UmlType { - public enum UmlClassType{JAVA_CLASS,ABSTRACT_CLASS,INTERFACE,ENUM} + public enum UmlClassType {JAVA_CLASS, ABSTRACT_CLASS, INTERFACE, ENUM} - private UmlClassType mUmlClassType=UmlClassType.JAVA_CLASS; + private UmlClassType mUmlClassType = UmlClassType.JAVA_CLASS; private ArrayList mAttributes; private int mUmlClassAttributeCount; private ArrayList mMethods; @@ -24,45 +26,48 @@ public enum UmlClassType{JAVA_CLASS,ABSTRACT_CLASS,INTERFACE,ENUM} private float mUmlClassNormalWidth; private float mUmlClassNormalHeight; - private static final String JSON_CLASS_NAME="ClassName"; - private static final String JSON_CLASS_INDEX="ClassIndex"; - private static final String JSON_CLASS_CLASS_TYPE="ClassClassType"; - private static final String JSON_CLASS_ATTRIBUTES="ClassAttributes"; - private static final String JSON_CLASS_METHODS="ClassMethods"; - private static final String JSON_CLASS_VALUES="ClassValues"; - private static final String JSON_CLASS_NORMAL_XPOS="ClassNormalXPos"; - private static final String JSON_CLASS_NORMAL_YPOS="ClassNormalYPos"; - private static final String JSON_CLASS_ATTRIBUTE_COUNT ="ClassAttributeCount"; - private static final String JSON_CLASS_METHOD_COUNT ="ClassMethodCount"; - private static final String JSON_CLASS_VALUE_COUNT ="ClassValueCount"; + private Paint mUmlClassHeaderPaint; + private int colorPaint; + + private static final String JSON_CLASS_NAME = "ClassName"; + private static final String JSON_CLASS_INDEX = "ClassIndex"; + private static final String JSON_CLASS_CLASS_TYPE = "ClassClassType"; + private static final String JSON_CLASS_ATTRIBUTES = "ClassAttributes"; + private static final String JSON_CLASS_METHODS = "ClassMethods"; + private static final String JSON_CLASS_VALUES = "ClassValues"; + private static final String JSON_CLASS_NORMAL_XPOS = "ClassNormalXPos"; + private static final String JSON_CLASS_NORMAL_YPOS = "ClassNormalYPos"; + private static final String JSON_CLASS_ATTRIBUTE_COUNT = "ClassAttributeCount"; + private static final String JSON_CLASS_METHOD_COUNT = "ClassMethodCount"; + private static final String JSON_CLASS_VALUE_COUNT = "ClassValueCount"; // ********************************************************************************************** // Constructors // ********************************************************************************************** public UmlClass(int classOrder) { - mAttributes=new ArrayList<>(); - mMethods=new ArrayList<>(); - mEnumValues=new ArrayList<>(); - mUmlClassAttributeCount=0; - mUmlClassMethodCount=0; - mValueCount=0; + mAttributes = new ArrayList<>(); + mMethods = new ArrayList<>(); + mEnumValues = new ArrayList<>(); + mUmlClassAttributeCount = 0; + mUmlClassMethodCount = 0; + mValueCount = 0; mClassOrder = classOrder; } public UmlClass(String name) { - this(name,UmlClassType.JAVA_CLASS); + this(name, UmlClassType.JAVA_CLASS); } public UmlClass(String name, UmlClassType umlClassType) { - super(name,TypeLevel.PROJECT); + super(name, TypeLevel.PROJECT); mUmlClassType = umlClassType; mAttributes = new ArrayList<>(); - mUmlClassAttributeCount =0; - mMethods =new ArrayList<>(); - mUmlClassMethodCount =0; - mEnumValues =new ArrayList<>(); - mValueCount =0; + mUmlClassAttributeCount = 0; + mMethods = new ArrayList<>(); + mUmlClassMethodCount = 0; + mEnumValues = new ArrayList<>(); + mValueCount = 0; } public UmlClass(String name, int classOrder, UmlClassType umlClassType, @@ -70,31 +75,32 @@ public UmlClass(String name, int classOrder, UmlClassType umlClassType, ArrayList methods, int methodCount, ArrayList values, int valueCount, float umlClassNormalXPos, float umlClassNormalYPos) { - super(name,TypeLevel.PROJECT); + super(name, TypeLevel.PROJECT); mClassOrder = classOrder; mUmlClassType = umlClassType; mAttributes = attributes; - mUmlClassAttributeCount =attributeCount; + mUmlClassAttributeCount = attributeCount; mMethods = methods; - mUmlClassMethodCount =methodCount; + mUmlClassMethodCount = methodCount; mEnumValues = values; - mValueCount =valueCount; + mValueCount = valueCount; mUmlClassNormalXPos = umlClassNormalXPos; mUmlClassNormalYPos = umlClassNormalYPos; } + public UmlClass(String name, UmlClassType umlClassType, ArrayList attributes, ArrayList methods, ArrayList values, float umlClassNormalXPos, float umlClassNormalYPos) { - super(name,TypeLevel.PROJECT); + super(name, TypeLevel.PROJECT); mUmlClassType = umlClassType; mAttributes = attributes; - mUmlClassAttributeCount =0; + mUmlClassAttributeCount = 0; mMethods = methods; - mUmlClassMethodCount =0; + mUmlClassMethodCount = 0; mEnumValues = values; - mValueCount =0; + mValueCount = 0; mUmlClassNormalXPos = umlClassNormalXPos; mUmlClassNormalYPos = umlClassNormalYPos; } @@ -157,11 +163,11 @@ public ArrayList getValues() { } public float getNormalRightEnd() { - return mUmlClassNormalXPos+mUmlClassNormalWidth; + return mUmlClassNormalXPos + mUmlClassNormalWidth; } public float getNormalBottomEnd() { - return mUmlClassNormalYPos+mUmlClassNormalHeight; + return mUmlClassNormalYPos + mUmlClassNormalHeight; } public void setAttributes(ArrayList attributes) { @@ -219,25 +225,25 @@ public void setClassOrder(int classOrder) { } public UmlClassAttribute findAttributeByOrder(int attributeOrder) { - for (UmlClassAttribute a:mAttributes) - if (a.getAttributeOrder()==attributeOrder) return a; + for (UmlClassAttribute a : mAttributes) + if (a.getAttributeOrder() == attributeOrder) return a; return null; } public UmlClassMethod findMethodByOrder(int methodOrder) { - for (UmlClassMethod m:mMethods) - if (m.getMethodOrder()==methodOrder) return m; - return null; + for (UmlClassMethod m : mMethods) + if (m.getMethodOrder() == methodOrder) return m; + return null; } public UmlEnumValue findValueByOrder(int valueOrder) { - for (UmlEnumValue v:mEnumValues) - if (v.getValueOrder()==valueOrder) return v; - return null; + for (UmlEnumValue v : mEnumValues) + if (v.getValueOrder() == valueOrder) return v; + return null; } public UmlClassAttribute getAttribute(String attributeName) { - for (UmlClassAttribute a:mAttributes) + for (UmlClassAttribute a : mAttributes) if (a.getName().equals(attributeName)) return a; return null; @@ -291,62 +297,62 @@ public void incrementValueCount() { // ********************************************************************************************** public boolean containsPoint(float absoluteX, float absoluteY) { - return (absoluteX<=mUmlClassNormalXPos+mUmlClassNormalWidth && + return (absoluteX <= mUmlClassNormalXPos + mUmlClassNormalWidth && absoluteX >= mUmlClassNormalXPos && - absoluteY<=mUmlClassNormalYPos+mUmlClassNormalHeight && - absoluteY>=mUmlClassNormalYPos); + absoluteY <= mUmlClassNormalYPos + mUmlClassNormalHeight && + absoluteY >= mUmlClassNormalYPos); } public boolean isSouthOf(UmlClass umlClass) { //is this in South quarter of umlClass ? - return (this.getUmlClassNormalYPos()>=umlClass.getNormalBottomEnd() && - this.getNormalRightEnd()>=umlClass.getUmlClassNormalXPos()-this.getUmlClassNormalYPos()+umlClass.getNormalBottomEnd() && - this.getUmlClassNormalXPos()<=umlClass.getNormalRightEnd()+this.getUmlClassNormalYPos()-umlClass.getNormalBottomEnd()); + return (this.getUmlClassNormalYPos() >= umlClass.getNormalBottomEnd() && + this.getNormalRightEnd() >= umlClass.getUmlClassNormalXPos() - this.getUmlClassNormalYPos() + umlClass.getNormalBottomEnd() && + this.getUmlClassNormalXPos() <= umlClass.getNormalRightEnd() + this.getUmlClassNormalYPos() - umlClass.getNormalBottomEnd()); } public boolean isNorthOf(UmlClass umlClass) { //is this in North quarter of umlClass ? - return (this.getNormalBottomEnd()<=umlClass.getUmlClassNormalYPos() && - this.getNormalRightEnd()>=umlClass.getUmlClassNormalXPos()-umlClass.getUmlClassNormalYPos()+this.getNormalBottomEnd() && - this.getUmlClassNormalXPos()<=umlClass.getNormalRightEnd()+umlClass.getUmlClassNormalYPos()-this.getNormalBottomEnd()); + return (this.getNormalBottomEnd() <= umlClass.getUmlClassNormalYPos() && + this.getNormalRightEnd() >= umlClass.getUmlClassNormalXPos() - umlClass.getUmlClassNormalYPos() + this.getNormalBottomEnd() && + this.getUmlClassNormalXPos() <= umlClass.getNormalRightEnd() + umlClass.getUmlClassNormalYPos() - this.getNormalBottomEnd()); } public boolean isWestOf(UmlClass umlClass) { //is this in West quarter of umlClass ? - return (this.getNormalRightEnd()<=umlClass.getUmlClassNormalXPos() && - this.getNormalBottomEnd()>=umlClass.getUmlClassNormalYPos()-umlClass.getUmlClassNormalXPos()+this.getNormalRightEnd() && - this.getUmlClassNormalYPos()<=umlClass.getNormalBottomEnd()+umlClass.getUmlClassNormalXPos()-this.getNormalRightEnd()); + return (this.getNormalRightEnd() <= umlClass.getUmlClassNormalXPos() && + this.getNormalBottomEnd() >= umlClass.getUmlClassNormalYPos() - umlClass.getUmlClassNormalXPos() + this.getNormalRightEnd() && + this.getUmlClassNormalYPos() <= umlClass.getNormalBottomEnd() + umlClass.getUmlClassNormalXPos() - this.getNormalRightEnd()); } public boolean isEastOf(UmlClass umlClass) { //is this in East Quarter of umlClass ? - return (this.getUmlClassNormalXPos()>=umlClass.getNormalRightEnd() && - this.getNormalBottomEnd()>=umlClass.getUmlClassNormalYPos()-this.getUmlClassNormalXPos()+umlClass.getNormalRightEnd() && - this.getUmlClassNormalYPos()<=umlClass.getNormalBottomEnd()+this.getUmlClassNormalXPos()-umlClass.getNormalRightEnd()); + return (this.getUmlClassNormalXPos() >= umlClass.getNormalRightEnd() && + this.getNormalBottomEnd() >= umlClass.getUmlClassNormalYPos() - this.getUmlClassNormalXPos() + umlClass.getNormalRightEnd() && + this.getUmlClassNormalYPos() <= umlClass.getNormalBottomEnd() + this.getUmlClassNormalXPos() - umlClass.getNormalRightEnd()); } public boolean isInvolvedInRelation(UmlRelation umlRelation) { - return (this==umlRelation.getRelationOriginClass()||this==umlRelation.getRelationEndClass()); + return (this == umlRelation.getRelationOriginClass() || this == umlRelation.getRelationEndClass()); } public boolean alreadyExists(UmlProject inProject) { //check whether class name already exists - for (UmlClass c:inProject.getUmlClasses()) + for (UmlClass c : inProject.getUmlClasses()) if (this.getName().equals(c.getName())) return true; return false; } public boolean containsAttributeNamed(String attributeName) { - for (UmlClassAttribute a:mAttributes) - if (a.getName()!=null && a.getName().equals(attributeName)) + for (UmlClassAttribute a : mAttributes) + if (a.getName() != null && a.getName().equals(attributeName)) return true; return false; } public boolean containsEquivalentMethodTo(UmlClassMethod method) { - for (UmlClassMethod m:mMethods) + for (UmlClassMethod m : mMethods) if (m.isEquivalentTo(method)) return true; return false; @@ -357,7 +363,7 @@ public boolean containsEquivalentMethodTo(UmlClassMethod method) { // ********************************************************************************************** public JSONObject toJSONObject() { - JSONObject jsonObject =new JSONObject(); + JSONObject jsonObject = new JSONObject(); try { jsonObject.put(JSON_CLASS_NAME, this.getName().toString()); @@ -394,7 +400,7 @@ public static void populateUmlClassFromJSONObject(JSONObject jsonObject, UmlProj //read a class JSONObject and populate the already created class try { - UmlClass umlClass=project.getUmlClass(jsonObject.getString(JSON_CLASS_NAME)); + UmlClass umlClass = project.getUmlClass(jsonObject.getString(JSON_CLASS_NAME)); umlClass.setClassOrder(jsonObject.getInt(JSON_CLASS_INDEX)); umlClass.setUmlClassType(UmlClassType.valueOf(jsonObject.getString(JSON_CLASS_CLASS_TYPE))); @@ -415,14 +421,14 @@ public static void populateUmlClassFromJSONObject(JSONObject jsonObject, UmlProj private JSONArray getAttributesToJSONArray() { JSONArray jsonArray = new JSONArray(); - for (UmlClassAttribute a: mAttributes) jsonArray.put(a.toJSONObject()); + for (UmlClassAttribute a : mAttributes) jsonArray.put(a.toJSONObject()); return jsonArray; } private static ArrayList getAttributesFromJSONArray(JSONArray jsonArray) { ArrayList umlClassAttributes = new ArrayList<>(); - JSONObject jsonAttribute=(JSONObject) jsonArray.remove(0); + JSONObject jsonAttribute = (JSONObject) jsonArray.remove(0); while (jsonAttribute != null) { umlClassAttributes.add(UmlClassAttribute.fromJSONObject(jsonAttribute)); jsonAttribute = (JSONObject) jsonArray.remove(0); @@ -431,40 +437,54 @@ private static ArrayList getAttributesFromJSONArray(JSONArray } private JSONArray getMethodsToJSONArray() { - JSONArray jsonArray=new JSONArray(); + JSONArray jsonArray = new JSONArray(); - for (UmlClassMethod m: mMethods) jsonArray.put(m.toJSONObject()); + for (UmlClassMethod m : mMethods) jsonArray.put(m.toJSONObject()); return jsonArray; } private static ArrayList getMethodsFromJSONArray(JSONArray jsonArray) { ArrayList umlClassMethods = new ArrayList<>(); - JSONObject jsonMethod=(JSONObject)jsonArray.remove(0); + JSONObject jsonMethod = (JSONObject) jsonArray.remove(0); while (jsonMethod != null) { umlClassMethods.add(UmlClassMethod.fromJSONObject(jsonMethod)); - jsonMethod=(JSONObject)jsonArray.remove(0); + jsonMethod = (JSONObject) jsonArray.remove(0); } return umlClassMethods; } private JSONArray getValuesToJSONArray() { - JSONArray jsonArray=new JSONArray(); + JSONArray jsonArray = new JSONArray(); - for (UmlEnumValue v: mEnumValues) jsonArray.put(v.toJSONObject()); + for (UmlEnumValue v : mEnumValues) jsonArray.put(v.toJSONObject()); return jsonArray; } private static ArrayList getValuesFromJSONArray(JSONArray jsonArray) { ArrayList values = new ArrayList<>(); - JSONObject jsonValue = (JSONObject)jsonArray.remove(0); + JSONObject jsonValue = (JSONObject) jsonArray.remove(0); while (jsonValue != null) { values.add(UmlEnumValue.fromJSONObject(jsonValue)); - jsonValue=(JSONObject) jsonArray.remove(0); + jsonValue = (JSONObject) jsonArray.remove(0); } return values; } + public Paint getmUmlClassHeaderPaint() { + return mUmlClassHeaderPaint; + } + + public void setmUmlClassHeaderPaint(Paint mUmlClassHeaderPaint) { + this.mUmlClassHeaderPaint = mUmlClassHeaderPaint; + } + + public int getColorPaint() { + return colorPaint; + } + public void setColorPaint(int colorPaint) { + this.colorPaint = colorPaint; + } } diff --git a/app/src/main/java/com/nathaniel/motus/umlclasseditor/model/UmlProject.java b/app/src/main/java/com/nathaniel/motus/umlclasseditor/model/UmlProject.java index 6b77be9..0144125 100644 --- a/app/src/main/java/com/nathaniel/motus/umlclasseditor/model/UmlProject.java +++ b/app/src/main/java/com/nathaniel/motus/umlclasseditor/model/UmlProject.java @@ -117,7 +117,7 @@ public void setUmlClassCount(int umlClassCount) { public UmlClass findClassByOrder(int classOrder) { for (UmlClass c:mUmlClasses) if (c.getClassOrder()==classOrder) return c; - return null; + return null; } // ********************************************************************************************** @@ -319,6 +319,13 @@ private static ArrayList getRelationsFromJSONArray(JSONArray jsonAr // Save and load project methods // ********************************************************************************************** + public void rename(Context context,String oldName){ + File destination=new File(context.getFilesDir(),PROJECT_DIRECTORY); + File source=new File(destination,oldName); + if(source.exists()) source.delete(); + + save(context); + } public void save(Context context) { File destination=new File(context.getFilesDir(),PROJECT_DIRECTORY); if (!destination.exists()) destination.mkdir(); diff --git a/app/src/main/java/com/nathaniel/motus/umlclasseditor/view/GraphFragment.java b/app/src/main/java/com/nathaniel/motus/umlclasseditor/view/GraphFragment.java index 257c434..b90b556 100644 --- a/app/src/main/java/com/nathaniel/motus/umlclasseditor/view/GraphFragment.java +++ b/app/src/main/java/com/nathaniel/motus/umlclasseditor/view/GraphFragment.java @@ -11,10 +11,12 @@ import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageButton; +import android.widget.LinearLayout; import android.widget.TextView; import com.nathaniel.motus.umlclasseditor.R; import com.nathaniel.motus.umlclasseditor.controller.FragmentObserver; +import com.nathaniel.motus.umlclasseditor.controller.MainActivity; import com.nathaniel.motus.umlclasseditor.model.UmlClass; import com.nathaniel.motus.umlclasseditor.model.UmlRelation; @@ -22,6 +24,7 @@ public class GraphFragment extends Fragment implements View.OnClickListener { private GraphView mGraphView; private TextView mGraphText; + private TextView mNewClassLayout; private ImageButton mInheritanceButton; private ImageButton mRealizationButton; private ImageButton mAggregationButton; @@ -30,6 +33,7 @@ public class GraphFragment extends Fragment implements View.OnClickListener { private ImageButton mDependancyButton; private ImageButton mCompositionButton; private Button mNewClassButton; + private LinearLayout optionsLayout; private boolean mExpectingTouchLocation =false; private boolean mExpectingStartClass=false; @@ -188,6 +192,9 @@ private void configureViews() { mNewClassButton=getActivity().findViewById(R.id.new_class_button); mNewClassButton.setTag(NEW_CLASS_BUTTON_TAG); mNewClassButton.setOnClickListener(this); + + mNewClassLayout = getActivity().findViewById(R.id.locateNewClassLayout); + optionsLayout = getActivity().findViewById(R.id.optionsLayout); } private void createCallbackToParentActivity() { @@ -204,6 +211,7 @@ public void setPrompt(String prompt) { public void clearPrompt() { mGraphText.setText(""); + toggleLocateClass(false); } // ********************************************************************************************** @@ -220,6 +228,7 @@ public void onClick(View v) { case NEW_CLASS_BUTTON_TAG: this.setExpectingTouchLocation(true); this.setPrompt("Locate the new class"); + toggleLocateClass(true); break; case INHERITANCE_BUTTON_TAG: @@ -270,4 +279,11 @@ private void clearInput() { clearPrompt(); } + public void toggleLocateClass(boolean is_locate){ + MainActivity.hideToolBar(is_locate); + optionsLayout.setVisibility(is_locate?View.GONE:View.VISIBLE); + mNewClassLayout.setVisibility(is_locate?View.VISIBLE:View.GONE); + mNewClassLayout.setText(mGraphText.getText()); + } + } \ No newline at end of file diff --git a/app/src/main/java/com/nathaniel/motus/umlclasseditor/view/GraphView.java b/app/src/main/java/com/nathaniel/motus/umlclasseditor/view/GraphView.java index 6c4aefd..3606ae7 100644 --- a/app/src/main/java/com/nathaniel/motus/umlclasseditor/view/GraphView.java +++ b/app/src/main/java/com/nathaniel/motus/umlclasseditor/view/GraphView.java @@ -11,12 +11,12 @@ import android.graphics.Path; import android.graphics.Typeface; import android.util.AttributeSet; -import android.util.Log; import android.view.MotionEvent; import android.view.View; import androidx.annotation.Nullable; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.nathaniel.motus.umlclasseditor.R; import com.nathaniel.motus.umlclasseditor.model.UmlClass; import com.nathaniel.motus.umlclasseditor.model.UmlClassAttribute; @@ -25,9 +25,11 @@ import com.nathaniel.motus.umlclasseditor.model.UmlProject; import com.nathaniel.motus.umlclasseditor.model.UmlRelation; -public class GraphView extends View implements View.OnTouchListener{ +import java.util.Random; - enum TouchMode{DRAG,ZOOM} +public class GraphView extends View implements View.OnTouchListener { + + enum TouchMode {DRAG, ZOOM} private GraphFragment mGraphFragment; private float mZoom; @@ -38,7 +40,7 @@ enum TouchMode{DRAG,ZOOM} private float mLastTouchY; private float mOldDist; private float mNewDist; - private TouchMode mTouchMode=TouchMode.DRAG; + private TouchMode mTouchMode = TouchMode.DRAG; private int mPrimaryPointerIndex; private float mXMidPoint; private float mYMidpoint; @@ -51,23 +53,28 @@ enum TouchMode{DRAG,ZOOM} private Paint dashPaint; private Paint solidBlackPaint; private Paint solidWhitePaint; + + private Paint headerTextPaint; + + private boolean isBoxSelected = false; + private UmlClass mMovingClass; private GraphViewObserver mCallback; private long mActionDownEventTime; - private long mFirstClickTime=0; - private static final long CLICK_DELAY=200; - private static final long DOUBLE_CLICK_DELAY=500; - private static final float DOUBLE_CLICK_DISTANCE_MAX=10; - private float mFirstClickX=0; - private float mFirstClickY=0; + private long mFirstClickTime = 0; + private static final long CLICK_DELAY = 200; + private static final long DOUBLE_CLICK_DELAY = 500; + private static final float DOUBLE_CLICK_DISTANCE_MAX = 10; + private float mFirstClickX = 0; + private float mFirstClickY = 0; // ********************************************************************************************** // Standard drawing dimensions (in dp) // ********************************************************************************************** - private static final float FONT_SIZE=20; - private static final float INTERLINE=10; - private static final float ARROW_SIZE=10; + private static final float FONT_SIZE = 20; + private static final float INTERLINE = 10; + private static final float ARROW_SIZE = 10; // ********************************************************************************************** @@ -76,12 +83,12 @@ enum TouchMode{DRAG,ZOOM} public GraphView(Context context) { super(context); - init(-1,-1,-1); + init(-1, -1, -1); } public GraphView(Context context, float zoom, int xOffset, int yOffset) { super(context); - init(zoom,xOffset,yOffset); + init(zoom, xOffset, yOffset); } public GraphView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { @@ -95,70 +102,76 @@ public GraphView(Context context, @Nullable AttributeSet attrs) { } private void init(float zoom, int xOffset, int yOffset) { - if (zoom!=-1) - mZoom=zoom; + if (zoom != -1) + mZoom = zoom; else - mZoom=1; + mZoom = 1; - if (xOffset!=-1) - mXOffset=xOffset; + if (xOffset != -1) + mXOffset = xOffset; else - mXOffset=0; + mXOffset = 0; - if (yOffset!=-1) - mYOffset=yOffset; + if (yOffset != -1) + mYOffset = yOffset; else - mYOffset=0; + mYOffset = 0; - plainTextPaint =new Paint(); + plainTextPaint = new Paint(); plainTextPaint.setColor(Color.DKGRAY); - italicTextPaint=new Paint(); + italicTextPaint = new Paint(); italicTextPaint.setColor(Color.DKGRAY); italicTextPaint.setTypeface(Typeface.defaultFromStyle(Typeface.ITALIC)); - underlinedTextPaint=new Paint(); + underlinedTextPaint = new Paint(); underlinedTextPaint.setColor(Color.DKGRAY); underlinedTextPaint.setFlags(Paint.UNDERLINE_TEXT_FLAG); - linePaint =new Paint(); + linePaint = new Paint(); linePaint.setColor(Color.DKGRAY); linePaint.setStyle(Paint.Style.STROKE); - dashPaint=new Paint(); + dashPaint = new Paint(); dashPaint.setColor(Color.DKGRAY); dashPaint.setStyle(Paint.Style.STROKE); - dashPaint.setPathEffect(new DashPathEffect(new float[]{10f,10f},0)); + dashPaint.setPathEffect(new DashPathEffect(new float[]{10f, 10f}, 0)); - solidBlackPaint=new Paint(); + solidBlackPaint = new Paint(); solidBlackPaint.setColor(Color.DKGRAY); solidBlackPaint.setStyle(Paint.Style.FILL_AND_STROKE); - solidWhitePaint=new Paint(); + solidWhitePaint = new Paint(); solidWhitePaint.setColor(Color.WHITE); solidWhitePaint.setStyle(Paint.Style.FILL); + headerTextPaint = new Paint(); + headerTextPaint.setColor(Color.WHITE); + setOnTouchListener(this); createCallbackToParentActivity(); } private void init(AttributeSet attrs) { - TypedArray attr=getContext().obtainStyledAttributes(attrs, R.styleable.GraphView); - float zoom=attr.getFloat(R.styleable.GraphView_zoom,-1); - int xOffset=attr.getInt(R.styleable.GraphView_xOffset,-1); - int yOffset=attr.getInt(R.styleable.GraphView_yOffset,-1); + TypedArray attr = getContext().obtainStyledAttributes(attrs, R.styleable.GraphView); + float zoom = attr.getFloat(R.styleable.GraphView_zoom, -1); + int xOffset = attr.getInt(R.styleable.GraphView_xOffset, -1); + int yOffset = attr.getInt(R.styleable.GraphView_yOffset, -1); - init(zoom,xOffset,yOffset); + init(zoom, xOffset, yOffset); } // ********************************************************************************************** // Callback interface // ********************************************************************************************** - public interface GraphViewObserver{ + public interface GraphViewObserver { public boolean isExpectingTouchLocation(); + public void createClass(float xLocation, float yLocation); + public void editClass(UmlClass umlClass); + public void createRelation(UmlClass startClass, UmlClass endClass, UmlRelation.UmlRelationType relationType); } @@ -168,9 +181,9 @@ public interface GraphViewObserver{ public void setUmlProject(UmlProject umlProject) { mUmlProject = umlProject; - mZoom=mUmlProject.getZoom(); - mXOffset=mUmlProject.getXOffset(); - mYOffset=mUmlProject.getYOffset(); + mZoom = mUmlProject.getZoom(); + mXOffset = mUmlProject.getXOffset(); + mYOffset = mUmlProject.getYOffset(); this.invalidate(); } @@ -211,18 +224,21 @@ protected void onDraw(Canvas canvas) { // Drawing methods // ********************************************************************************************** - public void drawUmlClass(Canvas canvas,UmlClass umlClass) { + public void drawUmlClass(Canvas canvas, UmlClass umlClass) { + + plainTextPaint.setTextSize(FONT_SIZE * mZoom); + italicTextPaint.setTextSize(FONT_SIZE * mZoom); + underlinedTextPaint.setTextSize(FONT_SIZE * mZoom); - plainTextPaint.setTextSize(FONT_SIZE*mZoom); - italicTextPaint.setTextSize(FONT_SIZE*mZoom); - underlinedTextPaint.setTextSize(FONT_SIZE*mZoom); + // for header text + headerTextPaint.setTextSize(FONT_SIZE * mZoom); //Update class dimensions updateUmlClassNormalDimensions(umlClass); - drawUmlClassHeader(canvas,umlClass); - if (umlClass.getUmlClassType()== UmlClass.UmlClassType.ENUM) - drawValueBox(canvas,umlClass); + drawUmlClassHeader(canvas, umlClass); + if (umlClass.getUmlClassType() == UmlClass.UmlClassType.ENUM) + drawValueBox(canvas, umlClass); else { drawAttributeBox(canvas, umlClass); drawMethodBox(canvas, umlClass); @@ -230,180 +246,191 @@ public void drawUmlClass(Canvas canvas,UmlClass umlClass) { } private void drawUmlClassHeader(Canvas canvas, UmlClass umlClass) { + if (umlClass.getmUmlClassHeaderPaint() == null) { + int randColor = Color.rgb(new Random().nextInt(128), new Random().nextInt(128), new Random().nextInt(128)); + Paint paint = new Paint(); + paint.setColor(randColor); + paint.setStyle(Paint.Style.FILL); + + umlClass.setmUmlClassHeaderPaint(paint); + umlClass.setColorPaint(paint.getColor()); + } + canvas.drawRect(visibleX(umlClass.getUmlClassNormalXPos()), visibleY(umlClass.getUmlClassNormalYPos()), - visibleX(umlClass.getUmlClassNormalXPos()+umlClass.getUmlClassNormalWidth()), - visibleY(umlClass.getUmlClassNormalYPos()+getClassHeaderNormalHeight(umlClass)), - linePaint); + visibleX(umlClass.getUmlClassNormalXPos() + umlClass.getUmlClassNormalWidth()), + visibleY(umlClass.getUmlClassNormalYPos() + getClassHeaderNormalHeight(umlClass)), + umlClass.getmUmlClassHeaderPaint()); switch (umlClass.getUmlClassType()) { case INTERFACE: canvas.drawText("<< Interface >>", - visibleX(umlClass.getUmlClassNormalXPos()+(umlClass.getUmlClassNormalWidth()-getTextNormalWidth("<< Interface >>"))/2), - visibleY(umlClass.getUmlClassNormalYPos()+FONT_SIZE+INTERLINE), - plainTextPaint); + visibleX(umlClass.getUmlClassNormalXPos() + (umlClass.getUmlClassNormalWidth() - getTextNormalWidth("<< Interface >>")) / 2), + visibleY(umlClass.getUmlClassNormalYPos() + FONT_SIZE + INTERLINE), + headerTextPaint); canvas.drawText(umlClass.getName(), - visibleX(umlClass.getUmlClassNormalXPos()+(umlClass.getUmlClassNormalWidth()-getTextNormalWidth(umlClass.getName()))/2), - visibleY(umlClass.getUmlClassNormalYPos()+FONT_SIZE*2+INTERLINE*2), - plainTextPaint); + visibleX(umlClass.getUmlClassNormalXPos() + (umlClass.getUmlClassNormalWidth() - getTextNormalWidth(umlClass.getName())) / 2), + visibleY(umlClass.getUmlClassNormalYPos() + FONT_SIZE * 2 + INTERLINE * 2), + headerTextPaint); break; case ABSTRACT_CLASS: + headerTextPaint.setTypeface(Typeface.defaultFromStyle(Typeface.ITALIC)); canvas.drawText(umlClass.getName(), - visibleX(umlClass.getUmlClassNormalXPos()+(umlClass.getUmlClassNormalWidth()-getTextNormalWidth(umlClass.getName()))/2), - visibleY(umlClass.getUmlClassNormalYPos()+FONT_SIZE+INTERLINE), - italicTextPaint); + visibleX(umlClass.getUmlClassNormalXPos() + (umlClass.getUmlClassNormalWidth() - getTextNormalWidth(umlClass.getName())) / 2), + visibleY(umlClass.getUmlClassNormalYPos() + FONT_SIZE + INTERLINE), + headerTextPaint); break; default: canvas.drawText(umlClass.getName(), - visibleX(umlClass.getUmlClassNormalXPos()+(umlClass.getUmlClassNormalWidth()-getTextNormalWidth(umlClass.getName()))/2), - visibleY(umlClass.getUmlClassNormalYPos()+FONT_SIZE+INTERLINE), - plainTextPaint); + visibleX(umlClass.getUmlClassNormalXPos() + (umlClass.getUmlClassNormalWidth() - getTextNormalWidth(umlClass.getName())) / 2), + visibleY(umlClass.getUmlClassNormalYPos() + FONT_SIZE + INTERLINE), + headerTextPaint); } } private void drawAttributeBox(Canvas canvas, UmlClass umlClass) { canvas.drawRect(visibleX(umlClass.getUmlClassNormalXPos()), - visibleY(umlClass.getUmlClassNormalYPos()+getClassHeaderNormalHeight(umlClass)), - visibleX(umlClass.getUmlClassNormalXPos()+umlClass.getUmlClassNormalWidth()), - visibleY(umlClass.getUmlClassNormalYPos()+getClassHeaderNormalHeight(umlClass)+getAttributeBoxNormalHeight(umlClass)), + visibleY(umlClass.getUmlClassNormalYPos() + getClassHeaderNormalHeight(umlClass)), + visibleX(umlClass.getUmlClassNormalXPos() + umlClass.getUmlClassNormalWidth()), + visibleY(umlClass.getUmlClassNormalYPos() + getClassHeaderNormalHeight(umlClass) + getAttributeBoxNormalHeight(umlClass)), linePaint); - float currentY=umlClass.getUmlClassNormalYPos()+getClassHeaderNormalHeight(umlClass)+INTERLINE+FONT_SIZE; + float currentY = umlClass.getUmlClassNormalYPos() + getClassHeaderNormalHeight(umlClass) + INTERLINE + FONT_SIZE; for (UmlClassAttribute a : umlClass.getAttributes()) { if (a.isStatic()) canvas.drawText(a.getAttributeCompleteString(), - visibleX(umlClass.getUmlClassNormalXPos()+INTERLINE), + visibleX(umlClass.getUmlClassNormalXPos() + INTERLINE), visibleY(currentY), underlinedTextPaint); else canvas.drawText(a.getAttributeCompleteString(), - visibleX(umlClass.getUmlClassNormalXPos()+INTERLINE), + visibleX(umlClass.getUmlClassNormalXPos() + INTERLINE), visibleY(currentY), plainTextPaint); - currentY=currentY+FONT_SIZE+INTERLINE; + currentY = currentY + FONT_SIZE + INTERLINE; } } private void drawMethodBox(Canvas canvas, UmlClass umlClass) { canvas.drawRect(visibleX(umlClass.getUmlClassNormalXPos()), - visibleY(umlClass.getUmlClassNormalYPos()+getClassHeaderNormalHeight(umlClass)+getAttributeBoxNormalHeight(umlClass)), - visibleX(umlClass.getUmlClassNormalXPos()+umlClass.getUmlClassNormalWidth()), - visibleY(umlClass.getUmlClassNormalYPos()+getClassHeaderNormalHeight(umlClass)+getAttributeBoxNormalHeight(umlClass)+getMethodBoxNormalHeight(umlClass)), + visibleY(umlClass.getUmlClassNormalYPos() + getClassHeaderNormalHeight(umlClass) + getAttributeBoxNormalHeight(umlClass)), + visibleX(umlClass.getUmlClassNormalXPos() + umlClass.getUmlClassNormalWidth()), + visibleY(umlClass.getUmlClassNormalYPos() + getClassHeaderNormalHeight(umlClass) + getAttributeBoxNormalHeight(umlClass) + getMethodBoxNormalHeight(umlClass)), linePaint); - float currentY=umlClass.getUmlClassNormalYPos()+getClassHeaderNormalHeight(umlClass)+getAttributeBoxNormalHeight(umlClass)+INTERLINE+FONT_SIZE; + float currentY = umlClass.getUmlClassNormalYPos() + getClassHeaderNormalHeight(umlClass) + getAttributeBoxNormalHeight(umlClass) + INTERLINE + FONT_SIZE; for (UmlClassMethod m : umlClass.getMethods()) { if (m.isStatic()) canvas.drawText(m.getMethodCompleteString(), - visibleX(umlClass.getUmlClassNormalXPos()+INTERLINE), + visibleX(umlClass.getUmlClassNormalXPos() + INTERLINE), visibleY(currentY), underlinedTextPaint); else canvas.drawText(m.getMethodCompleteString(), - visibleX(umlClass.getUmlClassNormalXPos()+INTERLINE), + visibleX(umlClass.getUmlClassNormalXPos() + INTERLINE), visibleY(currentY), plainTextPaint); - currentY=currentY+FONT_SIZE+INTERLINE; + currentY = currentY + FONT_SIZE + INTERLINE; } } private void drawValueBox(Canvas canvas, UmlClass umlClass) { canvas.drawRect(visibleX(umlClass.getUmlClassNormalXPos()), - visibleY(umlClass.getUmlClassNormalYPos()+getClassHeaderNormalHeight(umlClass)), - visibleX(umlClass.getUmlClassNormalXPos()+umlClass.getUmlClassNormalWidth()), - visibleY(umlClass.getUmlClassNormalYPos()+getClassHeaderNormalHeight(umlClass)+getValueBoxNormalHeight(umlClass)), + visibleY(umlClass.getUmlClassNormalYPos() + getClassHeaderNormalHeight(umlClass)), + visibleX(umlClass.getUmlClassNormalXPos() + umlClass.getUmlClassNormalWidth()), + visibleY(umlClass.getUmlClassNormalYPos() + getClassHeaderNormalHeight(umlClass) + getValueBoxNormalHeight(umlClass)), linePaint); - float currentY=umlClass.getUmlClassNormalYPos()+getClassHeaderNormalHeight(umlClass)+INTERLINE+FONT_SIZE; + float currentY = umlClass.getUmlClassNormalYPos() + getClassHeaderNormalHeight(umlClass) + INTERLINE + FONT_SIZE; for (UmlEnumValue v : umlClass.getValues()) { canvas.drawText(v.getName(), - visibleX(umlClass.getUmlClassNormalXPos()+INTERLINE), + visibleX(umlClass.getUmlClassNormalXPos() + INTERLINE), visibleY(currentY), plainTextPaint); - currentY=currentY+FONT_SIZE+INTERLINE; + currentY = currentY + FONT_SIZE + INTERLINE; } } - private void drawRelation(Canvas canvas,UmlRelation umlRelation) { + private void drawRelation(Canvas canvas, UmlRelation umlRelation) { - float originAbsoluteLeft=umlRelation.getRelationOriginClass().getUmlClassNormalXPos(); - float originAbsoluteRight=umlRelation.getRelationOriginClass().getNormalRightEnd(); - float originAbsoluteTop=umlRelation.getRelationOriginClass().getUmlClassNormalYPos(); - float originAbsoluteBottom=umlRelation.getRelationOriginClass().getNormalBottomEnd(); - float endAbsoluteLeft=umlRelation.getRelationEndClass().getUmlClassNormalXPos(); - float endAbsoluteRight=umlRelation.getRelationEndClass().getNormalRightEnd(); - float endAbsoluteTop=umlRelation.getRelationEndClass().getUmlClassNormalYPos(); - float endAbsoluteBottom=umlRelation.getRelationEndClass().getNormalBottomEnd(); - float absoluteXOrigin=0; - float absoluteYOrigin=0; - float absoluteXEnd=0; - float absoluteYEnd=0; + float originAbsoluteLeft = umlRelation.getRelationOriginClass().getUmlClassNormalXPos(); + float originAbsoluteRight = umlRelation.getRelationOriginClass().getNormalRightEnd(); + float originAbsoluteTop = umlRelation.getRelationOriginClass().getUmlClassNormalYPos(); + float originAbsoluteBottom = umlRelation.getRelationOriginClass().getNormalBottomEnd(); + float endAbsoluteLeft = umlRelation.getRelationEndClass().getUmlClassNormalXPos(); + float endAbsoluteRight = umlRelation.getRelationEndClass().getNormalRightEnd(); + float endAbsoluteTop = umlRelation.getRelationEndClass().getUmlClassNormalYPos(); + float endAbsoluteBottom = umlRelation.getRelationEndClass().getNormalBottomEnd(); + float absoluteXOrigin = 0; + float absoluteYOrigin = 0; + float absoluteXEnd = 0; + float absoluteYEnd = 0; //End in South quarter of Origin if (umlRelation.getRelationEndClass().isSouthOf(umlRelation.getRelationOriginClass())) { - float lowerXLimit= originAbsoluteLeft-endAbsoluteTop+originAbsoluteBottom-umlRelation.getRelationEndClass().getUmlClassNormalWidth(); - float upperXLimit=originAbsoluteRight+endAbsoluteTop-originAbsoluteBottom; + float lowerXLimit = originAbsoluteLeft - endAbsoluteTop + originAbsoluteBottom - umlRelation.getRelationEndClass().getUmlClassNormalWidth(); + float upperXLimit = originAbsoluteRight + endAbsoluteTop - originAbsoluteBottom; - absoluteXEnd=endAbsoluteRight- - umlRelation.getRelationEndClass().getUmlClassNormalWidth()/(upperXLimit-lowerXLimit)* - (endAbsoluteLeft-lowerXLimit); - absoluteYEnd=endAbsoluteTop; + absoluteXEnd = endAbsoluteRight - + umlRelation.getRelationEndClass().getUmlClassNormalWidth() / (upperXLimit - lowerXLimit) * + (endAbsoluteLeft - lowerXLimit); + absoluteYEnd = endAbsoluteTop; - absoluteXOrigin=originAbsoluteLeft+ - umlRelation.getRelationOriginClass().getUmlClassNormalWidth()/(upperXLimit-lowerXLimit)* - (endAbsoluteLeft-lowerXLimit); + absoluteXOrigin = originAbsoluteLeft + + umlRelation.getRelationOriginClass().getUmlClassNormalWidth() / (upperXLimit - lowerXLimit) * + (endAbsoluteLeft - lowerXLimit); - absoluteYOrigin=originAbsoluteBottom; + absoluteYOrigin = originAbsoluteBottom; } //End in North quarter or Origin if (umlRelation.getRelationEndClass().isNorthOf(umlRelation.getRelationOriginClass())) { - float lowerXLimit=originAbsoluteLeft-originAbsoluteTop+endAbsoluteBottom-umlRelation.getRelationEndClass().getUmlClassNormalWidth(); - float upperXLimit=originAbsoluteRight+originAbsoluteTop-endAbsoluteBottom; + float lowerXLimit = originAbsoluteLeft - originAbsoluteTop + endAbsoluteBottom - umlRelation.getRelationEndClass().getUmlClassNormalWidth(); + float upperXLimit = originAbsoluteRight + originAbsoluteTop - endAbsoluteBottom; - absoluteXEnd=endAbsoluteRight- - umlRelation.getRelationEndClass().getUmlClassNormalWidth()/(upperXLimit-lowerXLimit)* - (endAbsoluteLeft-lowerXLimit); + absoluteXEnd = endAbsoluteRight - + umlRelation.getRelationEndClass().getUmlClassNormalWidth() / (upperXLimit - lowerXLimit) * + (endAbsoluteLeft - lowerXLimit); - absoluteYEnd=endAbsoluteBottom; + absoluteYEnd = endAbsoluteBottom; - absoluteXOrigin=originAbsoluteLeft+ - umlRelation.getRelationOriginClass().getUmlClassNormalWidth()/(upperXLimit-lowerXLimit)* - (endAbsoluteLeft-lowerXLimit); + absoluteXOrigin = originAbsoluteLeft + + umlRelation.getRelationOriginClass().getUmlClassNormalWidth() / (upperXLimit - lowerXLimit) * + (endAbsoluteLeft - lowerXLimit); - absoluteYOrigin=originAbsoluteTop; + absoluteYOrigin = originAbsoluteTop; } //End in West quarter of Origin if (umlRelation.getRelationEndClass().isWestOf(umlRelation.getRelationOriginClass())) { - float lowerYLimit=originAbsoluteTop-originAbsoluteLeft+endAbsoluteRight-umlRelation.getRelationEndClass().getUmlClassNormalHeight(); - float upperYLimit=originAbsoluteBottom+originAbsoluteLeft-endAbsoluteRight; + float lowerYLimit = originAbsoluteTop - originAbsoluteLeft + endAbsoluteRight - umlRelation.getRelationEndClass().getUmlClassNormalHeight(); + float upperYLimit = originAbsoluteBottom + originAbsoluteLeft - endAbsoluteRight; - absoluteXEnd=endAbsoluteRight; + absoluteXEnd = endAbsoluteRight; - absoluteYEnd=endAbsoluteBottom- - umlRelation.getRelationEndClass().getUmlClassNormalHeight()/(upperYLimit-lowerYLimit)* - (endAbsoluteTop-lowerYLimit); + absoluteYEnd = endAbsoluteBottom - + umlRelation.getRelationEndClass().getUmlClassNormalHeight() / (upperYLimit - lowerYLimit) * + (endAbsoluteTop - lowerYLimit); - absoluteXOrigin=originAbsoluteLeft; + absoluteXOrigin = originAbsoluteLeft; - absoluteYOrigin=originAbsoluteTop+ - umlRelation.getRelationOriginClass().getUmlClassNormalHeight()/(upperYLimit-lowerYLimit)* - (endAbsoluteTop-lowerYLimit); + absoluteYOrigin = originAbsoluteTop + + umlRelation.getRelationOriginClass().getUmlClassNormalHeight() / (upperYLimit - lowerYLimit) * + (endAbsoluteTop - lowerYLimit); } //End in East quarter of Origin if (umlRelation.getRelationEndClass().isEastOf(umlRelation.getRelationOriginClass())) { - float lowerYLimit=originAbsoluteTop-endAbsoluteLeft+originAbsoluteRight-umlRelation.getRelationEndClass().getUmlClassNormalHeight(); - float upperYLimit=originAbsoluteBottom+endAbsoluteLeft-originAbsoluteRight; + float lowerYLimit = originAbsoluteTop - endAbsoluteLeft + originAbsoluteRight - umlRelation.getRelationEndClass().getUmlClassNormalHeight(); + float upperYLimit = originAbsoluteBottom + endAbsoluteLeft - originAbsoluteRight; - absoluteXEnd=endAbsoluteLeft; + absoluteXEnd = endAbsoluteLeft; - absoluteYEnd=endAbsoluteBottom- - umlRelation.getRelationEndClass().getUmlClassNormalHeight()/(upperYLimit-lowerYLimit)* - (endAbsoluteTop-lowerYLimit); + absoluteYEnd = endAbsoluteBottom - + umlRelation.getRelationEndClass().getUmlClassNormalHeight() / (upperYLimit - lowerYLimit) * + (endAbsoluteTop - lowerYLimit); - absoluteXOrigin=originAbsoluteRight; + absoluteXOrigin = originAbsoluteRight; - absoluteYOrigin=originAbsoluteTop+ - umlRelation.getRelationOriginClass().getUmlClassNormalHeight()/(upperYLimit-lowerYLimit)* - (endAbsoluteTop-lowerYLimit); + absoluteYOrigin = originAbsoluteTop + + umlRelation.getRelationOriginClass().getUmlClassNormalHeight() / (upperYLimit - lowerYLimit) * + (endAbsoluteTop - lowerYLimit); } //update relation coordinates umlRelation.setXOrigin(absoluteXOrigin); @@ -411,13 +438,13 @@ private void drawRelation(Canvas canvas,UmlRelation umlRelation) { umlRelation.setXEnd(absoluteXEnd); umlRelation.setYEnd(absoluteYEnd); - Path path=new Path(); - path.moveTo(visibleX(absoluteXOrigin),visibleY(absoluteYOrigin)); - path.lineTo(visibleX(absoluteXEnd),visibleY(absoluteYEnd)); + Path path = new Path(); + path.moveTo(visibleX(absoluteXOrigin), visibleY(absoluteYOrigin)); + path.lineTo(visibleX(absoluteXEnd), visibleY(absoluteYEnd)); switch (umlRelation.getUmlRelationType()) { case INHERITANCE: - canvas.drawPath(path,linePaint); + canvas.drawPath(path, linePaint); drawSolidWhiteArrow(canvas, visibleX(absoluteXOrigin), visibleY(absoluteYOrigin), @@ -426,11 +453,11 @@ private void drawRelation(Canvas canvas,UmlRelation umlRelation) { break; case ASSOCIATION: - canvas.drawPath(path,linePaint); + canvas.drawPath(path, linePaint); break; case AGGREGATION: - canvas.drawPath(path,linePaint); + canvas.drawPath(path, linePaint); drawSolidWhiteRhombus(canvas, visibleX(absoluteXOrigin), visibleY(absoluteYOrigin), @@ -439,7 +466,7 @@ private void drawRelation(Canvas canvas,UmlRelation umlRelation) { break; case COMPOSITION: - canvas.drawPath(path,linePaint); + canvas.drawPath(path, linePaint); drawSolidBlackRhombus(canvas, visibleX(absoluteXOrigin), visibleY(absoluteYOrigin), @@ -448,7 +475,7 @@ private void drawRelation(Canvas canvas,UmlRelation umlRelation) { break; case DEPENDENCY: - canvas.drawPath(path,dashPaint); + canvas.drawPath(path, dashPaint); drawArrow(canvas, visibleX(absoluteXOrigin), visibleY(absoluteYOrigin), @@ -457,7 +484,7 @@ private void drawRelation(Canvas canvas,UmlRelation umlRelation) { break; case REALIZATION: - canvas.drawPath(path,dashPaint); + canvas.drawPath(path, dashPaint); drawSolidWhiteArrow(canvas, visibleX(absoluteXOrigin), visibleY(absoluteYOrigin), @@ -470,31 +497,31 @@ private void drawRelation(Canvas canvas,UmlRelation umlRelation) { } } - private void drawArrow(Canvas canvas,float xOrigin, float yOrigin, float xEnd, float yEnd) { + private void drawArrow(Canvas canvas, float xOrigin, float yOrigin, float xEnd, float yEnd) { //draw an arrow at the end of the segment canvas.save(); - canvas.rotate(getAngle(xEnd,yEnd,xOrigin,yOrigin),xEnd,yEnd); - Path path=new Path(); - path.moveTo(xEnd+ARROW_SIZE*mZoom,yEnd-ARROW_SIZE*1.414f/2f*mZoom); - path.lineTo(xEnd,yEnd); - path.lineTo(xEnd+ARROW_SIZE*mZoom,yEnd+ARROW_SIZE*1.414f/2f*mZoom); - canvas.drawPath(path,linePaint); + canvas.rotate(getAngle(xEnd, yEnd, xOrigin, yOrigin), xEnd, yEnd); + Path path = new Path(); + path.moveTo(xEnd + ARROW_SIZE * mZoom, yEnd - ARROW_SIZE * 1.414f / 2f * mZoom); + path.lineTo(xEnd, yEnd); + path.lineTo(xEnd + ARROW_SIZE * mZoom, yEnd + ARROW_SIZE * 1.414f / 2f * mZoom); + canvas.drawPath(path, linePaint); canvas.restore(); } - private void drawSolidWhiteArrow(Canvas canvas,float xOrigin, float yOrigin, float xEnd, float yEnd) { + private void drawSolidWhiteArrow(Canvas canvas, float xOrigin, float yOrigin, float xEnd, float yEnd) { //draw a solid white arrow at the end of the segment canvas.save(); - canvas.rotate(getAngle(xEnd,yEnd,xOrigin,yOrigin),xEnd,yEnd); - Path path=new Path(); - path.moveTo(xEnd,yEnd); - path.lineTo(xEnd+ARROW_SIZE*mZoom,yEnd-ARROW_SIZE*1.414f/2f*mZoom); - path.lineTo(xEnd+ARROW_SIZE*mZoom,yEnd+ARROW_SIZE*1.414f/2f*mZoom); + canvas.rotate(getAngle(xEnd, yEnd, xOrigin, yOrigin), xEnd, yEnd); + Path path = new Path(); + path.moveTo(xEnd, yEnd); + path.lineTo(xEnd + ARROW_SIZE * mZoom, yEnd - ARROW_SIZE * 1.414f / 2f * mZoom); + path.lineTo(xEnd + ARROW_SIZE * mZoom, yEnd + ARROW_SIZE * 1.414f / 2f * mZoom); path.close(); - canvas.drawPath(path,solidWhitePaint); - canvas.drawPath(path,linePaint); + canvas.drawPath(path, solidWhitePaint); + canvas.drawPath(path, linePaint); canvas.restore(); } @@ -502,15 +529,15 @@ private void drawSolidWhiteRhombus(Canvas canvas, float xOrigin, float yOrigin, //draw a solid white rhombus at the end of the segment canvas.save(); - canvas.rotate(getAngle(xEnd,yEnd,xOrigin,yOrigin),xEnd,yEnd); - Path path=new Path(); - path.moveTo(xEnd,yEnd); - path.lineTo(xEnd+ARROW_SIZE*mZoom,yEnd-ARROW_SIZE*1.414f/2f*mZoom); - path.lineTo(xEnd+ARROW_SIZE*2f*mZoom,yEnd); - path.lineTo(xEnd+ARROW_SIZE*mZoom,yEnd+ARROW_SIZE*1.414f/2f*mZoom); + canvas.rotate(getAngle(xEnd, yEnd, xOrigin, yOrigin), xEnd, yEnd); + Path path = new Path(); + path.moveTo(xEnd, yEnd); + path.lineTo(xEnd + ARROW_SIZE * mZoom, yEnd - ARROW_SIZE * 1.414f / 2f * mZoom); + path.lineTo(xEnd + ARROW_SIZE * 2f * mZoom, yEnd); + path.lineTo(xEnd + ARROW_SIZE * mZoom, yEnd + ARROW_SIZE * 1.414f / 2f * mZoom); path.close(); - canvas.drawPath(path,solidWhitePaint); - canvas.drawPath(path,linePaint); + canvas.drawPath(path, solidWhitePaint); + canvas.drawPath(path, linePaint); canvas.restore(); } @@ -518,14 +545,14 @@ private void drawSolidBlackRhombus(Canvas canvas, float xOrigin, float yOrigin, //draw a solid black rhombus at the end of the segment canvas.save(); - canvas.rotate(getAngle(xEnd,yEnd,xOrigin,yOrigin),xEnd,yEnd); - Path path=new Path(); - path.moveTo(xEnd,yEnd); - path.lineTo(xEnd+ARROW_SIZE*mZoom,yEnd-ARROW_SIZE*1.414f/2f*mZoom); - path.lineTo(xEnd+ARROW_SIZE*2f*mZoom,yEnd); - path.lineTo(xEnd+ARROW_SIZE*mZoom,yEnd+ARROW_SIZE*1.414f/2f*mZoom); + canvas.rotate(getAngle(xEnd, yEnd, xOrigin, yOrigin), xEnd, yEnd); + Path path = new Path(); + path.moveTo(xEnd, yEnd); + path.lineTo(xEnd + ARROW_SIZE * mZoom, yEnd - ARROW_SIZE * 1.414f / 2f * mZoom); + path.lineTo(xEnd + ARROW_SIZE * 2f * mZoom, yEnd); + path.lineTo(xEnd + ARROW_SIZE * mZoom, yEnd + ARROW_SIZE * 1.414f / 2f * mZoom); path.close(); - canvas.drawPath(path,solidBlackPaint); + canvas.drawPath(path, solidBlackPaint); canvas.restore(); } @@ -536,61 +563,61 @@ private void drawSolidBlackRhombus(Canvas canvas, float xOrigin, float yOrigin, @Override public boolean onTouch(View v, MotionEvent event) { - int action=event.getActionMasked(); + int action = event.getActionMasked(); switch (action) { case (MotionEvent.ACTION_DOWN): - mActionDownEventTime=event.getEventTime(); - mLastTouchX=event.getX(); - mLastTouchY=event.getY(); - mMovingClass=getTouchedClass(mLastTouchX,mLastTouchY); - mTouchMode=TouchMode.DRAG; - mPrimaryPointerIndex=0; + mActionDownEventTime = event.getEventTime(); + mLastTouchX = event.getX(); + mLastTouchY = event.getY(); + mMovingClass = getTouchedClass(mLastTouchX, mLastTouchY); + mTouchMode = TouchMode.DRAG; + mPrimaryPointerIndex = 0; break; case (MotionEvent.ACTION_POINTER_DOWN): - mOldDist=spacing(event); + mOldDist = spacing(event); calculateMidPoint(event); - mOldXMidPoint=mXMidPoint; - mOldYMidPoint=mYMidpoint; - if (mOldDist>10f) { + mOldXMidPoint = mXMidPoint; + mOldYMidPoint = mYMidpoint; + if (mOldDist > 10f) { mTouchMode = TouchMode.ZOOM; mMovingClass = null; } break; case (MotionEvent.ACTION_MOVE): - if (mTouchMode==TouchMode.DRAG) { + if (mTouchMode == TouchMode.DRAG) { if (mMovingClass == null) { mXOffset = mXOffset + event.getX() - mLastTouchX; mYOffset = mYOffset + event.getY() - mLastTouchY; } else { - mMovingClass.setUmlClassNormalXPos(mMovingClass.getUmlClassNormalXPos()+(event.getX()-mLastTouchX)/mZoom); - mMovingClass.setUmlClassNormalYPos(mMovingClass.getUmlClassNormalYPos()+(event.getY()-mLastTouchY)/mZoom); + mMovingClass.setUmlClassNormalXPos(mMovingClass.getUmlClassNormalXPos() + (event.getX() - mLastTouchX) / mZoom); + mMovingClass.setUmlClassNormalYPos(mMovingClass.getUmlClassNormalYPos() + (event.getY() - mLastTouchY) / mZoom); } - mLastTouchX=event.getX(); - mLastTouchY=event.getY(); + mLastTouchX = event.getX(); + mLastTouchY = event.getY(); } else if (mTouchMode == TouchMode.ZOOM) { - mNewDist=spacing(event); - mZoom=mZoom*mNewDist/mOldDist; + mNewDist = spacing(event); + mZoom = mZoom * mNewDist / mOldDist; calculateMidPoint(event); - mXOffset=mXMidPoint+(mXOffset-mOldXMidPoint)*mNewDist/mOldDist; - mYOffset=mYMidpoint+(mYOffset-mOldYMidPoint)*mNewDist/mOldDist; - mOldDist=mNewDist; - mOldXMidPoint=mXMidPoint; - mOldYMidPoint=mYMidpoint; + mXOffset = mXMidPoint + (mXOffset - mOldXMidPoint) * mNewDist / mOldDist; + mYOffset = mYMidpoint + (mYOffset - mOldYMidPoint) * mNewDist / mOldDist; + mOldDist = mNewDist; + mOldXMidPoint = mXMidPoint; + mOldYMidPoint = mYMidpoint; } break; - case(MotionEvent.ACTION_POINTER_UP): - mTouchMode=TouchMode.DRAG; + case (MotionEvent.ACTION_POINTER_UP): + mTouchMode = TouchMode.DRAG; if (event.getActionIndex() == mPrimaryPointerIndex) { - mPrimaryPointerIndex=(1+mPrimaryPointerIndex)%2; + mPrimaryPointerIndex = (1 + mPrimaryPointerIndex) % 2; } - mLastTouchX=event.getX(mPrimaryPointerIndex); - mLastTouchY=event.getY(mPrimaryPointerIndex); + mLastTouchX = event.getX(mPrimaryPointerIndex); + mLastTouchY = event.getY(mPrimaryPointerIndex); break; case (MotionEvent.ACTION_UP): @@ -598,20 +625,19 @@ public boolean onTouch(View v, MotionEvent event) { //double click if (event.getEventTime() - mActionDownEventTime <= CLICK_DELAY && event.getEventTime() - mFirstClickTime <= DOUBLE_CLICK_DELAY && - distance(mLastTouchX,mLastTouchY,mFirstClickX,mFirstClickY)<=DOUBLE_CLICK_DISTANCE_MAX) { + distance(mLastTouchX, mLastTouchY, mFirstClickX, mFirstClickY) <= DOUBLE_CLICK_DISTANCE_MAX) { if (getTouchedClass(mLastTouchX, mLastTouchY) != null) - mCallback.editClass(getTouchedClass(mLastTouchX,mLastTouchY)); - else if (getTouchedRelation(mLastTouchX,mLastTouchY)!=null) { - promptDeleteRelation(getTouchedRelation(mLastTouchX,mLastTouchY),this); - } - else adjustViewToProject(); + mCallback.editClass(getTouchedClass(mLastTouchX, mLastTouchY)); + else if (getTouchedRelation(mLastTouchX, mLastTouchY) != null) { + promptDeleteRelation(getTouchedRelation(mLastTouchX, mLastTouchY), this); + } else adjustViewToProject(); } //simple click - if (event.getEventTime()-mActionDownEventTime<=CLICK_DELAY) { + if (event.getEventTime() - mActionDownEventTime <= CLICK_DELAY) { mFirstClickTime = event.getEventTime(); - mFirstClickX=event.getX(); - mFirstClickY=event.getY(); + mFirstClickX = event.getX(); + mFirstClickY = event.getY(); //locate new class if (mGraphFragment.isExpectingTouchLocation()) { @@ -621,16 +647,16 @@ else if (getTouchedRelation(mLastTouchX,mLastTouchY)!=null) { //touch relation end class } else if (mGraphFragment.isExpectingEndClass() - && getTouchedClass(mLastTouchX,mLastTouchY)!=null - && getTouchedClass(mLastTouchX,mLastTouchY)!=mGraphFragment.getStartClass()) { - mGraphFragment.setEndClass(getTouchedClass(mLastTouchX,mLastTouchY)); + && getTouchedClass(mLastTouchX, mLastTouchY) != null + && getTouchedClass(mLastTouchX, mLastTouchY) != mGraphFragment.getStartClass()) { + mGraphFragment.setEndClass(getTouchedClass(mLastTouchX, mLastTouchY)); mGraphFragment.setExpectingEndClass(false); mGraphFragment.clearPrompt(); - mCallback.createRelation(mGraphFragment.getStartClass(),mGraphFragment.getEndClass(),mGraphFragment.getUmlRelationType()); + mCallback.createRelation(mGraphFragment.getStartClass(), mGraphFragment.getEndClass(), mGraphFragment.getUmlRelationType()); //touch relation origin class } else if (mGraphFragment.isExpectingStartClass() && getTouchedClass(mLastTouchX, mLastTouchY) != null) { - mGraphFragment.setStartClass(getTouchedClass(mLastTouchX,mLastTouchY)); + mGraphFragment.setStartClass(getTouchedClass(mLastTouchX, mLastTouchY)); mGraphFragment.setExpectingStartClass(false); mGraphFragment.setExpectingEndClass(true); mGraphFragment.setPrompt("Choose end class"); @@ -651,24 +677,23 @@ && getTouchedClass(mLastTouchX,mLastTouchY)!=mGraphFragment.getStartClass()) { // ********************************************************************************************** private void createCallbackToParentActivity() { - mCallback=(GraphViewObserver)this.getContext(); + mCallback = (GraphViewObserver) this.getContext(); } - // ********************************************************************************************** // Calculation methods // ********************************************************************************************** private float spacing(MotionEvent event) { - float dx=event.getX(0)-event.getX(1); - float dy=event.getY(0)-event.getY(1); - return (float) Math.sqrt(dx*dx+dy*dy); + float dx = event.getX(0) - event.getX(1); + float dy = event.getY(0) - event.getY(1); + return (float) Math.sqrt(dx * dx + dy * dy); } private void calculateMidPoint(MotionEvent event) { - mXMidPoint=(event.getX(0)+event.getX(1))/2; - mYMidpoint=(event.getY(0)+event.getY(1))/2; + mXMidPoint = (event.getX(0) + event.getX(1)) / 2; + mYMidpoint = (event.getY(0) + event.getY(1)) / 2; } private void updateUmlClassNormalDimensions(UmlClass umlClass) { @@ -679,16 +704,19 @@ private void updateUmlClassNormalDimensions(UmlClass umlClass) { // umlClass.setUmlClassNormalHeight(INTERLINE*3f+(FONT_SIZE+INTERLINE)*(1f+umlClass.getAttributeList().size()+umlClass.getMethodList().size())); switch (umlClass.getUmlClassType()) { case ENUM: - umlClass.setUmlClassNormalWidth(Math.max(getClassHeaderNormalWidth(umlClass),getValueBoxNormalWidth(umlClass))); - umlClass.setUmlClassNormalHeight(getClassHeaderNormalHeight(umlClass)+getValueBoxNormalHeight(umlClass)); + umlClass.setUmlClassNormalWidth(Math.max(getClassHeaderNormalWidth(umlClass), getValueBoxNormalWidth(umlClass))); + umlClass.setUmlClassNormalHeight(getClassHeaderNormalHeight(umlClass) + getValueBoxNormalHeight(umlClass)); break; default: - float currentWidth=0; - if (getClassHeaderNormalWidth(umlClass)>currentWidth) currentWidth=getClassHeaderNormalWidth(umlClass); - if (getAttributeBoxNormalWidth(umlClass)>currentWidth) currentWidth=getAttributeBoxNormalWidth(umlClass); - if (getMethodBoxNormalWidth(umlClass)>currentWidth) currentWidth=getMethodBoxNormalWidth(umlClass); + float currentWidth = 0; + if (getClassHeaderNormalWidth(umlClass) > currentWidth) + currentWidth = getClassHeaderNormalWidth(umlClass); + if (getAttributeBoxNormalWidth(umlClass) > currentWidth) + currentWidth = getAttributeBoxNormalWidth(umlClass); + if (getMethodBoxNormalWidth(umlClass) > currentWidth) + currentWidth = getMethodBoxNormalWidth(umlClass); umlClass.setUmlClassNormalWidth(currentWidth); - umlClass.setUmlClassNormalHeight(getClassHeaderNormalHeight(umlClass)+getAttributeBoxNormalHeight(umlClass)+getMethodBoxNormalHeight(umlClass)); + umlClass.setUmlClassNormalHeight(getClassHeaderNormalHeight(umlClass) + getAttributeBoxNormalHeight(umlClass) + getMethodBoxNormalHeight(umlClass)); break; } } @@ -699,131 +727,134 @@ private float getClassHeaderNormalWidth(UmlClass umlClass) { case INTERFACE: return Math.max(getTextNormalWidth("<< Interface >>"), getTextNormalWidth(umlClass.getName())) + 2 * INTERLINE; default: - return getTextNormalWidth(umlClass.getName())+2*INTERLINE; + return getTextNormalWidth(umlClass.getName()) + 2 * INTERLINE; } } private float getClassHeaderNormalHeight(UmlClass umlClass) { switch (umlClass.getUmlClassType()) { case INTERFACE: - return FONT_SIZE*2+3*INTERLINE; + return FONT_SIZE * 2 + 3 * INTERLINE; default: - return FONT_SIZE+2*INTERLINE; + return FONT_SIZE + 2 * INTERLINE; } } private float getAttributeBoxNormalWidth(UmlClass umlClass) { - float currentWidth=0; - for (UmlClassAttribute a:umlClass.getAttributes()) - if (getTextNormalWidth(a.getAttributeCompleteString())>currentWidth) - currentWidth=getTextNormalWidth(a.getAttributeCompleteString()); + float currentWidth = 0; + for (UmlClassAttribute a : umlClass.getAttributes()) + if (getTextNormalWidth(a.getAttributeCompleteString()) > currentWidth) + currentWidth = getTextNormalWidth(a.getAttributeCompleteString()); - return currentWidth+2*INTERLINE; + return currentWidth + 2 * INTERLINE; } private float getAttributeBoxNormalHeight(UmlClass umlClass) { - return umlClass.getAttributes().size()*FONT_SIZE+(umlClass.getAttributes().size()+1)*INTERLINE; + return umlClass.getAttributes().size() * FONT_SIZE + (umlClass.getAttributes().size() + 1) * INTERLINE; } private float getMethodBoxNormalWidth(UmlClass umlClass) { - float currentWidth=0; - for (UmlClassMethod m:umlClass.getMethods()) - if (getTextNormalWidth(m.getMethodCompleteString())>currentWidth) - currentWidth=getTextNormalWidth(m.getMethodCompleteString()); + float currentWidth = 0; + for (UmlClassMethod m : umlClass.getMethods()) + if (getTextNormalWidth(m.getMethodCompleteString()) > currentWidth) + currentWidth = getTextNormalWidth(m.getMethodCompleteString()); - return currentWidth+2*INTERLINE; + return currentWidth + 2 * INTERLINE; } private float getMethodBoxNormalHeight(UmlClass umlClass) { - return umlClass.getMethods().size()*FONT_SIZE+(umlClass.getMethods().size()+1)*INTERLINE; + return umlClass.getMethods().size() * FONT_SIZE + (umlClass.getMethods().size() + 1) * INTERLINE; } private float getValueBoxNormalWidth(UmlClass umlClass) { - float currentWidth=0; - for (UmlEnumValue v:umlClass.getValues()) - if (getTextNormalWidth(v.getName())>currentWidth) - currentWidth=getTextNormalWidth(v.getName()); + float currentWidth = 0; + for (UmlEnumValue v : umlClass.getValues()) + if (getTextNormalWidth(v.getName()) > currentWidth) + currentWidth = getTextNormalWidth(v.getName()); - return currentWidth+2*INTERLINE; + return currentWidth + 2 * INTERLINE; } private float getValueBoxNormalHeight(UmlClass umlClass) { - return umlClass.getValues().size()*FONT_SIZE+(umlClass.getValues().size()+1)*INTERLINE; + return umlClass.getValues().size() * FONT_SIZE + (umlClass.getValues().size() + 1) * INTERLINE; } private float getTextNormalWidth(String text) { - plainTextPaint.setTextSize(FONT_SIZE*mZoom); - return plainTextPaint.measureText(text)/mZoom; + plainTextPaint.setTextSize(FONT_SIZE * mZoom); + return plainTextPaint.measureText(text) / mZoom; } private float getAngle(float xOrigin, float yOrigin, float xEnd, float yEnd) { //calculate angle between segment and horizontal - return (float)(Math.copySign(Math.abs(Math.acos((xEnd-xOrigin)/Math.sqrt((xEnd-xOrigin)*(xEnd-xOrigin)+(yEnd-yOrigin)*(yEnd-yOrigin)))),yEnd-yOrigin)/ - Math.PI*180f); + return (float) (Math.copySign(Math.abs(Math.acos((xEnd - xOrigin) / Math.sqrt((xEnd - xOrigin) * (xEnd - xOrigin) + (yEnd - yOrigin) * (yEnd - yOrigin)))), yEnd - yOrigin) / + Math.PI * 180f); } private float getAbsoluteProjectWidth() { //return the length of the rectangle that can contain all the project - float minX=1000000; - float maxX=-1000000; + float minX = 1000000; + float maxX = -1000000; for (UmlClass c : mUmlProject.getUmlClasses()) { - minX=Math.min(c.getUmlClassNormalXPos(),minX); - maxX=Math.max(c.getNormalRightEnd(),maxX); + minX = Math.min(c.getUmlClassNormalXPos(), minX); + maxX = Math.max(c.getNormalRightEnd(), maxX); } - return maxX-minX; + return maxX - minX; } private float getAbsoluteProjectHeight() { //return the height of the rectangle that can contain all the project - float minY=1000000; - float maxY=-1000000; + float minY = 1000000; + float maxY = -1000000; for (UmlClass c : mUmlProject.getUmlClasses()) { - minY=Math.min(c.getUmlClassNormalYPos(),minY); - maxY=Math.max(c.getNormalBottomEnd(),maxY); + minY = Math.min(c.getUmlClassNormalYPos(), minY); + maxY = Math.max(c.getNormalBottomEnd(), maxY); } - return maxY-minY; + return maxY - minY; } private float getAbsoluteProjectLeft() { - float minX=1000000; - for (UmlClass c : mUmlProject.getUmlClasses()) minX=Math.min(c.getUmlClassNormalXPos(),minX); + float minX = 1000000; + for (UmlClass c : mUmlProject.getUmlClasses()) + minX = Math.min(c.getUmlClassNormalXPos(), minX); return minX; } private float getAbsoluteProjectRight() { - float maxX=-1000000; - for (UmlClass c : mUmlProject.getUmlClasses()) maxX=Math.max(c.getNormalRightEnd(),maxX); + float maxX = -1000000; + for (UmlClass c : mUmlProject.getUmlClasses()) maxX = Math.max(c.getNormalRightEnd(), maxX); return maxX; } private float getAbsoluteProjectTop() { - float minY=1000000; - for (UmlClass c : mUmlProject.getUmlClasses()) minY=Math.min(c.getUmlClassNormalYPos(),minY); + float minY = 1000000; + for (UmlClass c : mUmlProject.getUmlClasses()) + minY = Math.min(c.getUmlClassNormalYPos(), minY); return minY; } private float getAbsoluteProjectBottom() { - float maxY=-1000000; - for (UmlClass c : mUmlProject.getUmlClasses()) maxY=Math.max(c.getNormalBottomEnd(),maxY); + float maxY = -1000000; + for (UmlClass c : mUmlProject.getUmlClasses()) + maxY = Math.max(c.getNormalBottomEnd(), maxY); return maxY; } private void adjustViewToProject() { - float xZoom=this.getMeasuredWidth()/getAbsoluteProjectWidth(); - float yZoom=this.getMeasuredHeight()/getAbsoluteProjectHeight(); + float xZoom = this.getMeasuredWidth() / getAbsoluteProjectWidth(); + float yZoom = this.getMeasuredHeight() / getAbsoluteProjectHeight(); if (xZoom <= yZoom) { mZoom = xZoom; - mXOffset=-getAbsoluteProjectLeft()*mZoom; - mYOffset =-getAbsoluteProjectTop()*mZoom+(this.getMeasuredHeight()-getAbsoluteProjectHeight()*mZoom)/2f; + mXOffset = -getAbsoluteProjectLeft() * mZoom; + mYOffset = -getAbsoluteProjectTop() * mZoom + (this.getMeasuredHeight() - getAbsoluteProjectHeight() * mZoom) / 2f; } else { - mZoom=yZoom; - mYOffset=-getAbsoluteProjectTop()*mZoom; - mXOffset=-getAbsoluteProjectLeft()*mZoom+(this.getMeasuredWidth()-getAbsoluteProjectWidth()*mZoom)/2f; + mZoom = yZoom; + mYOffset = -getAbsoluteProjectTop() * mZoom; + mXOffset = -getAbsoluteProjectLeft() * mZoom + (this.getMeasuredWidth() - getAbsoluteProjectWidth() * mZoom) / 2f; } this.invalidate(); } @@ -835,19 +866,19 @@ private void adjustViewToProject() { // ********************************************************************************************** private float visibleX(float absoluteX) { - return mXOffset+mZoom*absoluteX; + return mXOffset + mZoom * absoluteX; } private float visibleY(float absoluteY) { - return mYOffset+mZoom*absoluteY; + return mYOffset + mZoom * absoluteY; } private float absoluteX(float visibleX) { - return (visibleX-mXOffset)/mZoom; + return (visibleX - mXOffset) / mZoom; } private float absoluteY(float visibleY) { - return (visibleY-mYOffset)/mZoom; + return (visibleY - mYOffset) / mZoom; } // ********************************************************************************************** @@ -856,7 +887,7 @@ private float absoluteY(float visibleY) { private UmlClass getTouchedClass(float visibleX, float visibleY) { - for (UmlClass c:mUmlProject.getUmlClasses()) { + for (UmlClass c : mUmlProject.getUmlClasses()) { if (c.containsPoint(absoluteX(visibleX), absoluteY(visibleY))) return c; } @@ -865,11 +896,11 @@ private UmlClass getTouchedClass(float visibleX, float visibleY) { public UmlRelation getTouchedRelation(float visibleX, float visibleY) { for (UmlRelation r : mUmlProject.getUmlRelations()) { - if (distance(absoluteX(visibleX),absoluteY(visibleY),r.getXOrigin(),r.getYOrigin(),r.getXEnd(),r.getYEnd())<=20 - && absoluteX(visibleX)>=Math.min(r.getXOrigin(),r.getXEnd())-20 - && absoluteX(visibleX)<=Math.max(r.getXOrigin(),r.getXEnd())+20 - && absoluteY(visibleY)>=Math.min(r.getYOrigin(),r.getYEnd())-20 - && absoluteY(visibleY)<=Math.max(r.getYOrigin(),r.getYEnd())+20) + if (distance(absoluteX(visibleX), absoluteY(visibleY), r.getXOrigin(), r.getYOrigin(), r.getXEnd(), r.getYEnd()) <= 20 + && absoluteX(visibleX) >= Math.min(r.getXOrigin(), r.getXEnd()) - 20 + && absoluteX(visibleX) <= Math.max(r.getXOrigin(), r.getXEnd()) + 20 + && absoluteY(visibleY) >= Math.min(r.getYOrigin(), r.getYEnd()) - 20 + && absoluteY(visibleY) <= Math.max(r.getYOrigin(), r.getYEnd()) + 20) return r; } return null; @@ -883,22 +914,22 @@ private float distance(float dotX, float dotY, float originX, float originY, flo float uY; if (originX == endX) { - uX=0; - uY=1; + uX = 0; + uY = 1; } else if (originY == endY) { uX = 1; uY = 0; } else { uX = (float) (1f / Math.sqrt(1f + (endX - originX) * (endX - originX) / (endY - originY) / (endY - originY))); - uY= (float) ((originX-endX)/(endY-originY)/Math.sqrt(1f + (endX - originX) * (endX - originX) / (endY - originY) / (endY - originY))); + uY = (float) ((originX - endX) / (endY - originY) / Math.sqrt(1f + (endX - originX) * (endX - originX) / (endY - originY) / (endY - originY))); } - return Math.abs((dotX-originX)*uX+(dotY-originY)*uY); + return Math.abs((dotX - originX) * uX + (dotY - originY) * uY); } private float distance(float X1, float Y1, float X2, float Y2) { //calculate the distance between two points M1(X1,Y1) and M2(X2,Y2) - return (float) Math.sqrt((X1-X2)*(X1-X2)+(Y1-Y2)*(Y1-Y2)); + return (float) Math.sqrt((X1 - X2) * (X1 - X2) + (Y1 - Y2) * (Y1 - Y2)); } private void updateProjectGeometricalParameters() { @@ -907,27 +938,17 @@ private void updateProjectGeometricalParameters() { mUmlProject.setYOffset(mYOffset); } -// ********************************************************************************************** + // ********************************************************************************************** // Interaction methods // ********************************************************************************************** private void promptDeleteRelation(final UmlRelation umlRelation, final View view) { - AlertDialog.Builder builder=new AlertDialog.Builder(getContext()); - builder.setTitle("Delete relation") + new MaterialAlertDialogBuilder(getContext()) + .setTitle("Delete relation") .setMessage("Are you sure you want to delete this relation ?") - .setNegativeButton("NO", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - - } - }) - .setPositiveButton("YES", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - mUmlProject.removeUmlRelation(umlRelation); - view.invalidate(); - } - }); - AlertDialog dialog=builder.create(); - dialog.show(); + .setNegativeButton("NO", (d, which) -> d.dismiss()) + .setPositiveButton("YES", (d, which) -> { + mUmlProject.removeUmlRelation(umlRelation); + view.invalidate(); + }).show(); } } diff --git a/app/src/main/res/drawable/ic_add.xml b/app/src/main/res/drawable/ic_add.xml new file mode 100644 index 0000000..89633bb --- /dev/null +++ b/app/src/main/res/drawable/ic_add.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_cancel.xml b/app/src/main/res/drawable/ic_cancel.xml new file mode 100644 index 0000000..a0a94e3 --- /dev/null +++ b/app/src/main/res/drawable/ic_cancel.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_check.xml b/app/src/main/res/drawable/ic_check.xml new file mode 100644 index 0000000..cf143d4 --- /dev/null +++ b/app/src/main/res/drawable/ic_check.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_create_new_folder.xml b/app/src/main/res/drawable/ic_create_new_folder.xml new file mode 100644 index 0000000..a0bb1a6 --- /dev/null +++ b/app/src/main/res/drawable/ic_create_new_folder.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml new file mode 100644 index 0000000..a0c03a9 --- /dev/null +++ b/app/src/main/res/drawable/ic_delete.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_export.xml b/app/src/main/res/drawable/ic_export.xml new file mode 100644 index 0000000..9341558 --- /dev/null +++ b/app/src/main/res/drawable/ic_export.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_folder_copy.xml b/app/src/main/res/drawable/ic_folder_copy.xml new file mode 100644 index 0000000..c30565e --- /dev/null +++ b/app/src/main/res/drawable/ic_folder_copy.xml @@ -0,0 +1,6 @@ + + + + diff --git a/app/src/main/res/drawable/ic_help.xml b/app/src/main/res/drawable/ic_help.xml new file mode 100644 index 0000000..0028ebd --- /dev/null +++ b/app/src/main/res/drawable/ic_help.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_import.xml b/app/src/main/res/drawable/ic_import.xml new file mode 100644 index 0000000..a4ab511 --- /dev/null +++ b/app/src/main/res/drawable/ic_import.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_merge.xml b/app/src/main/res/drawable/ic_merge.xml new file mode 100644 index 0000000..f41d9c7 --- /dev/null +++ b/app/src/main/res/drawable/ic_merge.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_save.xml b/app/src/main/res/drawable/ic_save.xml new file mode 100644 index 0000000..82070aa --- /dev/null +++ b/app/src/main/res/drawable/ic_save.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/new_class_locate_layout.xml b/app/src/main/res/drawable/new_class_locate_layout.xml new file mode 100644 index 0000000..95b9238 --- /dev/null +++ b/app/src/main/res/drawable/new_class_locate_layout.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 7055a8e..83857a2 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -5,13 +5,19 @@ android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical"> - - + android:layout_height="wrap_content"> + + + + - - - - - - - - - - + + - + + - + + - - - - - - - - - - - - + + - + + + + + + + + + - + + + + + + - + android:layout_toRightOf="@id/attribute_type_text" /> - - - - - -